Skip to content

从零搭一套 RL 评估

本页速览 评估协议实战:固定 seed 矩阵、多次运行、学习曲线与 IQR、样本效率/最终性能双维度;算法对比的公平性陷阱;离线评估与在线评估。

从零搭一套 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 与设备
5seed 集合不同(A 用 0-4,B 用 100-104)可比性丧失共享同一 seed 集合
6评估时随机性未关方差叠加进结论终局评估开 deterministic
7只有一条学习曲线就下结论结论依赖单点多 seed + IQR
8超参来自"用测试集调参"过拟合评估集预留 holdout 环境/任务(见下文)

超参调优会不会本身就是一种作弊? ​

会。如果你用测试环境反复调参,最后报出来的分数是在见过的数据上调出来的。缓解手段:

  1. 预留验证环境:调参用 A 组环境/种子,最终报告用 B 组(未见过的种子或更难的环境)。
  2. 少调:调参轮次固定(比如每算法最多 20 轮),报告里写明调参预算——这是论文审稿人现在会查的"调参预算公平性"。
  3. 报告"默认超参也能打":同时报告"官方默认"与"调优后"两组结果。

六、运行管理:实验记录、日志、表格化 ​

评估协议再严谨,实验管理混乱也会前功尽弃。三件套:配置记录、曲线日志、结果表。

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极简、零依赖单机小实验
rliableIQR/分位带绘图(统计聚合)报告阶段用它画图

日志要"自动落盘"而不是"print 到屏幕"

终端输出会丢、会混、不可检索。训练循环里所有指标(回报、熵、KL、TD 误差、学习率、seed、时间步)都应追加写入 CSV 或通过 W&B 的 log() 自动记录。没有记录的实验 = 没做过的实验。

3. 结果表模板 ​

所有实验跑完后,汇总成一张主表(这是评估报告的核心):

算法环境最终回报(中位±IQR)成功率样本效率(AUC)训练步数seed 数超参来源
PPOCartPole-v1498 [496, 500]100%12.4k50k5调优
SACCartPole-v1497 [494, 500]100%9.8k50k5调优
........................

七、离线评估为什么这么难 ​

当你只有历史数据、不能在线试错时(推荐系统、交易、机器人日志),评估会进入另一个量级:你无法用"跑一遍环境"来打分,只能靠离线评估器。这里水非常深:

  • 行为策略与目标策略分布不同 → 轨迹权重偏差(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
定义问题 → 设计矩阵 → 锁变量 → 跑实验 → 聚合曲线 → 公平性自查 → 出报告 → 决策
   │          │         │        │        │          │          │        │
   └ 见第一节 └ 见第二节 └ 见第二/五节 └ 见第六节 └ 见第三/四节 └ 见第五节 └ 见第八节

调参实践中,评估与调参是同一个循环——你每调一个超参,其实就是在跑一次迷你评估(见调参与超参数优化)。两者共用同一套日志与曲线基础设施,区别只在统计严格度。

延伸阅读 ​

参考资料 ​

  • 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