15 · 实战与挑战项目
⏱ 项目 1–2 天 / 挑战 4–7 天 | ⭐ RL 尤其必须动手
🎯 一句话
RL 的算法看起来都很简单,但它们出错的方式和监督学习完全不同 —— 不会报错,只是学不出来。 这一章的四个项目,一半的价值在于让你亲眼看到那些失败模式。
🧰 开工前:三条 RL 特有的调试铁律
| 铁律 | 为什么 |
|---|---|
| ① 先在最简单的环境上跑通 ⭐ | 直接上 Atari 你分不清是算法错了还是超参不对 |
| ② 固定种子,跑多个种子 ⭐ | RL 的种子间方差极大 —— 一个种子的结果毫无意义 |
| ③ 画曲线,别只看最终分数 | RL 经常"先涨后崩",只看最后一个数会得出错误结论 |
因果链
⭐ 关于第 ② 条,一个必须知道的事实:
同一份代码、同一组超参,换 5 个随机种子,
在 MuJoCo 这类任务上结果可能相差【好几倍】
所以论文和你自己的实验,都必须报告【多个种子的均值±标准差】
pip install gymnasium numpy torch matplotlib
🥉 项目一:表格法三件套(1 天)
参考用时 · 45 分钟
自己实现FrozenLake或一个 5×5 格子世界(别用现成环境,自己写才懂状态转移)参考用时 · 60 分钟
价值迭代:算出最优价值函数和策略,可视化成箭头图参考用时 · 60 分钟
Q-learning:从零学,画出"每回合累计奖励"曲线参考用时 · 45 分钟
SARSA:同一环境跑一遍,和 Q-learning 对比参考用时 · 45 分钟
⭐ 悬崖行走实验:这是区分两者的经典环境参考用时 · 30 分钟
扫 ε:0.01 / 0.1 / 0.3 / 线性衰减,对比学习曲线
🎯 该看到的现象(T5 是重点)
因果链
悬崖行走(走边缘最短但掉下去 -100):
⭐ Q-learning 学到【最优路径】:贴着悬崖边走
但训练过程中因为 ε-贪心偶尔失足,【实际得分更低】
⭐ SARSA 学到【安全路径】:绕远一点
因为它是 on-policy,把"我会以 ε 概率乱走"也考虑进去了
这个差别就是 on-policy 和 off-policy 的直观体现 ⭐
✅ 通关标准
- 价值迭代的结果和 Q-learning 收敛到的策略一致
- 能解释悬崖行走里两者为什么不同
- ε 的对比曲线体现出探索-利用的权衡
🥈 项目二:DQN 打 CartPole(1–2 天)
目标:第 8 章。
参考用时 · 60 分钟
最朴素版本:故意不加经验回放和目标网络 → 看它怎么崩参考用时 · 60 分钟
加经验回放,对比参考用时 · 45 分钟
加目标网络,对比参考用时 · 45 分钟
调 ε 衰减策略参考用时 · 60 分钟
实现 Double DQN,对比 Q 值估计参考用时 · 45 分钟
⭐ 画 Q 值曲线:验证标准 DQN 的 Q 值系统性高于真实回报
🎯 该看到的数字
结果对照
CartPole-v1(满分 500):
T1 朴素版→剧烈震荡,经常回到 10 分左右 💀
T2 +经验回放→明显稳定
T3 +目标网络→能稳定到 400+ ✅
T5 Double DQN→Q 值估计明显更接近真实回报
⭐ T6 是这个项目的灵魂:
把"网络预测的 Q" 和 "实际跑出来的折扣回报" 画在一起
标准 DQN 的曲线会明显【偏高】
Double DQN 的曲线贴得更紧
✅ 通关标准
- T1 真的崩了(这一步别跳过 —— 亲眼看到才记得住)
- T3 能稳定通关
- T6 的高估现象可见
🥇 挑战 A:从零实现 PPO(3–4 天)
难度 ★★★★☆
- 实现 Actor-Critic 网络(共享 backbone + 两个头)
- ⭐ 实现 GAE(第 10 章)
- ⭐ 实现 裁剪目标(第 11 章)
- 加上那六个实现细节:优势标准化、梯度裁剪、log 空间算 ratio、熵奖励、观测归一化、学习率退火
- 在
CartPole上通关,再上LunarLander - ⭐ 消融实验:逐个关掉 T4 的六个细节,各跑 3 个种子,量化每个的贡献
- ⭐ 扫 clip ε:0.05 / 0.1 / 0.2 / 0.5,观察KL 散度怎么变
- (加分)连续动作版本(高斯策略),跑
Pendulum
🎯 该看到的现象
T6:一次关掉一项,和完整版本比较。
下面是本练习要检查的现象,不是所有种子都必然出现的结果。
| 关闭哪一项 | 观察什么 |
|---|---|
| 优势标准化 | 训练是否明显变慢或更不稳定 |
| 梯度裁剪 | 是否有种子出现发散 |
| 熵奖励 | 是否过早集中于某个动作,分数停滞 |
| 观测归一化 | LunarLander 的训练与最终表现是否明显改变 |
T7:单独扫描 ε。把 KL、训练速度与稳定性一起记录,检查增大裁剪范围后它们怎样变化。这里比较的是不同设置,不是一条“结构路径”。
✅ 通关标准
- LunarLander 稳定通关(200+ 分)
- T6 的消融表完成,每项都有 3 个种子的均值±标准差
- 能说清哪两个细节最关键
💡 这个项目做完,你会理解一件事: RL 论文里"我们的方法提升了 15%",很可能来自实现细节而不是算法本身。 这就是 RL 复现危机的根源。
🥇 挑战 B:迷你 RLHF(4–7 天)
难度 ★★★★★ | 把第 12、13 章跑通
对照
⚠️ 用【小模型】做(GPT-2 small 或更小),普通 GPU 就能跑
目标不是效果,是【把流程全跑通并看到那些现象】⭐
阶段 1:SFT(半天)
- 找一个小的指令数据集,微调一个小模型
阶段 2:奖励模型(1–2 天)
- 构造偏好数据(可以用规则生成:比如"更长的/更礼貌的算 chosen")
- ⭐ 实现 Bradley–Terry 损失训练 RM
- 评估 RM 在留出集上的成对准确率
- ⭐ 故意注入长度偏好,验证 RM 学到了它
阶段 3:对齐(2–3 天)
- 实现 DPO(第 13 章)—— 先做这个,因为它简单
- ⭐ 观察"概率下降现象":画出 chosen 和 rejected 的绝对对数概率
- 实现简化版 PPO(策略 + 参考 + RM + Critic)
- ⭐ 复现奖励攻击:把 KL 系数 β 设成 0,看模型怎么退化
- ⭐ 画出「奖励分数」和「KL 散度」两条曲线,找到它们分道扬镳的那个点
- 对比 DPO 和 PPO 的最终效果与训练成本
🎯 该看到的现象(这才是项目的产出)
操作步骤
⭐ T4:RM 对更长的回答系统性给高分
你亲手造出了"长度偏好"
⭐ T6:DPO 训练中,chosen 的绝对概率也在下降
亲眼看到第 13 章说的那个反直觉现象
⭐ T8(β=0):模型开始生成
· 极长的重复文本
· 疯狂使用某几个高分短语
· 完全不通顺但 RM 给分很高
这就是奖励攻击 💀
⭐ T9:奖励分数还在涨,但 KL 已经飙升
这个分叉点就是"该早停了"的信号
理解为什么第 12 章说【要盯 KL 而不是奖励】
✅ 通关标准
- RM 的成对准确率明显高于 50%
- T6 的概率下降现象可见
- T8 成功复现奖励攻击(这是最重要的一条)
- T9 的两条曲线画出来了,能指出分叉点
- 写一段对比:DPO vs PPO 的效果、成本、稳定性
🔑 这个项目的真正价值: 你会对"对齐"这件事产生一种健康的怀疑 —— 奖励分数上涨看起来很美好,但模型可能正在变成一个专门讨好评分器的东西。 这个直觉,看多少篇论文都不如亲手跑一次。
📝 报告模板
# 实验:____
## 环境与设定(含种子数量)
## 结果(曲线 + 均值±标准差) ← RL 必须有误差带
## 消融 / 对比
## 失败模式:我看到它怎么崩的 ← RL 特有的、最有价值的一节
## 我原本以为 ___,实际上 ___
🔗 这一章连到哪里
| 去哪 | 为什么 |
|---|---|
| 上线之后 17 | ⚠️ RL 实验对种子极其敏感,报告要能复现,先看那边的可复现清单 |
| Kaggle 04 | 实验记录与调参的工程做法,报告模板可以直接抄 |
| 推荐算法 20 | 同构的沙盘项目:也是自己造环境、自己观察策略把环境带偏 |
✅ 检查点
- RL 调试的三条铁律是什么?为什么第二条特别重要?
- 悬崖行走里 Q-learning 和 SARSA 的差别是什么?根源是什么?
- DQN 项目里为什么要先跑"故意不加修补"的版本?
- 怎么验证 DQN 的 Q 值高估?
- PPO 消融实验里,关掉哪两个细节影响最大?
- clip ε 变大时会观察到什么?这说明 clip 在控制什么?
- 迷你 RLHF 里怎么复现奖励攻击?
- "奖励曲线和 KL 曲线分道扬镳"意味着什么?
👀 答案
- ①先在最简单环境跑通 ②固定种子但要跑多个种子 ③画曲线不只看最终分数。第二条重要是因为 RL 的种子间方差极大——同一份代码同一组超参换 5 个种子,结果可能相差好几倍,一个种子的结果毫无意义。
- Q-learning 学到贴着悬崖的最优路径(但训练时因 ε-贪心偶尔失足,实际得分更低);SARSA 学到绕远的安全路径。根源:SARSA 是 on-policy,把"我会以 ε 概率乱走"也考虑进了价值估计。
- 因为亲眼看到它崩,才会记住经验回放和目标网络在解决什么。直接给你一个能跑的版本,你学不到那两个修补的必要性。
- 把网络预测的 Q 和实际跑出来的折扣回报画在一张图上——标准 DQN 的曲线会明显偏高,Double DQN 贴得更紧。
- 优势标准化(不做则训练明显变慢或不稳)和熵奖励(不做则早期就收敛到某个动作、分数卡住)。梯度裁剪则决定会不会偶尔某个种子直接发散。
- ε 越大 → KL 散度越大 → 训练越快但越容易崩。说明 clip 本质上就是在控制 KL。
- 把 KL 系数 β 设成 0,模型会开始生成极长的重复文本、疯狂使用高分短语、完全不通顺但 RM 给高分。
- 意味着模型正在钻奖励模型的漏洞而不是真的变好——这个分叉点就是"该早停了"的信号,也是第 12 章说"要盯 KL 而不是奖励"的实证。
🛑 完成了?
⚡ 走神救援
先记住这几件事
- 先在简单环境跑通,再增加复杂度;运行多个种子,画曲线和误差带。
- 表格法比较不同策略的路径;DQN 逐项加入稳定化措施,观察价值估计与实际回报。
- PPO 用消融实验比较实现细节,记录训练速度、稳定性和最终表现。
- 迷你 RLHF 同时看奖励、行为变化和散度;报告要留下失败模式,而不只展示最高分。