MuJoCo 里的一个人形机器人,在 0.5 m/s 的速度目标下小跑。同一套 PPO 训练配置,一份策略的关节加速度是 423.8,另一份是 171.4。看视频,前者动作幅度大、蹬地有力,后者膝盖弯得少、步幅收着走。如果你把这两段视频丢给 GPT-4o 打个「动作好不好看」的分,分数会告诉你前者更好——这是 arXiv:2611.07679v1 这篇论文实测出来的结论,四个主流视觉语言模型都这么打,平均皮尔逊相关系数 +0.66。

问题就在这里:在机器人身上,「好看」和「好跑」不是一回事,甚至是反的。关节加速度高意味着执行器磨损快、能耗高、底层伺服更难跟住轨迹;但训练一个运动策略时,如果没有显式的平滑目标,策略几乎总会学出又抖又费电的步态。这篇论文的出发点非常朴素:既然视觉语言模型(VLM)能不打特征工程就给出一个「动作质量」分,那能不能拿它当平滑奖励用?

作者先证伪了这条路,再给出一个工程化的替代方案:把美学奖励和物理奖励拆成两条独立通道,各管各的,谁也别替谁。下面顺着这条线讲:两条通道各自的奖励怎么定义、怎么组合、训练怎么跑、在哪些设置下有效、在哪些设置下彻底失效,以及最关键的——好看和好跑到底能不能两全。

图 1
图 1|论文首页的三块摘要图:左边是同一速度目标下两种策略的关节加速度对比,中间是两条奖励通道的结构,右边是 VLM 调用成本与消融结果。

一分钟速览

一句话版本

PhySA 把奖励拆成「稀疏异步的 VLM 美学分」和「阶段触发的物理平滑权重编辑」两条互不共享奖励项的通道,实验结论是平滑增益全部来自物理通道,VLM 通道单独使用会把关节加速度推高 136%,而两者组合之后 VLM 通道的影响在统计上测不出来。

八个关键数字

  • 四个生产级 VLM 上,关节抖动与美学分的相关系数是 +0.66(范围 +0.49 到 +0.82),抖得越厉害分越高。
  • 单跑一条 10M 步训练链,关节加速度从 Prompt2Policy 的 423.8 降到 171.4,降幅 59.5%;同一链条上每步机械功率降 43.1%,回合长度反而长 57.3%。
  • 从零复现三个种子,同样的对比只剩 7.2%,p=0.45,不显著。作者自己在摘要里写了这一点。
  • 与 vanilla PPO 比,关节加速度是 1054.4 对 171.4,差 6.16 倍;95 分位是 1791.5 对 468.2,差 3.82 倍。
  • 在 2.6M 步的等步数对比里,PhySA 是 693,PPO 933、Text2Reward 944、Eureka 1015;代价是回合长度 73.7 对 126.9、116.4、186.2。
  • 消融:只开 VLM 通道,抖动 +136%;只开校正模块,抖动 −29.8%;两条一起上,−59.5%。
  • VLM 通道的开销是每 10M 步 0.85 美元,同步逐更新打分的方案要 1220 次调用,PhySA 是 50 次,差 24 倍。
  • 换到 IsaacLab 后平滑增益是 −1.0%(p=0.91);换到 Unitree G1 后是 −1.7%(不显著),38 组超参搜索最好也只到 −4.8%。

这篇论文最反直觉的一句

不要把 VLM 的美学分当成物理平滑的代理。这不是「效果差一点」的问题,是梯度方向反了的问题:你奖励它,它会往抖动更大的方向走。

让动作好看会不会牺牲物理可行性

抖动贵在哪里

在仿真里,「抖」只是一个数字;在硬件上它是一串账单。关节速度高会加速执行器磨损,机械功率是力矩与角速度的乘积,角速度上去功率就上去;更麻烦的是底层伺服,它要在很短的周期里跟踪一条高频变化的轨迹,跟踪误差会直接变成足端打滑和落地冲击。论文开篇列了四条后果:执行器磨损、能耗上升、轨迹难以被底层控制器忠实跟踪,以及由此带来的稳定性问题。

所以平滑不是一个审美偏好,而是部署前的硬指标。但把它写进奖励函数并不轻松:平滑项系数给大了,训练早期策略还没学会站就先被按住了,容易直接崩;给小了,||q̈||₂ 根本压不住。这个「大也不行小也不行」的区间,是后面所有方法要绕开的坑。

VLM 当裁判,诱惑在哪里

给定一段渲染出来的 rollout 视频,VLM 返回一个 0 到 10 的连续分数,不需要任何任务专属的特征工程。对人形机器人这种「步态质量很难用几个标量说清」的问题,这看起来很划算:膝盖屈伸的时机、摆腿的对称性、质心轨迹的平稳程度,这些量要么难写、要么写了一堆权重还是要调。

已有工作已经这么干了。Prompt2Policy 在每个策略更新时查询 GPT-4 级别的模型,把分数直接并进每步奖励;LIV 和 RoboCLIP 走的是另一条路,把 rollout 帧投影到视觉语言联合空间算稠密塑形奖励。这些方法关心的是任务完成与目标对齐,没有人盯着物理平滑。

三条旧路,卡在同一个地方

论文把相关工作归成三类,每一类都有自己的死结。

第一类是同步 VLM 奖励。每个更新查一次模型,训练循环被阻塞,API 成本与训练长度成正比;按论文的估算,10M 步大约要 1220 次调用。更根本的问题是,它把「外观」当成了唯一被监督的信号。

