跳转到内容

奖励函数与回合机制

奖励规定如何评价交互,回合规则规定何时结束和重新开始。两者会共同影响策略行为。本篇沿平地速度跟踪任务,说明奖励的构成、时间尺度,以及失败终止、超时截断与重置之间的关系。

一种常用组织方式是将多个分项加权求和:

rt=iwifi(st,at,st+1,ct)r_t=\sum_i w_i f_i(s_t,a_t,s_{t+1},c_t)

每项应说明使用哪些数据、评价什么、符号如何约定。例如本文将各惩罚项定义为非负量,再通过负权重降低总奖励;也可以在函数内取负,但不要重复取负。

分项一种示意定义设计含义
平面速度跟踪exp(vxyvxycmd2/σv2)\exp(-\|v_{xy}-v_{xy}^{cmd}\|^2/\sigma_v^2)误差越小,得分越接近 1
偏航角速度跟踪exp((ωzωzcmd)2/σω2)\exp(-(\omega_z-\omega_z^{cmd})^2/\sigma_\omega^2)评价转向跟踪
动作变化惩罚aˉtaˉt12\|\bar a_t-\bar a_{t-1}\|^2抑制相邻控制步的动作突变
力矩惩罚τ2\|\tau\|^2抑制较大力矩;并不等于机械能耗
不期望接触指定身体部位接触的指示量抑制与任务不符的碰撞

σv\sigma_v 是速度误差的尺度。例如误差为 0.2 m/s,σv=0.5\sigma_v=0.5 m/s,则跟踪项为 exp(0.16)0.852\exp(-0.16)\approx0.852。有些实现直接将分母配置成一个参数,读取时应确认它表示 σ\sigma 还是 σ2\sigma^2

姿态、足端节奏和其他约束需要结合目标增加。平地任务适合的约束可能限制爬坡或跨越,不应仅因为其他项目存在某个奖励项就照搬。

先观察每项的原始值和加权贡献,再讨论权重。权重绝对值相同,不代表影响相同;各分项的量级和出现频率可能相差很大。

若某项表示每秒累积的奖励率,可以用:

rt=Δtciwifir_t=\Delta t_c\sum_i w_i f_i

例如恒定奖励率为 1,控制周期 0.02 s,持续 1 s 的未折扣累积为 50×0.02=150\times0.02=1。应确认时间缩放在配置预处理还是逐步计算时完成,避免重复乘步长。

不是所有奖励都适合统一按秒缩放。一次性的成功或失败事件可单独定义;动作差分也会随采样周期变化,乘一个步长并不自动使它在不同控制频率下等价。改变周期后,还应重新考虑按步定义的折扣因子和奖励意义。

3. 奖励分项分析与策略行为评价

Section titled “3. 奖励分项分析与策略行为评价”

总分提高可能来自更好的跟踪,也可能来自某个辅助项压过目标。应同时记录分项贡献、速度误差、回合长度、终止原因和动作表现。

若策略几乎不动,先确认它收到的目标,再看运动惩罚是否压过跟踪收益;若出现周期性抖动,检查它是否利用奖励定义获取高分,也检查控制增益与观测。修正时保留相同评估条件,比较单项修改前后的行为。

对总奖励做非负裁剪会改变优化目标,并可能掩盖部分惩罚效果。不能默认打开裁剪就一定更容易学会运动。

边界类型例子对后续价值估计的含义
任务内终止(terminated)任务规定的失败或成功通常不再续接未来价值
外部截断(truncated)持续行走任务达到采样时限通常仍需估计被截断的后续价值

对于持续任务中的外部时间限制,不能简单把超时与失败都当成价值为零的终点。反过来,若任务本身就是“在规定时间内完成目标”,时间结束可以属于任务终止,此时还应考虑向策略提供剩余时间。

这些区别关系到价值自举,详见 Gymnasium 时间限制说明。框架可能使用两个标志,也可能提供合并的结束标志和额外超时信息,需要按实际接口处理。

终止条件与终止奖励是独立设置。接触指定部位可以触发失败,却不一定自动产生额外惩罚;速度误差大可以扣分,却不一定结束回合。

环境需要根据任务重置机器人姿态、关节状态、速度和指令,以及回合计数、动作历史、观测历史、接触计时等缓存。循环策略的隐藏状态也要在训练器或策略侧正确清理。

只重置结束的环境,避免干扰仍在运行的其他环境。统计上一回合结果应在清空累计值前完成;初始状态随机化应有明确范围,不能以任意随机值代替有效姿态。

自动重置接口可能返回新回合初始观测。用于截断自举的回合末信息必须按框架与算法约定取得,不能不加区分地把新初始状态当作上一回合的末状态。具体价值修正方式属于训练器实现,需要连同环境接口一起阅读。

6. legged_gym 奖励与回合机制的实现示例

Section titled “6. legged_gym 奖励与回合机制的实现示例”

以下名称按官方仓库 master 分支的经典 LeggedRobot 实现核对(2026-09-10),仅用于定位代码;实际项目应记录所用提交,分支内容可能变化。

  • 奖励配置入口为 cfg.rewards.scales,函数使用 _reward_<名称>() 命名。
  • _prepare_reward_function() 处理权重及时间缩放。
  • compute_reward() 先累加普通分项;开启 only_positive_rewards 时裁剪其总和,再追加终止项。
  • post_physics_step() 中先检查终止、计算奖励,然后重置结束的环境并构建观测。

这是一种实现,不是所有框架的固定顺序。参见官方环境代码

  1. 手算一个跟踪项,检查误差增大时得分是否降低。
  2. 在相同状态下分别计算每项原始值与加权贡献,解释总分由谁主导。
  3. 在仿真中分别触发失败和超时,检查结束标志、奖励和统计记录。
  4. 对一个环境执行重置,确认历史与计数按约定初始化,其他环境不受影响。

完成后,应能说明“这一帧为什么得到这个奖励、这个环境为什么结束、下一帧属于哪个回合”。关于如何利用这些数据更新网络,继续阅读“策略训练”部分。