🏠 总目录📚 本教程 15 · 实战与挑战项目 ← →
📑 本页目录(点开跳转)

15 · 实战与挑战项目

⏱ 项目 1–2 天 / 挑战 4–7 天 | ⭐ RL 尤其必须动手


🎯 一句话

RL 的算法看起来都很简单,但它们出错的方式和监督学习完全不同 —— 不会报错,只是学不出来。 这一章的四个项目,一半的价值在于让你亲眼看到那些失败模式。


🧰 开工前:三条 RL 特有的调试铁律

铁律 为什么
① 先在最简单的环境上跑通 ⭐ 直接上 Atari 你分不清是算法错了还是超参不对
② 固定种子,跑多个种子 ⭐ RL 的种子间方差极大 —— 一个种子的结果毫无意义
③ 画曲线,别只看最终分数 RL 经常"先涨后崩",只看最后一个数会得出错误结论

因果链

⭐ 关于第 ② 条,一个必须知道的事实:
同一份代码、同一组超参,换 5 个随机种子,
在 MuJoCo 这类任务上结果可能相差【好几倍】
所以论文和你自己的实验,都必须报告【多个种子的均值±标准差】
pip install gymnasium numpy torch matplotlib

🥉 项目一:表格法三件套(1 天)

目标:把第 4–7 章全部跑一遍。

🎯 该看到的现象(T5 是重点)

因果链

悬崖行走(走边缘最短但掉下去 -100):
⭐ Q-learning 学到【最优路径】:贴着悬崖边走
但训练过程中因为 ε-贪心偶尔失足,【实际得分更低】
⭐ SARSA 学到【安全路径】:绕远一点
因为它是 on-policy,把"我会以 ε 概率乱走"也考虑进去了
这个差别就是 on-policy 和 off-policy 的直观体现 ⭐

✅ 通关标准


🥈 项目二:DQN 打 CartPole(1–2 天)

目标:第 8 章。

🎯 该看到的数字

结果对照

CartPole-v1(满分 500):
T1 朴素版→剧烈震荡,经常回到 10 分左右 💀
T2 +经验回放→明显稳定
T3 +目标网络→能稳定到 400+ ✅
T5 Double DQN→Q 值估计明显更接近真实回报
⭐ T6 是这个项目的灵魂:
把"网络预测的 Q" 和 "实际跑出来的折扣回报" 画在一起
标准 DQN 的曲线会明显【偏高】
Double DQN 的曲线贴得更紧

✅ 通关标准


🥇 挑战 A:从零实现 PPO(3–4 天)

难度 ★★★★☆

🎯 该看到的现象

T6:一次关掉一项,和完整版本比较。

下面是本练习要检查的现象,不是所有种子都必然出现的结果。

关闭哪一项观察什么
优势标准化训练是否明显变慢或更不稳定
梯度裁剪是否有种子出现发散
熵奖励是否过早集中于某个动作,分数停滞
观测归一化LunarLander 的训练与最终表现是否明显改变

T7:单独扫描 ε。把 KL、训练速度与稳定性一起记录,检查增大裁剪范围后它们怎样变化。这里比较的是不同设置,不是一条“结构路径”。

✅ 通关标准

  1. LunarLander 稳定通关(200+ 分)
  2. T6 的消融表完成,每项都有 3 个种子的均值±标准差
  3. 能说清哪两个细节最关键

💡 这个项目做完,你会理解一件事: RL 论文里"我们的方法提升了 15%",很可能来自实现细节而不是算法本身。 这就是 RL 复现危机的根源。


🥇 挑战 B:迷你 RLHF(4–7 天)

难度 ★★★★★ | 把第 12、13 章跑通

对照

⚠️ 用【小模型】做(GPT-2 small 或更小),普通 GPU 就能跑

目标不是效果,是【把流程全跑通并看到那些现象】⭐

阶段 1:SFT(半天)

阶段 2:奖励模型(1–2 天)

阶段 3:对齐(2–3 天)

🎯 该看到的现象(这才是项目的产出)

操作步骤