第二类是 LLM 合成奖励。Eureka 用迭代提示让大模型写奖励代码,多轮评估后选出最好的一份;Text2Reward 是单次合成。两者的共同缺陷是结构在训练开始前就冻住了:代码写完之后,策略在训练中冒出来的新失败模式,奖励函数看不见。

第三类是平滑正则。动作速率惩罚、梯度手术投影、多目标 Pareto 加权、模仿学习的运动先验,都在训练前把结构定死。定得太早,早期训练不稳;定得太晚,已经养成的高抖动步态很难再掰回来。

作者对固定惩罚的批评有一个很具体的实验支撑。图 2 里那个「陷阱奖励」是 5.0|a| + 3.0|Δa|,看起来是标准的动作幅度加动作变化率惩罚。结果策略在 t=2.16 s 摔倒,而被修正过的策略跑完了整段。有意思的是两者的动作幅度几乎一样(0.337 对 0.339),差别在动作转移的突变上——也就是说,惩罚项写对了方向,却没写对「什么时候该压、压哪个关节」。

图 2
图 2|陷阱奖励与修正后奖励的对比:左边两条曲线的动作幅度几乎重合,中间的关节抖动曲线在 2 秒后分叉,右侧关键帧显示陷阱策略在 2.10 秒已经前倾失衡。

这也解释了为什么作者不打算再调一个更好的固定权重,而是把权重本身变成训练过程中被编辑的对象。这是全文方法论上的分水岭:不是找一个更好的常数,而是让常数随训练阶段变。

两条通道的分工

维度美学通道物理通道
信号来源渲染视频,GPT-4o 打分仿真器状态,关节加速度
更新频率每 200k 步一次,共 50 次每个 2.5M 步阶段边界,共 4 次
是否阻塞训练否,后台线程否,只在边界读日志
单步是否依赖状态不依赖,区间内是常数不直接产生每步奖励,改的是权重
影响路径改变「活下去值多少」改变各惩罚项的系数
单独使用时抖动 +136%抖动 −29.8%

这张表值得盯着看两分钟,因为它是整篇论文的骨架:两条通道在时间尺度上差三个数量级,在作用机制上也完全不同。后面所有「为什么组合起来 VLM 就没用了」的问题,答案都在这张表里。

先证伪:好看和好跑在数据上反着走

四个模型,同一个方向

作者拿了四个生产级 VLM:GPT-4o-2024-05-13、GPT-4o-2024-11-20、Claude Sonnet 4.6、Gemini 2.5 Pro。每个模型评 99 到 100 对片段,片段来自两个训练条件(PhySA 校正模块的检查点,平均抖动约 264;Prompt2Policy,平均抖动约 377)。

评估模型样本数皮尔逊 r斯皮尔曼 ρ
GPT-4o-2024-05-13100+0.82+0.77
GPT-4o-2024-11-20100+0.49+0.67
Claude Sonnet 4.6100+0.63+0.65
Gemini 2.5 Pro99+0.71+0.71
平均—+0.66+0.70

四个模型全部为正,没有一个例外。作者还补了一个 LLaVA-NeXT-Interleave 的初步检查,方向一致。这不是某个模型的怪癖,而是这一类模型从人类视频里学到的共同先验。

为什么反:单帧里没有加速度

这是全文最漂亮的一句解释:一张静止的画面里不存在加速度这个量。VLM 看到的是一帧一帧的姿态,它对「努力程度」的理解继承自人类视频——在人类运动视频里,大幅度、有力的肢体动作读作自信和目的性,而小幅、平滑的动作读作僵硬或犹豫。

所以当策略学会「大幅度摆动」时,VLM 给高分;而这个大幅度摆动恰恰对应高关节加速度。两边的偏好来自两套完全不同的证据:一边是像素里的姿态,一边是状态里的二阶导数。

这个解释还顺带说明了为什么不能简单地把两个信号混成一个标量:只有外观信号是真的被 VLM 监督过的,一旦混在一起,外观项会在梯度里占主导,物理项变成一个没人管的常数。

一个容易被忽略的细节:评分者之间也不一致

论文在这里做了一件很老实的事。它同时报了两个层级的一致性:条件级和单条级。

条件级上,四个模型两两之间的斯皮尔曼相关是 +0.49 到 +0.94,平均 +0.76,算相当一致——大家都认为「抖动大的那个条件更好看」。但到了单条片段级,Krippendorff 的 α 只有 −0.008(质心跟踪子分是 0.183),基本等于没有一致性。

原因论文也写了:每个片段在每个模型上只评一次,评分者信度的有效样本量是 1,不是 8。这个细节对做工程的人很重要——VLM 分数可以拿来比较两个训练条件谁更好,但不能给单条轨迹排名,更不能做逐条的重要性加权。

PhySA 把奖励拆成两条通道

总奖励的四个加数

图 3
图 3|整体结构:左边是 PPO 与环境交互的 rollout 循环,中间上方是异步美学通道、下方是阶段触发的校正通道,右边是奖励合成与梯度更新,底部是 10M 步的训练时间线。

每步奖励写成四项相加:

rtotal(t)=rtask(t)+α rVLM(t)+rphys(t)+rGMP(t) r_{\mathrm{total}}(t) = r_{\mathrm{task}}(t) + \alpha\, r_{\mathrm{VLM}}(t) \qquad + r_{\mathrm{phys}}(t) + r_{\mathrm{GMP}}(t) rtotal​(t)=rtask​(t)+αrVLM​(t)+rphys​(t)+rGMP​(t)

