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