评测协议:一个 seed 不够
RL 方差极大;至少多 seed 报 mean±std,eval 用 deterministic policy 和固定 scenario 集。

1. 单 seed 的「提升」多半是噪声
同一 hyperparam、5 个 seed 训 PPO,eval return 从 1200 到 2800 不罕见——差 2× 是常态,不是 bug。只报 best seed 是 cherry-pick;只跑 1 seed 就 claim 5% 改进,置信区间几乎必然重叠。更糟的是用 train episodic return 选 checkpoint:train 高 eval 低常见于 overfit exploration 或 VecNormalize train/eval 不一致——你存的是「探索噪声上的峰值」,不是可用 policy。
根因是评测没有协议:seed 数、eval 模式、scenario 集、报告格式全靠临场发挥。没有协议,每次对比都是抽奖;有 protocol,差 2× 的方差是可预期的,报告 mean±std 才是诚实工程。RL 和 supervised learning 不同——同样架构同样数据,方差可以差一个数量级,这不是「调调就好」能消除的。团队若只报 best run,产品侧会基于噪声做决策,后续 revert 成本远高于一开始就跑够 seed。
2. 标准协议
训练:N seeds(5~10),相同 env/wrapper/hyperparam/total timesteps——不同 seed 用不同 timesteps 是隐性 cherry-pick。
Eval:deterministic policy(高斯 mean、DQN greedy),固定 eval seed 或固定 goal 集,100 episode 起。
报告:mean ± std,或 IQM(interquartile mean)对 outlier robust——IQM 对 outlier seed 更稳,AgileRL 等库有参考实现。
选模型:按 eval return 存 best checkpoint,不用 train return。
Eval 时 exploration noise 必须关闭——高斯 policy 取 mean、DQN 取 argmax,否则 return 被噪声拉低且不可复现。Train 曲线上的 episodic return 含 exploration,只能看趋势,不能和 eval return 直接比数值。
from stable_baselines3.common.evaluation import evaluate_policy
mean_reward, std_reward = evaluate_policy(
model, eval_env, n_eval_episodes=100, deterministic=True
)Gymnasium RecordEpisodeStatistics wrapper 统计 return/length。表格列 seed、total timesteps、train return(最后 100 局均值)、eval return——claim 提升要求至少 5 seed,且 eval mean 的置信区间不重叠。Paper 图 errorbar 是基本礼貌;内部排期用 wall-clock 作 x 轴时,脚注 hardware 和 n_envs。Reproducibility checklist 应含:eval seed 文件 hash、wrapper config、checkpoint step、deterministic flag——缺一项则跨机器对比无效。
3. Scenario 固定与 stratified eval
Eval 应用固定 init seed 集 checked in git——改 eval scenario 等于新 benchmark,learning curve 不可与旧 run 拼接。Stratified:easy/medium/hard init 分开报,避免 average 被 easy 主导。Internal dashboard 用 seed × scenario 热力图,一眼看哪个 bucket 拖后腿;public 只报 aggregate,内部 fix weak bucket 优先。
Record video 存 best and median seed——best 可能 hack 特定 init,median 更接近典型行为。Video 存档 policy 版本 + eval seed,日后 reward 改了可对比 behavior drift。Stratified eval 只测 easy init 是常见偷懒——average 被 easy 主导,hard bucket 上的失败被掩盖。
4. 统计显著性与 checkpoint 选择
5 seed 的 t-test 或 bootstrap CI;差 5% mean 但 CI 重叠时不 claim 显著。Eval 100 episode 时 confidence interval 仍可能很宽——claim 改进至少 5 seed × 100 ep。选 checkpoint 只看 eval,不看 train peak——train 高 eval 低说明 overfit exploration 或 normalize 不一致,存 checkpoint 等于存幻觉。
Train eval 混用 exploration noise 是另一常见坑:eval 时仍加 Gaussian noise,return 被噪声拉低,和 deterministic eval 不可比。VecNormalize eval 未 load stats 则 obs 尺度错位,eval return 无意义。
5. Eval seed 版本化
Eval seed 列表是 benchmark 的一部分,不是临时参数。改 eval scenario 等于新 benchmark,旧 learning curve 不可拼接。Eval 100 episode 的 std 仍可能很大——报告时写清 n_episodes 和 CI 宽度,避免读者误以为 100 ep 就「精确」了。不同 seed 用不同 total timesteps 会让 learning curve 不可比——total timesteps 必须 lock。
6. 常见偷懒与失败模式
只报 best seed。Video 只看 best seed。Stratified eval 只测 easy init。Train eval 混用 exploration noise。Claim 5% 提升但 CI 重叠——数字上好看,统计上不成立。
7. 验收
evaluate_policy(..., deterministic=True)跑 100 episode,表格列 seed/eval mean/std。- Claim 提升时 CI 不重叠;checkpoint 按 eval 选,非 train peak。
- Eval seed 列表版本化;video 存档 policy 版本 + eval seed。
- Train/eval 无 exploration noise 泄漏;
VecNormalizestats 一致加载。 - Stratified bucket 均有样本,非 easy-only 平均。
- 5 seed × 100 ep 仍不够宽时,承认 claim 力度有限。
8. 案例:best seed 视频误导产品决策
某次 locomotion 实验,best seed 视频流畅通过障碍,产品侧据此拍板上线——median seed 视频显示 policy 在第三个障碍前 40% 概率摔倒。根因是只存档 best seed video,stratified eval 未做。修复协议后,产品决策改看 median seed 和 hard bucket mean,避免被 lucky seed 绑架。
9. 与 hyperparam sweep 的关系
Sweep 20 组 hyperparam 每组只跑 1 seed,等于 20 次抽奖——最优那组很可能是 lucky seed 而非真正最优。正确做法:narrow sweep 用 1 seed 粗筛, finalist 用 5~10 seed 完整 protocol 验证。Sweep 结果表格必须含 seed 列和 eval mean±std,不能只有 best return 单列。
内部对比两个算法时,固定 eval seed 集、固定 total timesteps、固定 wrapper 链,三样 lock 才能说「A 比 B 好」。缺一即 confound,结论不可信。Protocol 写进 repo 的 docs/eval.md 或 experiment template,新人按模板跑,而非每次口头对齐。
RL 方差是物理规律,不是调参能消除的。协议把 cherry-pick 挡在门外,固定 scenario 让跨 run 对比有意义——否则每次「提升」都是抽奖,团队会在噪声上浪费整周排查。
相关
也可以看看
- ·16 分钟阅读
约束 MDP 的代价估计偏差:安全层看起来在工作
区分期望约束、条件风险与硬屏蔽,解释代价 critic 偏差如何让可行集虚胖;用约束违反轨迹占比、拉格朗日乘子轨迹和安全层旁路注入验收。
- ·17 分钟阅读
离线强化学习的支持集外动作:为什么 Q 值会自我抬高
从 Bellman backup 的分布外 maximization 解释外推误差;比较行为约束、保守价值与策略正则,并用覆盖率切片与 FQE 交叉验证部署边界。
- ·10 分钟阅读
离策略评估:部署前别只看行为数据上的平均回报
从重要性采样的支持集与方差出发,比较 self-normalized、per-decision、DR 和 FQE,并建立部署前的统计验收。
johan's blog