r_task 是手工写的运动奖励,包括 0.5 m/s 的高斯速度跟踪、与躯干高度绑定的存活奖励、二次高度惩罚、L2 执行器代价。r_VLM 是美学通道,r_phys 是物理校正通道,r_GMP 是拟合到动捕数据的高斯运动先验。

这里有一个容易被跳过的设计决定:r_task 是从 Prompt2Policy 原样搬过来的,一个字没改。这意味着 PhySA 和主基线之间的任何步态差异,只能来自新增的两条通道,而不是任务奖励的调参。对一篇讲奖励工程的论文来说,这个控制变量做得很干净。

r_GMP 也值得单独说一句。它是逐条动捕类别(慢走、上楼梯等八类)拟合出来的高斯混合,分量数 2 到 6,协方差用 full,在五个消融格子里作为一项被剔除。它在这篇论文里的角色不是主角,而是「别让步态跑出自然人形范围」的兜底。

美学通道:稀疏、异步、只回答「像不像」

美学通道的工程参数很具体:每 200k 环境步,训练器渲染一段 12 帧、0.4 秒、30 fps 的单视角 MP4,通过 ThreadPoolExecutor 把打分请求丢到后台线程,调用 GPT-4o-2024-05-13,temperature=0、seed=42。提示词要求模型在三个子轴上打分——膝盖使用、摆腿对称性、质心跟踪——再给一个总体分,只有总体分进奖励。

分数进来之后先做指数滑动平均:

vlmema(t)=0.8 vlmema(t−1)+0.2 st \mathrm{vlm}^{(t)}_{\mathrm{ema}} = 0.8\,\mathrm{vlm}^{(t-1)}_{\mathrm{ema}} + 0.2\, s_t vlmema(t)​=0.8vlmema(t−1)​+0.2st​

rVLM=vlmema/10−0.5∈[−0.5, +0.5] r_{\mathrm{VLM}} = \mathrm{vlm}_{\mathrm{ema}}/10 - 0.5 \in [-0.5,\ +0.5] rVLM​=vlmema​/10−0.5∈[−0.5, +0.5]

也就是说,EMA 系数取 0.2,分数被线性映射到 −0.5 到 +0.5 的区间,再乘以外层权重 alpha(全文固定 0.5)。每 200k 步一次查询,10M 步正好 50 次。按作者的说法,这个频率是为了让 EMA 收敛,同时把 API 花费压在 1 美元以内。

但这条通道有一个作者自己写明的硬限制,也是理解全文结论的钥匙:r_VLM 每 200k 步才更新一次,更新之后原封不动加到区间内的每一步上,所以它不依赖当前状态,也不依赖当前动作。一个 6 分在接下来 200k 步里给每一步同样的 +0.05,不管机器人当时是什么姿态。

在 Humanoid-v5 的终止规则下,一个常数形式的每步奖励只能改变策略对「存活」的估值,效果等同于调存活奖励,它没办法奖励某个具体姿态或某种步态。作者把这句话放在方法节里,等于提前承认了这条通道在组合栈里不可能有多大作为——后面 4.3 节的消融只是把这个预言验证了一遍。

物理通道:阶段边界上改权重

物理通道不做每步奖励,它改的是惩罚项的系数。训练被切成四个连续的 2.5M 步阶段,每个阶段从上一个检查点热启动。每到阶段边界,一个判据读最近 30 行 PPO 日志,算三个量的变化:稳定性、能效、回合平均奖励。

触发条件有两条:某个轴回退且没有在别的轴上得到补偿(稳定性变化小于 −0.04),或者三个轴同时停滞(没有任何指标改善超过 +0.01)。触发之后,模块先判一个「弱轴」标签,取值是 knee、swing、com、none,再按标签做定点编辑:

  • 判为膝盖问题,就抬高两个膝盖索引(ctrl cost 的第 6 和第 10 个)上的 L2 执行器代价。
  • 判为质心问题,就把直立平衡惩罚清零。
  • 判为摆腿问题,就删掉那条非对称摆动惩罚项,而不是去动关节代价。
  • 判为 none,就什么都不改,当前奖励结构冻结一整个阶段。

在论文的两条生产训练链上,这个判据在 8 个阶段边界里触发了 3 次,触发率 37.5%。作者解释为什么不在每步监控:短窗口的统计量主要反映梯度噪声,2.5M 步的间隔才够策略在下次评估前适应过来。

这套「读日志、判弱轴、改系数」的流程可以用一段伪代码概括。

仅示意,非论文原始伪代码
输入: 10M 步, 4 阶段, 每阶段 2.5M
初始化: theta, r_phys
for phase in 1..4:
  跑 2.5M 步 PPO, 读最近 30 行日志
  if phase < 4:
    d_stab, d_energy, d_ret <- 三轴变化
    if d_stab < -0.04 or 三轴全停滞:
      axis <- 判据给出的弱轴
      if axis == "knee":
        抬高第 6、10 号关节 ctrl cost
      if axis == "com":
        把 upright 惩罚清零
      if axis == "swing":
        删除非对称摆动惩罚
      if axis == "none":
        不改
  每 200k 步:
    渲 12 帧 -> 后台问 GPT-4o -> EMA
输出: 最终策略 theta

两条通道为什么互不干扰

r_VLM 和 r_phys 不共享任何一个奖励项,这是「独立可移除」的技术前提。消融实验里可以只关掉一条而不动另一条,这在绝大多数奖励塑形方案里做不到——一旦两项乘在同一个系数上,你就没法分清增益是谁带来的。

