返回专辑
·Johan·5 分钟阅读

调试:先赢 random baseline

RL 连 random policy 都赢不了,别调 PPO clip——先查 reward sign、action 是否生效、obs 是否常数。

调试:先赢 random baseline

1. 第一关:trained 是否显著高于 random

我的习惯:trained policy eval return 必须 显著高于 random——同 wrapper、同 steps、同 seed 数。若否,调 PPO clip、换 SAC、加 cluster hours 都是浪费电。Random baseline 十分钟能跑完,却常被跳过——团队直接上 PPO sweep,一周后发现 5M step 不如 random,全是沉没成本。RL debug 的第一道门禁不是 loss 曲线,是 random vs learned 两行数;过不了这道门禁,任何 hyperparam 讨论都 premature。

python
obs, _ = env.reset()
total = 0
for _ in range(1000):
    obs, r, term, trunc, _ = env.step(env.action_space.sample())
    total += r
    if term or trunc:
        break

拿 human tuned 启发式当 baseline 太早;应先 random。Compare 时 timestep 总数要相同,否则 return 不可比——1000 step random 和 500 step learned 不能比。

2. 赢不了 random 时的排查顺序

  1. Reward sign:靠近目标应更好?step penalty 方向对吗?
  2. Action 生效:log env.step 前后 state 是否变?scale 是否饱和在边界?
  3. Obs 常数:误读 zero obs、错误 index、未接 sensor?
  4. Truncated 刷分:TimeLimit 截断是否误给 terminal bonus?
  5. VecNormalize:eval 未 load 训练 stats?

Zero action 是第三基线:continuous env 里零动作常对应 neutral pose;若 zero 比 random 还好,说明 random 在乱动害自己。改一项查一项,单变量——同时改 reward 和 action scale 永远不知道哪项生效。Debug 文化上反对「先训满 10M step 再说」。

3. 通过 random 仍不够时

Learned 只比 random 好一点点,可能是 reward 噪声大或 eval 方差高——多 seed。Learned 更差,常见 action 饱和、obs 归一化错、reward sign 反了。我要求 eval 至少比 random 高一个量级(任务相关),否则继续 debug,不调 PPO clip。

Random 通过后,加 scripted expert(PD 到 goal、open-loop 轨迹)看 return 上界。RL 应介于 random 与 scripted 之间逐步逼近;若 scripted 也很低,问题在 task/reward,不是 hyperparam。Log info 里 distance、contact force 比单 scalar return 更快定位——「赢不了 random」常是某一维 info 暴露问题。

4. 三级 baseline 体系

Random → zero action → scripted expert,构成三级 baseline。Scripted 给出量级上界,RL 进度可量化——「达到 scripted 的 60%」比「return 从 -100 到 -50」更有信息量。Hyperparam sweep 必须附三 baseline 结果,否则 review 直接打回。Issue template 固定三行:random mean、zero mean、scripted mean、current learned mean。

5. CI 与 env regression

100 step random rollout mean reward 应在 historical band 内;偏离则 env regression——wrapper 改了、reward 改了、action space 改了,random 最先报警。Nightly learned vs random 差值低于阈值发 alert。Random seed 固定写 eval script 首行——「今天 random 变了」通常是 wrapper 或 env 版本变了,不是「今天运气不好」。

6. 失败模式

Compare 时 timestep 总数不同。Eval 用了不同 wrapper 或不同 max_episode_steps。Random baseline 只跑一个 seed 就下结论。Eval 未 load VecNormalize,learned 表现像 random 却误判为「训不动」。

7. 案例:reward sign 反了训了一周

Manipulation 任务 reward 写成「距离 goal 越远越好」——笔误,应为越近越好。Random return 约 -50,learned 5M step 约 -200,团队换 SAC、调 LR 无效。Zero action baseline 优于 random(不动至少不远离),暴露 sign 问题。改一行 reward 后,random 不变,learned 1M step 超 random——根因是 reward bug,不是算法。

8. 验收

  • 同一 script 跑 random / learned / zero action 三曲线。
  • Issue template 附三 baseline;CI smoke 100 step random 在 historical band。
  • 改 env 或 reward 后先跑 random,再恢复 learned eval。
  • Scripted expert 给出上界,RL 进度可量化。
  • Hyperparam sweep 附三 baseline,否则 review 打回。

9. 与 scripted expert 的梯度

Random 通过后 scripted expert 给出上界——RL 应介于 random 与 scripted 之间。若 scripted 也很低,task/reward 有问题,不是 RL hyperparam;此时加 cluster hours 无效。Expert 不必是人类遥操作,PD 到 goal、open-loop 轨迹都算——关键是可重复、可量化。Log info 自定义字段(distance、contact force)比单 scalar return 更快定位:return 升但 distance 不降,可能是 reward shaping 与 task 不一致。Debug 单变量:改 reward 时不改 action scale,改 wrapper 时不改 seed——同时改两项永远不知道哪项生效。Standup 贴 random vs current 两行数,比贴 loss 曲线更有决策价值。

10. 录包与 CI 门禁

CI smoke:100 step random mean 在 historical band 内,偏离则 env regression。Nightly learned vs random 差值低于阈值 alert。Debug 录包:random 与 learned 同 seed 同 init 的 trajectory,对比 state 演化——action 生效但 state 不变是 physics bug,state 变 reward 不变是 reward bug。VecNormalize 未 load 时 learned 像 random,先查 pkl。Issue template 固定四行:random、zero、scripted、current learned mean;hyperparam sweep 缺任一行 review 打回。改 env 后先跑 random 再恢复 learned eval——wrapper 改一行,random 最先报警。Weekly standup 若 RL 没进展,先贴 random vs current 两行数,再讨论 hyperparam;loss 曲线好看但不如 random 时,继续训是浪费电。Human tuned 启发式作 baseline 太早,三级顺序是 random、zero action、scripted expert。Truncated 刷分、VecNormalize 未 load、action 饱和是赢不了 random 的常见根因——按顺序排查,改一项查一项。Compare 时 timestep 总数相同;CI 里 random 是 env regression 第一道告警——wrapper 改一行,random mean 先变。

11. 收束

Random baseline 是 RL 调试的文化门禁,不是可选项。团队习惯先贴 random 与 learned 两行数再讨论 hyperparam,比盯 loss 曲线更能避免「训了一周不如 random」的沉没成本。三级 baseline 顺序不可跳:random、zero action、scripted expert;Issue 与 sweep 缺任一行 baseline 数据,review 应打回。

← 全部文章

johan's blog