外观
从零搭一套 RL 评估
一句话定位:这一页教你搭一套不会骗你的 RL 评估协议——从实验矩阵设计、指标选择,到公平性陷阱与评估报告,一步到位。它解决"训练明明在涨、一上对比就翻车"的困惑,适合任何要靠实验结果做决策的人(调参、选算法、决定要不要上线),读完你会有自己的一份可复用的评估脚本与报告模板。
先给一个残酷的事实:RL 领域大量已发表结果,单跑一次根本复现不出来。Henderson 等人在《Deep Reinforcement Learning that Matters》里做过统计:同一篇论文的同一算法,不同 seed 下性能差异可以大于不同算法之间的差异。换句话说,不会评估 = 你的实验结论是掷骰子。本页就是要把"掷骰子"变成"读数"。
本页是评估与基准那页的实践落地:概念页讲"为什么 RL 评估难",本页讲"到底怎么搭"。
一、先问清楚:这次评估要回答什么问题
评估协议不是越多越好,而是服务于决策。先分清三种评估目标,它们的协议设计完全不同:
| 评估目标 | 要回答的问题 | 关键要求 | 典型时长 |
|---|---|---|---|
| 调参决策 | 改这个超参,变好还是变坏? | 相对比较即可,可少 seed | 单次实验为主 |
| 算法对比 | A 算法真的比 B 好吗? | 多 seed + 统计区间,公平性苛刻 | 多 seed 矩阵 |
| 上线决策 | 能上线吗?出事的代价多大? | 长尾分析、安全边界、离线+在线双验证 | 最重,周期长 |
最常见的评估错误:用调参评估的标准做上线评估
调参阶段"涨了 5 分"可能只是 seed 运气;但同样的宽松标准被搬到上线决策上,就会把一次方差当成了真信号。结论越重要,评估协议越要严格。 这是一个原则,本页所有细节都从它派生。
二、实验矩阵设计:算法 × seed × 环境
评估的基本单位是"一次实验"。一次实验 = 一个 (算法, seed, 环境, 配置) 四元组。所有实验合起来构成矩阵:
text
实验矩阵示意(横向 = seed,纵向 = 算法×环境)
seed 0 seed 1 seed 2 seed 3 seed 4
PPO CartPole ██████ ██████ ██████ ██████ ██████
PPO LunarLander ██████ ██████ ██████ ██████ ██████
SAC CartPole ██████ ██████ ██████ ██████ ██████
SAC LunarLander ██████ ██████ ██████ ██████ ██████
█ = 一次完整训练 + 评估(含学习曲线)1. seed 怎么选
| 要素 | 推荐做法 | 理由 |
|---|---|---|
| seed 数量 | 对比实验 ≥ 5 个,正式报告 ≥ 10 个 | 5 个 seed 的均值才能把方差压到可分辨的水平 |
| seed 集合 | 固定同一组:0,1,2,3,4 | 跨算法共享 seed 集合,可比性最强 |
| seed 取值 | 记录每个 seed 的完整配置 | seed 不同 + 超参不同 = 变量失控,无法归因 |
| 环境随机性 | seed 要播进环境的 reset 与 action_space | 否则环境部分不可控,见常见陷阱 |
2. 变量控制清单
对比两个算法时,只有"算法"这一个变量允许不同。必须锁死的:
- [ ] 环境版本与包装(
TimeLimit、frame_stack等是否一致) - [ ] 每 seed 的环境随机序列(同一 seed 播同一环境,不只是全局播一次)
- [ ] 观测预处理(归一化、灰度、帧堆叠)
- [ ] 训练总步数预算(不是训练集数——RL 的"epoch"定义随算法不同,预算必须按环境交互步数统一)
- [ ] 评估协议本身(见第三节)
- [ ] 软件版本(gymnasium/numpy/torch 的版本要在报告里写死)
为什么"训练步数"要按环境步数统一,而不是按训练迭代
PPO 一次更新吃掉 2048 步、REINFORCE 一次更新吃掉一整集(几十到几百步)。如果按"更新次数"对齐预算,PPO 会被严重优待;按环境步数对齐,才是"每方花同样的钱买数据"的公平比较。这也是样本效率与最终性能讨论的前提。
三、指标:回报均值、学习曲线、成功率
1. 学习曲线(Learning Curve)是所有指标的母体
不要只报告"最终分数"。学习曲线(横轴=环境步数,纵轴=评估回报)保留了时间信息:谁收敛快、谁在退化、谁前期振荡。一张多 seed 的 IQR 学习曲线图,比一个"平均 432 分"的数字信息量大一个数量级。
2. 回报的聚合方式
单次运行(一个 seed)会得到一条回报曲线。跨 seed 聚合时,中位数 + 四分位区间(IQR) 是推荐方案,而不是均值 ± 标准差:
| 聚合方式 | 优点 | 缺点 |
|---|---|---|
| 均值 ± 标准差 | 直观、人人会算 | 被极端值带偏(RL 运行偶发爆炸) |
| 中位数 ± IQR | 抗离群、无需正态假设 | 略不直观,但更诚实 |
| 分位数带(5%/25%/75%/95%) | 信息最全 | 图更复杂 |
RL 的回报分布通常不是正态的:偶尔会有一两个 seed 训练到一半崩掉(损失 NaN、探索塌缩),拉高均值方差。用中位数 + IQR 表示"典型表现",用完整分位带表示"最坏情况",才是负责任的呈现。
3. 成功率与业务指标
回报在业务上往往没意义,真正决策用的是成功率、完成率、成本等。两种指标都该报告:
| 指标类型 | 例子 | 用途 |
|---|---|---|
| 过程指标 | 回报、TD 误差、熵 | 调试与诊断 |
| 结果指标 | 任务成功率、平均完成时间、资源占用 | 业务决策 |
用"任务成功率"给回报"配平"
回报会掩盖模式:平均回报 400 可能来自"80% 的集拿 500、20% 的集拿 0"。成功率 + 回报一起报,你才能区分"稳定优秀"与"赌博式优秀"。
4. 评估期 vs 训练期
- 训练期评估(每 N 步):轻量,用固定评估种子、每 seed 环境播 3~5 集,仅用于看趋势。
- 终局评估(训练结束后):严格,新种子、10~20 集、评估时关闭一切随机性(
eval模式、deterministic采样)。
训练期评估与终局评估混用
训练中每 N 步评估一次,取最后一次评估结果当"最终分数"——这是一个非常常见的作弊姿势(虽然常常是无意的):训练后期每次评估都在同一组种子,策略可能已对这组种子过拟合,且最后一次评估可能正好撞上噪声峰。最终分数必须来自独立的终局评估。
四、样本效率与最终性能:两个维度
任何 RL 评估都应给出两个数,缺一不可:
text
最终性能(纵轴:达到的性能水平)
↑
│ · PPO(最终性能高)
│ ·
│ ·
│ ·SAC(样本效率高)
│ ·
│·
└──────────────────────────→ 样本效率(横轴:达到该水平的步数)| 维度 | 定义 | 怎么测 | 为什么容易看漏 |
|---|---|---|---|
| 最终性能 | 训练预算耗尽时的性能 | 终局评估 | 预算本身选得对不对比人有影响 |
| 样本效率 | 达到某个性能阈值所需步数(或 AUC) | 从学习曲线读"首次超过阈值"的时间点 | 只报最终分就丢了它 |
工程里大多数时候真正关心的是样本效率(你的数据预算有限),但论文/报告里常只给最终分。在报告模板里两个都要,缺一个就补上。
样本效率还可以用 AUC(学习曲线下面积) 表达:把学习曲线积分,一个数字同时含"多快"与"多高"的信息,且不受阈值选择影响。Agarwal 等人(2021)把它作为与中位数性能并列的核心指标。
五、对比公平性的陷阱
这里列的每一条,都真实存在于论文复现和团队内部评审中:
| # | 陷阱 | 后果 | 规避 |
|---|---|---|---|
| 1 | 给对手算法用默认超参,给自己用调优超参 | 虚假的"我们的更好" | 所有算法一视同仁地调参,或明确声明"官方默认对比" |
| 2 | 训练预算按 epoch 算,两算法吃步数不同 | 结果被预算差主导 | 按环境步数统一预算 |
| 3 | 只调一个算法到最优,另一个顺手跑 | 同上 | 公平轮次:每算法独立调参后同预算对比 |
| 4 | 计算资源不等(GPU vs CPU、并行数不同) | 隐式步数差 | 报告 wall-clock 与设备 |
| 5 | seed 集合不同(A 用 0-4,B 用 100-104) | 可比性丧失 | 共享同一 seed 集合 |
| 6 | 评估时随机性未关 | 方差叠加进结论 | 终局评估开 deterministic |
| 7 | 只有一条学习曲线就下结论 | 结论依赖单点 | 多 seed + IQR |
| 8 | 超参来自"用测试集调参" | 过拟合评估集 | 预留 holdout 环境/任务(见下文) |
超参调优会不会本身就是一种作弊?
会。如果你用测试环境反复调参,最后报出来的分数是在见过的数据上调出来的。缓解手段:
- 预留验证环境:调参用 A 组环境/种子,最终报告用 B 组(未见过的种子或更难的环境)。
- 少调:调参轮次固定(比如每算法最多 20 轮),报告里写明调参预算——这是论文审稿人现在会查的"调参预算公平性"。
- 报告"默认超参也能打":同时报告"官方默认"与"调优后"两组结果。
六、运行管理:实验记录、日志、表格化
评估协议再严谨,实验管理混乱也会前功尽弃。三件套:配置记录、曲线日志、结果表。
1. 实验记录
每次实验(一个 (算法,seed,环境))自动生成一条记录:
text
experiments/
2026-08-01_ppo_cartpole_s0/
config.yaml # 完整配置(Hydra 生成)
seed.txt # 记录 seed
train_returns.csv # 训练回报曲线
eval_returns.csv # 评估回报曲线
metrics.json # 终局评估汇总
model.pt # 模型权重
git_commit.txt # 代码版本
env_versions.txt # 依赖版本这就是从零构建一个 RL 项目里"可复现性加固"的具体形态。有了它,"复现一次实验"就是"重跑一个目录"。
2. 日志工具
| 工具 | 擅长 | 入门建议 |
|---|---|---|
| TensorBoard | 标量/直方图/曲线,离线免费 | 起步首选 |
| Weights & Biases(W&B) | 实验对比、表格、协作、自动日志 | 团队协作必选 |
| 自写 CSV | 极简、零依赖 | 单机小实验 |
| rliable | IQR/分位带绘图(统计聚合) | 报告阶段用它画图 |
日志要"自动落盘"而不是"print 到屏幕"
终端输出会丢、会混、不可检索。训练循环里所有指标(回报、熵、KL、TD 误差、学习率、seed、时间步)都应追加写入 CSV 或通过 W&B 的 log() 自动记录。没有记录的实验 = 没做过的实验。
3. 结果表模板
所有实验跑完后,汇总成一张主表(这是评估报告的核心):
| 算法 | 环境 | 最终回报(中位±IQR) | 成功率 | 样本效率(AUC) | 训练步数 | seed 数 | 超参来源 |
|---|---|---|---|---|---|---|---|
| PPO | CartPole-v1 | 498 [496, 500] | 100% | 12.4k | 50k | 5 | 调优 |
| SAC | CartPole-v1 | 497 [494, 500] | 100% | 9.8k | 50k | 5 | 调优 |
| ... | ... | ... | ... | ... | ... | ... | ... |
七、离线评估为什么这么难
当你只有历史数据、不能在线试错时(推荐系统、交易、机器人日志),评估会进入另一个量级:你无法用"跑一遍环境"来打分,只能靠离线评估器。这里水非常深:
- 行为策略与目标策略分布不同 → 轨迹权重偏差(importance sampling 的方差随序列长度爆炸)。
- 离线价值估计偏乐观 → "看起来很好"的策略一上线就崩。
- 自举误差叠加 → 价值高估越滚越大(离线强化学习那页讲的"自举幻觉")。
实践要点:
| 情境 | 该信什么 | 别信什么 |
|---|---|---|
| 有真实在线通道 | 在线小流量 A/B | 纯离线评分(只当筛查) |
| 只有离线数据 | 保守的离线评估器 + 多方法交叉 | 单一方法的乐观分数 |
| 论文报告 | 有"真实验证"的实验 | 只有拟合曲线的工作 |
离线评估的"回测谎言"
金融里叫"回测过拟合"、推荐里叫"离线指标高估"、机器翻译里叫"过拟合测试集"——本质是同一件事:你在用历史数据上的拟合程度代替未来表现。相关诚实剖析见金融交易中的 RL。任何"离线分数很好"的结论,都必须伴随"未知的不确定性有多大"的说明。
八、一份评估报告模板
把下面这份模板存成 EVAL_REPORT.md,每个项目结项时按格式填。它强制你写清楚别人质疑你的每个点:
markdown
# 评估报告:<项目名> <日期>
## 1. 目标与问题
- 本次评估要回答的问题:________
- 决策类型:□调参 □算法对比 □上线
## 2. 实验设计
- 算法:________(版本/代码 commit:________)
- 环境:________(Gymnasium 版本:________)
- seed 集合:________(每个 seed 是否播进环境?□是 □否)
- 训练预算:____ 环境步数(统一口径)
- 超参来源:□官方默认 □调优(调优轮数:____;预留验证环境:□有 □无)
## 3. 指标与结果
| 算法 | 环境 | 最终回报(中位[IQR]) | 成功率 | AUC | seed 数 |
|---|---|---|---|---|---|
| | | | | | |
- 学习曲线图(IQR 带):[链接]
## 4. 公平性自查
- [ ] 所有算法同等调参预算 / 明确声明
- [ ] 预算按环境步数统一
- [ ] 终局评估独立于训练评估、关闭随机性
- [ ] 软件版本与依赖已记录
## 5. 结论与置信度
- 结论:________
- 置信度:□高(多 seed+独立评估) □中 □低(单次运行,仅供内部参考)
- 已知局限:________用同一份模板给"内部迭代"用
不需要每次都填完整的八节——日常调参只用第 2、3 节的一个缩略版(config + 曲线图)。但正式对外(汇报、论文、上线评审)的每一次,都必须走完整模板。习惯从第一次写起,成本远比事后补低。
九、评估流程总结:一次完整评估怎么走
text
定义问题 → 设计矩阵 → 锁变量 → 跑实验 → 聚合曲线 → 公平性自查 → 出报告 → 决策
│ │ │ │ │ │ │ │
└ 见第一节 └ 见第二节 └ 见第二/五节 └ 见第六节 └ 见第三/四节 └ 见第五节 └ 见第八节调参实践中,评估与调参是同一个循环——你每调一个超参,其实就是在跑一次迷你评估(见调参与超参数优化)。两者共用同一套日志与曲线基础设施,区别只在统计严格度。
延伸阅读
- 评估与基准 —— 本页的理论版:RL 评估为什么难、基准图谱、报告规范
- 调参与超参数优化 —— 评估协议与调参循环如何合流,seed 陷阱
- 离线强化学习 —— 本页第七节的完整展开:离线评估的困难与保守主义解法
- 从零构建一个 RL 项目 —— 把评估协议装进完整项目流水线(日志、可复现、部署监控)
- 常见陷阱与反模式 —— 评估作弊、seed 过拟合等翻车点的检测清单
参考资料
- Agarwal, R. et al. (2021). Deep Reinforcement Learning at the Edge of the Statistical Precipice. NeurIPS 2021. arXiv:2108.13264(IQR/中位数/概率改进等稳健评估协议的标准参考,附带 rliable 工具库)
- Henderson, P. et al. (2018). Deep Reinforcement Learning that Matters. AAAI 2018. arXiv:1709.06560
- Islam, R. et al. (2017). Reproducibility of Benchmarked Deep Reinforcement Learning Tasks. arXiv:1708.04133
- Engstrom, L. et al. (2020). Implementation Matters in Deep RL: A Case Study on PPO and TRPO. ICLR 2020. arXiv:1805.08292
- rliable 工具库(Google Research):github.com/google-research/rliable(IQR/分位带/概率改进绘图)
- Weights & Biases 官方文档:docs.wandb.ai;TensorBoard:tensorflow.org/tensorboard
- Farama Foundation 基准说明(Gymnasium/Atari 环境维护方):farama.org