⭐ T4:RM 对更长的回答系统性给高分
你亲手造出了"长度偏好"
⭐ T6:DPO 训练中,chosen 的绝对概率也在下降
亲眼看到第 13 章说的那个反直觉现象
⭐ T8(β=0):模型开始生成
· 极长的重复文本
· 疯狂使用某几个高分短语
· 完全不通顺但 RM 给分很高
这就是奖励攻击 💀
⭐ T9:奖励分数还在涨,但 KL 已经飙升
这个分叉点就是"该早停了"的信号
理解为什么第 12 章说【要盯 KL 而不是奖励】

✅ 通关标准

  1. RM 的成对准确率明显高于 50%
  2. T6 的概率下降现象可见
  3. T8 成功复现奖励攻击(这是最重要的一条)
  4. T9 的两条曲线画出来了,能指出分叉点
  5. 写一段对比:DPO vs PPO 的效果、成本、稳定性

🔑 这个项目的真正价值: 你会对"对齐"这件事产生一种健康的怀疑 —— 奖励分数上涨看起来很美好,但模型可能正在变成一个专门讨好评分器的东西。 这个直觉,看多少篇论文都不如亲手跑一次。


📝 报告模板

# 实验:____
## 环境与设定(含种子数量)
## 结果(曲线 + 均值±标准差)      ← RL 必须有误差带 
## 消融 / 对比
## 失败模式:我看到它怎么崩的      ← RL 特有的、最有价值的一节 
## 我原本以为 ___,实际上 ___

🔗 这一章连到哪里

去哪 为什么
上线之后 17 ⚠️ RL 实验对种子极其敏感,报告要能复现,先看那边的可复现清单
Kaggle 04 实验记录与调参的工程做法,报告模板可以直接抄
推荐算法 20 同构的沙盘项目:也是自己造环境、自己观察策略把环境带偏

✅ 检查点

  1. RL 调试的三条铁律是什么?为什么第二条特别重要?
  2. 悬崖行走里 Q-learning 和 SARSA 的差别是什么?根源是什么?
  3. DQN 项目里为什么要先跑"故意不加修补"的版本?
  4. 怎么验证 DQN 的 Q 值高估?
  5. PPO 消融实验里,关掉哪两个细节影响最大?
  6. clip ε 变大时会观察到什么?这说明 clip 在控制什么?
  7. 迷你 RLHF 里怎么复现奖励攻击?
  8. "奖励曲线和 KL 曲线分道扬镳"意味着什么?
👀 答案
  1. ①先在最简单环境跑通 ②固定种子但要跑多个种子 ③画曲线不只看最终分数。第二条重要是因为 RL 的种子间方差极大——同一份代码同一组超参换 5 个种子,结果可能相差好几倍,一个种子的结果毫无意义。
  2. Q-learning 学到贴着悬崖的最优路径(但训练时因 ε-贪心偶尔失足,实际得分更低);SARSA 学到绕远的安全路径。根源:SARSA 是 on-policy,把"我会以 ε 概率乱走"也考虑进了价值估计。
  3. 因为亲眼看到它崩,才会记住经验回放和目标网络在解决什么。直接给你一个能跑的版本,你学不到那两个修补的必要性。
  4. 把网络预测的 Q 和实际跑出来的折扣回报画在一张图上——标准 DQN 的曲线会明显偏高,Double DQN 贴得更紧。
  5. 优势标准化(不做则训练明显变慢或不稳)和熵奖励(不做则早期就收敛到某个动作、分数卡住)。梯度裁剪则决定会不会偶尔某个种子直接发散。
  6. ε 越大 → KL 散度越大 → 训练越快但越容易崩。说明 clip 本质上就是在控制 KL。
  7. 把 KL 系数 β 设成 0,模型会开始生成极长的重复文本、疯狂使用高分短语、完全不通顺但 RM 给高分。
  8. 意味着模型正在钻奖励模型的漏洞而不是真的变好——这个分叉点就是"该早停了"的信号,也是第 12 章说"要盯 KL 而不是奖励"的实证。

🛑 完成了?

去附录 A 把公式和超参过一遍,然后回总目录。


⚡ 走神救援

先记住这几件事

打卡记录保存在你的浏览器里,首页能看到总进度