作者还加了三个稳定化补丁:r_VLM 上的 EMA(系数 0.2,10M 步时方差比 0.816);一个早期训练保护,当平均回合长度低于 100 步时把有效权重压到 alpha_eff = 0.2 * alpha;以及按弱轴限定的编辑,保证每次只动一个方向。第二个补丁的来历很值得记:作者在 1M 步做过一次 alpha=0.8 的试点,VLM 被要求给一个还在摔跤的人形打分,给出来接近 0 分,策略追着这个分数学会了坐在地上不起来。

训练怎么跑:10M 步、4 个阶段、单卡 3.45 小时

环境与超参

所有条件都用 Stable Baselines 3 的 PPO,跑在 MuJoCo Humanoid-v5 上,8 个并行环境。超参在每个格子里完全冻结:Adam,学习率 3e-4,折扣 0.99,GAE 的 lambda 0.95,每轮 4 个 epoch、4 个 mini-batch,裁剪系数 0.2,熵系数 0.01,梯度裁剪 0.5,策略网络是 256×256 的 MLP。观测 67 维,包含关节位置与速度、IMU、上一步动作。

算力是一张专用的 RTX 4090,峰值显存约 1.1 GiB,PhySA 跑 10M 步的墙钟时间是 3.45±0.57 小时,吞吐约 2500 环境步每秒。运行环境锁在 stable-baselines3 2.7.1、torch 2.10.0、gymnasium 1.2.3、Python 3.13.9。

这里有一处原文内部的小矛盾,我核对到了两遍:图 3 的结构图写 rollout buffer 是 T = 2048 步,而超参表里 nsteps 写的是 1024。同一个数字在两处不一致,不影响结论,但复现的人会卡一下。我倾向于以超参表为准,因为它的上下文是「每个格子冻结同一套配置」。

不阻塞训练线程

异步这件事不是宣传语,有实测。作者做了一个 1M 步的同机对比:Prompt2Policy 基线墙钟 7.25 分钟,只开 VLM 通道和稳定化补丁的 PhySA 是 6.95 分钟,差 −4.1%,在噪声范围内;训练 FPS 2532 对 2447(−3.3%),峰值显存 1082 对 1073 MiB,基本持平。

为什么能不平?因为每个 200k 步区间在 2500 步每秒的吞吐下大约 80 秒,而一次 API 往返是 1 到 3 秒,只要把请求丢到后台线程,rollout 队列永远等不到它。

花钱的地方:0.85 美元与 24 倍

成本审计做得很细:1M 步里 4 次调用花了 0.0848 美元,线性外推就是 10M 步 0.85 美元、100M 步 8.5 美元、1B 步 85 美元。1M 步消耗的 token 是 13804 个提示加 1054 个补全。

对照组是同步方案:如果每次策略更新都查一次,按 1024 步一轮、8 个环境算,10M 步大约 1220 次更新,也就是 1220 次调用,是 PhySA 的 24 倍。按这个比例,同步方案在 10M 步上要花 10 美元以上。

和另外两类方法比,成本结构完全不同。Eureka 的 best-of-K 搜索(16×5 次 GPT-4 调用)是一次性 25 到 30 美元;Text2Reward 单次合成不到 0.5 美元。PhySA 是唯一一个 LLM 开销随训练长度线性增长的方法,但在 1B 步的量级上(85 美元)也就和 GPU 电费(约 16 美元)同一个数量级。

实验:比谁、在什么上比、涨了多少

平台、种子与统计口径

实验围绕三个问题:PhySA 能不能同时改善平滑与任务表现、增益来自哪条通道、奖励能不能跨仿真器和跨机身迁移。

主平台只有 MuJoCo Humanoid-v5 一个。种子数在不同格子里是 3、5、8、10、30,作者自己标注了「N 小于 8 的格子只作方向性参考」。配对 t 检验用 Benjamini-Hochberg 做 FDR 校正,显著性水平 0.05,效应量报标准化均值差。平滑度的主指标是关节加速度 ||q̈||₂,由关节位置二阶差分得到。

这里要交代一件读者容易误会的事:这条研究线没有「成功率」这个指标,也没有「人类相似度」这种指标。MuJoCo Humanoid-v5 是一个连续控制基准,衡量的是回合长度、回合回报、关节加速度、机械功率、机械功。所谓「像人」只有两个间接代理:一个是 r_GMP 那个动捕高斯混合先验,一个是 VLM 的美学分。所以下面所有的数字都应该按这个口径读,不要把它们当成「任务成功率」。

指标方向口径
关节加速度越低越好平滑度主指标,关节位置二阶差分
抖动 95 分位越低越好看尾部而不是均值
回合长度越高越好终止规则下的存活步数
回合回报越高越好任务奖励累计,跨方法可比性有限
每步机械功率越低越好力矩乘关节速度,正比于磨损
每回合机械功越低越好功率对时间积分,被回合长度稀释
VLM 美学分越高越好0 到 10 分,只在条件级可比

主结果:对 Prompt2Policy

在同一条 10M 步的四阶段训练链上(两个方法各自从自己的 10M 检查点继续训四个 2.5M 阶段),数字是这样:

方法关节加速度VLM 分回合长度功率 (W)
Prompt2Policy423.84.8178.5999.6
PhySA171.45.74123.5568.6

关节加速度降 59.5%,功率降 43.1%,回合长度反而长 57.3%,VLM 分也从 4.81 涨到 5.74;每回合机械功从 1195 焦降到 1038 焦,降幅 13.1%。单看这张表,是一个「既要又要还要」的故事。

