奖励函数与回合机制
奖励规定如何评价交互,回合规则规定何时结束和重新开始。两者会共同影响策略行为。本篇沿平地速度跟踪任务,说明奖励的构成、时间尺度,以及失败终止、超时截断与重置之间的关系。
1. 奖励函数的构成与设计
Section titled “1. 奖励函数的构成与设计”一种常用组织方式是将多个分项加权求和:
每项应说明使用哪些数据、评价什么、符号如何约定。例如本文将各惩罚项定义为非负量,再通过负权重降低总奖励;也可以在函数内取负,但不要重复取负。
| 分项 | 一种示意定义 | 设计含义 |
|---|---|---|
| 平面速度跟踪 | 误差越小,得分越接近 1 | |
| 偏航角速度跟踪 | 评价转向跟踪 | |
| 动作变化惩罚 | 抑制相邻控制步的动作突变 | |
| 力矩惩罚 | 抑制较大力矩;并不等于机械能耗 | |
| 不期望接触 | 指定身体部位接触的指示量 | 抑制与任务不符的碰撞 |
是速度误差的尺度。例如误差为 0.2 m/s, m/s,则跟踪项为 。有些实现直接将分母配置成一个参数,读取时应确认它表示 还是 。
姿态、足端节奏和其他约束需要结合目标增加。平地任务适合的约束可能限制爬坡或跨越,不应仅因为其他项目存在某个奖励项就照搬。
2. 奖励权重与时间尺度
Section titled “2. 奖励权重与时间尺度”先观察每项的原始值和加权贡献,再讨论权重。权重绝对值相同,不代表影响相同;各分项的量级和出现频率可能相差很大。
若某项表示每秒累积的奖励率,可以用:
例如恒定奖励率为 1,控制周期 0.02 s,持续 1 s 的未折扣累积为 。应确认时间缩放在配置预处理还是逐步计算时完成,避免重复乘步长。
不是所有奖励都适合统一按秒缩放。一次性的成功或失败事件可单独定义;动作差分也会随采样周期变化,乘一个步长并不自动使它在不同控制频率下等价。改变周期后,还应重新考虑按步定义的折扣因子和奖励意义。
3. 奖励分项分析与策略行为评价
Section titled “3. 奖励分项分析与策略行为评价”总分提高可能来自更好的跟踪,也可能来自某个辅助项压过目标。应同时记录分项贡献、速度误差、回合长度、终止原因和动作表现。
若策略几乎不动,先确认它收到的目标,再看运动惩罚是否压过跟踪收益;若出现周期性抖动,检查它是否利用奖励定义获取高分,也检查控制增益与观测。修正时保留相同评估条件,比较单项修改前后的行为。
对总奖励做非负裁剪会改变优化目标,并可能掩盖部分惩罚效果。不能默认打开裁剪就一定更容易学会运动。
4. 失败终止与时间截断
Section titled “4. 失败终止与时间截断”| 边界类型 | 例子 | 对后续价值估计的含义 |
|---|---|---|
| 任务内终止(terminated) | 任务规定的失败或成功 | 通常不再续接未来价值 |
| 外部截断(truncated) | 持续行走任务达到采样时限 | 通常仍需估计被截断的后续价值 |
对于持续任务中的外部时间限制,不能简单把超时与失败都当成价值为零的终点。反过来,若任务本身就是“在规定时间内完成目标”,时间结束可以属于任务终止,此时还应考虑向策略提供剩余时间。
这些区别关系到价值自举,详见 Gymnasium 时间限制说明。框架可能使用两个标志,也可能提供合并的结束标志和额外超时信息,需要按实际接口处理。
终止条件与终止奖励是独立设置。接触指定部位可以触发失败,却不一定自动产生额外惩罚;速度误差大可以扣分,却不一定结束回合。
5. 回合重置与状态初始化
Section titled “5. 回合重置与状态初始化”环境需要根据任务重置机器人姿态、关节状态、速度和指令,以及回合计数、动作历史、观测历史、接触计时等缓存。循环策略的隐藏状态也要在训练器或策略侧正确清理。
只重置结束的环境,避免干扰仍在运行的其他环境。统计上一回合结果应在清空累计值前完成;初始状态随机化应有明确范围,不能以任意随机值代替有效姿态。
自动重置接口可能返回新回合初始观测。用于截断自举的回合末信息必须按框架与算法约定取得,不能不加区分地把新初始状态当作上一回合的末状态。具体价值修正方式属于训练器实现,需要连同环境接口一起阅读。
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()中先检查终止、计算奖励,然后重置结束的环境并构建观测。
这是一种实现,不是所有框架的固定顺序。参见官方环境代码。
- 手算一个跟踪项,检查误差增大时得分是否降低。
- 在相同状态下分别计算每项原始值与加权贡献,解释总分由谁主导。
- 在仿真中分别触发失败和超时,检查结束标志、奖励和统计记录。
- 对一个环境执行重置,确认历史与计数按约定初始化,其他环境不受影响。
完成后,应能说明“这一帧为什么得到这个奖励、这个环境为什么结束、下一帧属于哪个回合”。关于如何利用这些数据更新网络,继续阅读“策略训练”部分。