但作者紧接着就自己拆台:从零开始复现三个种子,同样的对比只剩 7.2%,p=0.45,不显著。所以 59.5% 这个数字的正确读法是「单次训练链上的幅度」,不是「可复现的效应量」。论文在摘要、图 1、表 1 的注释和结论里各写了一遍这个限定,这一点是诚实的。

为什么单链能到 59.5%、多种子只有 7.2%?论文没有给出机制解释,但从协议上能看出一个结构性差异:单链是「各自从自己的 10M 检查点继续训四个阶段」,两条链的起点不同、热启动状态不同;而从零复现是同一初始条件下的配对比较。前者更容易把「起点差异」算成「方法差异」。这是我对这个数字的解读,不是作者原话。

对 PPO、Text2Reward、Eureka

等步数协议是 2.6M 步、3 个种子、每种子 50 个回合。六项平滑对比全部通过 FDR 校正:

方法关节加速度抖动 p95回合长度回合回报
Eureka10151963186.2879.2
Text2Reward9441810116.4625.9
vanilla PPO9331792126.9667.2
PhySA693142373.7322.4

相对于 PPO 是 −25.7%(t=−6.16)、相对 Text2Reward 是 −26.6%(t=−6.39)、相对 Eureka 是 −31.7%(t=−7.64)。95 分位上的改善同向。代价是回合长度和回合回报全面落后,落后幅度 −37% 到 −63%,全部显著。

这张表里有两个值得单独讲的失败案例。Eureka 的 10M 检查点出现了奖励利用:终止时位移 |x| < 0.003 m,躯干高度 1.40 m,腿部速度范数约 19——它在原地踏步,既不前进也不摔倒,靠存活奖励无限刷分。150 个回合里只有 5 个到达 1000 步上限。Text2Reward 则是被 PPO 在两个轴上同时支配:抖动 944 对 933,回合长度 116 对 127,两头都输。

作者用了一个「权衡指数」来量化这件事:eta = |Δ抖动%| / |Δ回合长度%|。对 Text2Reward 是 0.73,对 PPO 是 0.61,都小于 1,意思是「用回合长度换平滑」这个交易里,付出一个百分点的回合长度,换回来不到一个百分点的平滑。这在硬件上可能是划算的(抖动直接对应伺服磨损),但在纯仿真指标上就是亏。

vanilla PPO 那条对照曲线

还有一条更干净的对照:用 SB3 的默认超参、只跑经典的 PPO 四项奖励(1.25 倍前进速度、5 分存活奖励、二次高度惩罚、0.1 倍动作平方和),8 个种子、每个 10M 步。策略确实会走,前进速度下限 0.842 m/s,但关节加速度是 1054.4±20.5,PhySA 是 171.4,差 6.16 倍;95 分位 1791.5±39.5 对 468.2,差 3.82 倍。

有意思的是回合长度:vanilla 的确定性回合长度是 243.8,比 PhySA 的 123.5 还长。作者的解释是四项奖励鼓励一种膝盖锁死、质心偏低的姿态,这种姿态能撑很多步但并没有在头条速度上前进。换句话说,回合长度和平滑度衡量的根本不是同一件事。

图 4
图 4|vanilla PPO 与 PhySA 的对比:左边两帧姿态能看出前者膝盖锁死、后者步幅收着走,右边的训练曲线显示两条轨迹在 2M 步后就分开了,最终差 6.16 倍。

消融:增益到底来自哪条通道

五路单元剔除的结果如下(完整栈和去掉校正模块这两格是 10 个配对种子,其余四格是 3 个种子):

配置(种子数)任务回报VLM 分回合长度
完整(N=10)298.42 ± 38.135.87 ± 1.0778.64 ± 9.18
去掉 VLM 通道(N=3)287.57 ± 10.166.43 ± 0.1274.06 ± 5.54
去掉校正模块(N=10)279.70 ± 22.415.19 ± 1.8971.09 ± 5.49
去掉 SAGE(N=3)370.92 ± 32.356.50 ± 0.0073.76 ± 5.27
去掉抖动项(N=3)315.86 ± 34.256.50 ± 0.0078.45 ± 7.16
去掉 GMP(N=3)311.17 ± 46.265.83 ± 1.1579.83 ± 7.12

唯一在 N=10 下做的剔除对比是「完整」对「去掉校正模块」,回合长度变化 −9.6%,p=0.032,效应量 dz=−0.80。这个结果的含义很直接:拿掉校正模块,回合长度掉得最多,平滑度也掉(从 5.19 的 VLM 分能看出它变得更「丑」但更抖)。

而拿掉 VLM 通道,VLM 分反而从 5.87 涨到 6.43,回合长度只掉 4.6 步。这就是 4.3 节那个结论的另一种呈现方式:VLM 通道在组合栈里既没帮上平滑的忙,也没帮上审美的忙。

alpha 扫描:加权系数不是关键

作者用四阶段协议(N 从 1 到 3、5、30)测了 alpha 从 0.2 到 0.8 的敏感性。N=30 配对的结果是五项指标全部不拒绝原假设,效应量绝对值都小于 0.20:任务回报 +11.5(p=0.362),回合长度 +2.4(p=0.353),抖动 p95 −334(p=0.736),粗糙度 −2.0(p=0.863),VLM 分 −0.10(p=0.537)。

唯一的次要发现是分布形状:alpha=0.8 时粗糙度的四分位距收窄了 37%,均值不动。作者的解读是平滑的「地板」由校正模块设定,不随美学权重漂移。

这个 null 结果容易被误读成「美学通道没用所以可以随便设」。正确的读法是:在两条通道同时存在时,美学权重在 4 倍范围内改变不了操作点,因为这条通道的作用机制(常数项)本来就不提供方向性梯度。

好看与能跑能不能两全

这是读这篇论文最该问的问题,也是它给出的答案最不客气的地方。

冲突有多大:+136% 对 −29.8%

把两条通道分开跑,结果是这样:

  • 只开 VLM 美学通道,粗糙度上升 136%,同时在四个美学评估维度上都拿到更高的分(N=8)。
  • 只开校正模块,粗糙度下降 29.8%,但美学分更低(N=50)。
  • 两条一起上,粗糙度下降 59.5%。

图 5
图 5|模块隔离的二维图:横轴是 VLM 美学分,纵轴是关节粗糙度。美学通道把点推向「更美但更抖」的右上角,校正模块把点推向「更平滑但更丑」的左下角,完整方案的落点不在这两点的连线上。

这张图值得细看,因为它否定了「两个信号只是同一个东西的两种测法」这个假设。如果两个通道测的是同一件事,那么两点连线上的任意一点都应该可以通过加权得到;实际上完整方案落在连线之外,说明两条通道在优化的是两个独立的目标,谁也替代不了谁。

更狠的是方向:美学通道单独使用不是「效果弱」,是「反向」。136% 的正向粗糙度增幅,意味着如果你把 VLM 分当成平滑奖励,你会得到一个比不加任何平滑项更抖的策略。

为什么组合之后 VLM 通道「消失」了

在完整栈里,去掉 VLM 通道或者把 alpha 变 4 倍,都测不出显著差异。这不是实验做得不够,而是这条通道的数学形式决定的。

前面说过,r_VLM 在一个 200k 步区间里是常数。在 Humanoid-v5 的终止规则下,每步常数奖励等价于给「存活」加价:它改变的是策略愿意用多少代价换取多活一步,而不是「该摆哪个姿势」。所以它进不了姿态层面的梯度,只能通过价值函数间接影响探索。

作者在附录里还补了一个反证实验,叫「诱饵诊断」:专门训一个最大化「挺胸 + 对称摆臂」这类外观项、但完全不管下肢抖动的策略(r_bait),然后用同一套 VLM 评估器给它打分。如果这个故意做粗糙的策略在美学分上超过完整 PhySA,那美学这条轴就不可信了。

结果是:alpha_bait 取 0.3、0.6、1.0 三档,VLM 均值分别是 4.81、5.02、5.01,完整 PhySA 是 4.92,置信区间全部重叠;关节加速度分别是 1108、1340、1038,PhySA 是 213,抖动高了 4.87 倍,美学分却没赢。之前 N=1 的单种子探针曾经读到 5.10 分、37.2% 的高分率,看起来像诱饵有优势,补到 N=3 之后就回归了。

图 6
图 6|诱饵诊断:横轴是对数尺度的关节粗糙度,纵轴是 VLM 美学分。绿色星号是 PhySA,橙色几个点是故意做粗糙的诱饵策略,它们抖动高出一个数量级,美学分却落在同一带里。

这个实验把「VLM 是不是只会奖励抖动」逼到了死角:VLM 确实偏好更有活力的动作(相关系数 +0.66 摆在那儿),但不足以让一个故意粗糙的策略赢过完整方案。所以它不是纯粹的抖动计,只是对抖动的偏好刚好和物理平滑相反。

一个诚实的补注:每个诱饵格子只训了 5M 步,PhySA 是 10M 步,所以「更长训练的诱饵会不会拿到美学优势」这个问题论文没有排除,作者把它列进了未来工作。

代价:用更短的回合换更平滑的腿

在跨方法对比里,PhySA 的平滑是用回合长度买的,而且买得不便宜:相对 PPO、Text2Reward、Eureka,回合长度掉 37% 到 63%,eta 在 0.61 到 0.73 之间。

图 7
图 7|2.6M 步上的平滑度与回合长度 Pareto 前沿:PhySA 独占最右端的平滑端,但在纵轴(回合长度)上明显偏低;Eureka 那个红叉是奖励崩溃,站在原地刷分。

所以「能不能两全」的答案要分三层说:

第一层,和同门的 Prompt2Policy 比,在单条训练链上看起来是两全的——回合长度 +57.3%,功率 −43.1%,平滑 −59.5%,三项同时改善。但这是单次训练,三种子复现只剩 −7.2%,所以这个「两全」不能当成稳定结论。

第二层,和强化学习基线比,是明确的权衡:平滑显著更好,回合长度显著更短,eta 小于 1。这不是「两全」,是「用一换零点七」。

第三层,和美学目标比,是直接冲突:美学通道单独使用会让抖动增加 136%,两者在梯度方向上相反,不存在一个权重能同时把两个都优化好。真正能同时改善两者的,只有「把物理项做对」这一条路,而不是「把美学项调小」。

机制:不是省力,是「少动几个关节」

平滑是怎么来的?这是全文最有硬件含义的一段。

功率分解显示,−43% 的每步功率下降不是全身均匀的:腿部下降 486 W,躯干和手臂反而上升 80 W,406.6 W 的净下降里有 95.3% 集中在两个髋关节上——右髋的矢状摆动和左髋的横向偏航。躯干和手臂的功率上升了 25.9%,作者的解释是上半身替变慢的双腿承担了更多角动量管理。

更关键的是力矩与速度的分离:关节力矩范数上升 6.0%(配对 t=+4.21,p=0.004),关节速度范数下降 35.4%,两者的乘积下降 43.1%。也就是说,策略并没有变「省力」,它变的是「慢而有力」。

这背后是关节专门化。每个关节的动作标准差从基线 0.353 降到 0.144(41%),最小标准差到 3.8e-6,饱和率 92.8%,平均动作幅度 0.384。翻译成人话:策略学会了只用少数几个关节主动发力,其余关节几乎锁死不动。四个消融条件下,每关节动作标准差与粗糙度的相关系数是 +0.949。

这个机制对落地判断很重要。好处是执行器磨损确实会降(磨损主要由关节速度而不是静态力矩驱动,论文引用了这一点);坏处是策略把自由度收窄了,遇到需要多关节协同恢复的场景——推挤、台阶、不平地面——这套专门化的步态未必扛得住。后面推挤恢复实验的 null 结果,和这个隐忧是对得上的。

换仿真器就失效:积分步长与一个硬编码阈值

Isaac:方向对、幅度没了

第一个迁移实验设计得很干净:只换物理引擎,任务规格和机器人身体都不变。把 PhySA 的策略直接搬到 IsaacLab,平滑差距是 −2.2%(p=0.71,N=3),在噪声里。

作者没有停在这里,而是按「每步平滑项的绝对量级」把系数重标定了 50 到 60 倍(每步从 0.0016 抬到 0.094),再测:×50 是 −1.0%(p=0.91,N=5),×60 是 −1.1%(p=0.87,N=5)。重标定确实把量级对上了,方向也还在,但幅度没了。

图 8
图 8|迁移结果汇总:最上面绿条是 MuJoCo 的锚点 −59.5%,下面四条灰条是 Isaac 直接迁移、50 倍重标定、60 倍重标定和 MuJoCo 推挤恢复,全部落在零附近。

把 Δt 改成 1/60 秒

为了定位这个差距,作者做了一个只在 MuJoCo 内部换积分步长的实验:把 Δt 强制成 1/60 秒,其他设置全不动,重训 3 个种子。结果关节加速度恶化了接近 5 倍。

原因很物理:标准的 0.015 秒步长下,每个物理步内部积 5 个子步,把接触尖峰平均掉了;步长变粗后尖峰没人平滑,直接主导了 ||q̈||₂。而策略的控制频率(由 frame_skip 决定)两边一样——每秒的动作决策数不变,变的只是引擎内部的积分分辨率。

这个实验说明两件事:一是奖励的「方向」没坏,坏的是「尺度」,而尺度与积分器绑定;二是同一个奖励项在不同引擎上不可直接搬运,因为 ||q̈||₂ 这个统计量本身就依赖引擎的积分方式。作者的归因是「积分方案是跨仿真器差距的主要来源」。

G1 上的那个 bug

第二个迁移实验换的不只是引擎,还有身体:Unitree G1,23 个关节,10M 配对步,3 个种子,外加 38 组超参搜索。作者一开始就声明了这次实验的混杂性——引擎和身体同时变,null 结果无法归因到其中任何一个。

结果是反向的:粗糙度差距 +3.4%,不显著,但符号错了。作者追下去发现一个硬编码的 bug:Humanoid-v5 的存活奖励在躯干高度 z ≥ 1.1 m 时触发,这个阈值匹配它的站立高度;G1 的站立高度是 0.793 m,同样的阈值永远不触发,于是策略在整个 rollout 里每步吃一个 −10 的存活惩罚,生存信号被直接反转。

修复是一行:把阈值改成按站立高度缩放,STANDING_BONUS_Z = 站立高度 × 0.769(这个比例来自 Humanoid-v5 的 1.1/1.43),对 G1 就是 0.610 m。修完之后存活奖励的触发率从 0.0% 升到 94.1%,训练不再退化,但平滑改善依然不显著:−1.7%。

38 组超参也救不回来

作者按四个假设做了 38 组条件的搜索:

假设扫描范围最好一格与判定
奖励尺度抖动系数 0.5×、1×、2×−3.1%,p=0.41,否决
熵系数0.001、0.01、0.03−2.4%,p=0.66,否决
采样长度nsteps 512、1024、2048−4.8%,p=0.04,确认但很小
mini-batch32、64、128−2.0%,p=0.18,部分

图 9
图 9|G1 上 38 组超参搜索的热力图:四行是四个假设、三列是三个取值,颜色是相对基线的粗糙度变化百分比,最下面一条是 MuJoCo 的 −59.5% 参照条。

最好的一格是采样长度 512,−4.8%,p=0.04——但这是 38 组里挑出来的一个,多重比较之后不应该当成可靠发现。作者的结论是:MuJoCo 的 −59.5% 在任何超参设置下都没能在 G1 上复现。

还有一个容易被忽略的 null:推挤恢复。50 到 200 牛顿的躯干冲量,每个条件 480 个回合,p=0.31,没有显著的平滑改善。这说明这套奖励在分布外的扰动场景里也没有额外收益。

局限与失效场景

主效应来自单次训练

59.5% 这个数字在论文里出现了很多次,但它来自一条训练链。三种子从零复现是 7.2%,p=0.45。作者在摘要、图注、表注、结论里都写了这个限定,读的时候不能只看标题数字。

回合太短,只覆盖起步

PhySA 的回合长度是 123.5 步,大约 1.9 秒。这个时长只能覆盖起步和加速的早期阶段,谈不上长时程步态质量。作者自己在 4.2 节写了这一点:这些测量覆盖的是早期运动,而不是长时程的步态。所有关于「平滑」的结论都应该加上「在 1.9 秒的窗口内」这个限定。

只有 MuJoCo,没有真机

全部实验在 MuJoCo Humanoid-v5 上完成,Isaac 只做了迁移测试,G1 只做了仿真。论文没有任何真机实验。对一篇标题里带 Humanoid Locomotion 的论文,这是一个必须说清楚的边界:它验证的是「奖励设计在仿真里的行为」,不是「策略能不能上硬件」。

美学信号到底是什么,仍然开放

VLM 分在条件级一致(平均 +0.76),在单条级几乎不一致(Krippendorff α=−0.008)。作者承认「这个分数在语义上到底测了什么,仍然是一个开放问题」。这句话比它看起来更重:如果连测量对象都不清楚,就很难为它设计一个稳定的奖励形式。

一处原文内部的不一致

图 3 写 rollout buffer 是 2048 步,超参表写 nsteps=1024。两处数字对不上。这不影响任何结论,但复现的人会在这里卡住,也算一个「读原文比读摘要更可靠」的例子。

几个作者承认没做的实验

  • 在 MuJoCo 内部跑 G1,只换身体不换引擎——这是把 G1 的 null 结果归因的最直接实验,没做。
  • 在 Isaac 上用 MuJoCo 的积分步长跑 10M 步——这是验证「积分器是不是唯一原因」的直接实验,没做。
  • 推挤恢复在 N=30 配对种子下重跑——现在的 N 可能只是统计功效不足,而不是真的没有效应。
  • 诱饵策略训到 10M 步——现在只有 5M,不能排除更长训练会拿到美学优势。

落地判断

什么团队值得试

  • 已经有 MuJoCo 或 Isaac 训练栈、并且执行器磨损是真实成本项的团队。论文给出的功率分解(95.3% 的下降集中在两个髋关节)意味着维护成本会集中受益在特定关节上,这和实际换件频率是对得上的。
  • 需要「在不引入动捕数据的前提下压住抖动」的团队。r_GMP 是可选项,去掉之后回合长度还有 79.83 步(比完整栈还长),说明这套方法不依赖动捕数据才能成立。
  • 想把 VLM 用在离线评审而不是在线奖励的团队。这篇论文最有价值的产出其实是那张相关系数表:它告诉你 VLM 美学分在条件级可用、在单条级不可用、并且和物理平滑反相关。

什么团队别碰

  • 打算直接把策略 sim2real 到 Unitree G1 的团队。论文在 G1 上的结果是 −1.7%,不显著,而且是在修了一个存活奖励的硬编码 bug 之后。跨引擎的尺度问题没有解决。
  • 想把 VLM 分当奖励主项的团队。136% 的反向增幅是一个很硬的反例,而且这个结论在四个模型上一致。
  • 需要长时程、高动态步态的团队。回合 1.9 秒、关节专门化到 92.8% 饱和率,这两个特征都指向「稳态小跑可以,敏捷机动未必」。
  • 预算敏感但又想用同步 VLM 打分的团队。1220 次调用对 50 次,10 美元对 0.85 美元,差距是 24 倍,而且同步方案还会阻塞训练循环。

如果是我,会先做这三件事

  1. 先在目标引擎上标定平滑项的量级。跑两个 Δt(0.015 和 1/60),看同一个 ||q̈||₂ 统计量差多少倍。论文测出来是接近 5 倍,这个数量级决定了你的系数在换引擎后是不是还成立。
  2. 用阶段触发的编辑替代固定权重,但把判据简化。论文的判据只读最近 30 行日志、只看三个轴、只在边界触发,工程上很好实现;真正难的是「弱轴到奖励项」的映射表,这张表是领域知识,不是调参能调出来的。
  3. VLM 只做离线评审。如果一定要进奖励,就明确它只能作为常数项存在,并预期它的效果等价于调存活奖励——这样你就不会对它抱有不切实际的期待。

成本与时间

10M 步、单张 4090、3.45 小时、0.85 美元 API、1.1 GiB 显存。这个成本门槛很低,低到任何一个有仿真环境的机器人团队都可以在本周内复现一遍主实验。反过来,这也意味着这篇论文的价值不在于「方法多复杂」,而在于「它把一个大家都会踩的坑标出来了」。

术语速查表

术语含义
PhySA物理平滑与美学,论文提出的双通道奖励框架
r_task任务奖励,从 Prompt2Policy 原样搬来的四项运动奖励
r_VLM美学奖励,VLM 打分经 EMA 平滑后映射到 −0.5 到 +0.5
r_phys物理校正通道,由阶段触发的权重编辑间接定义
r_GMP高斯运动先验,拟合到八类动捕数据的混合奖励
alpha美学权重,固定 0.5,敏感性在 0.2 到 0.8 之间测过
有效权重回合长度低于 100 步时把 alpha_eff 压到 0.2 倍
关节加速度平滑度主指标,由关节位置二阶差分得到
粗糙度关节加速度的均值,越低越平滑
抖动 95 分位看尾部而不是均值,对极端帧更敏感
阶段边界每 2.5M 步一次,校正模块的唯一触发点
弱轴判据给出的标签,取值 knee、swing、com、none
效应量标准化均值差,论文用它报告配对比较
权衡指数抖动改善百分比除以回合长度损失百分比
SAGE三阶段 LLM 代理,只生成初始任务奖励模板
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