第 20 讲 · 推理模型 · Reasoning Models(+ 机制可解释性)

Generative AI · Lecture 20。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应 Maps to:CMU 10-423 / 10-623 / 10-723 Generative AI(Aran Nayebi、Matt Gormley),Lecture 20 · Mon 30-Mar · Reasoning Models + Mechanistic Interpretability(slides:lecture20-reasoning)。 阅读材料:Wei et al. (2022), Chain-of-Thought Prompting;Kojima et al. (2022), Large Language Models are Zero-Shot Reasoners;Zelikman et al. (2022), STaR;OpenAI (2024), Learning to Reason with LLMs(o1 的博客);Shao et al. (2024), DeepSeekMath(GRPO);DeepSeek-AI (2025), DeepSeek-R1;Elhage et al. (2022), Toy Models of Superposition;Lindsey et al. (2025), On the Biology of a Large Language Model。 依据说明:本讲按原课第 20 讲公开的 slides 展开:思维链提示与零样本思维链(回顾);o1 解一道密码题的思考过程(结论是”strawberry 里有三个 r”);o1 只公开思考的摘要;STaR;AIME 数据集;o1 的两个结果(训练时计算、测试时计算越多越好)和”为什么描述这么含糊”;开源模型追上来:DeepSeek-R1;PPO vs GRPO;R1-Zero 的训练方法、基于规则的奖励、结果(AIME 越训越好、思考越来越长)、问题(可读性差、语言混杂);R1 的多阶段流程;后半讲的机制可解释性:叠加让解释变难、归因图。所有实验是本讲义自己设计的,不代表课堂上讲了什么。 配套代码 Code:code/lecture20/(5 个脚本 + 1 个模块;01、03 第一次各约 1–2.5 分钟,其余几秒到 1 分钟) 预计阅读时间:2.5 小时(含运行代码)


0. 本讲导航 · How to read this lecture

0.1 学习目标 Learning goals

学完这一讲,你应该能够:

  1. 说明”推理模型”和”会用思维链的模型”差在哪里:训练时用强化学习教它想,测试时让它想得更久。
  2. 区分两种测试时计算——串行(想得更长)和并行(采样多次、投票或用验证器挑),说出各自什么时候有效。
  3. 描述 STaR 的循环,指出它的前提(模型要能”偶尔做对”)和弱点(蒙对的思考链)。
  4. 写出 GRPO 的优势和目标函数,说明它为什么不需要价值模型、省了多少显存。
  5. 解释 R1-Zero 的”思考越练越长”在机制上可能是怎么来的,以及基于规则的奖励的好处。
  6. 用玩具模型解释叠加,说出稀疏自编码器怎样把叠加的特征拆开。

0.2 先修与本讲范围 Prerequisites & scope

默认你已经会 Assumed本讲只给直觉,后面再展开 Previewed only
第 11 讲 §4:思维链;第 3 讲:采样过程奖励模型(PRM)的训练、蒙特卡洛树搜索
第 12 讲 §3:REINFORCE、PPO、KL 惩罚o3、R1 之后的推理模型细节(博客为主,公开信息少)
第 15 讲:训练计算;第 17 讲:显存账归因图的完整方法(转码器、剪枝)

0.3 本讲地图 Map

§1  从思维链到推理模型:o1 的密码题、训练时和测试时计算         (slides)
§2  一个"会选择想多久"的小模型                                   ← 代码 01
§3  测试时计算:串行与并行                                       ← 代码 02
§4  STaR:用自己写对的思考链训练自己                              ← 代码 03
§5  强化学习:DeepSeek-R1-Zero、GRPO、"越想越长"                 ← 代码 04
§6  R1:多阶段训练                                               (slides)
§7  机制可解释性:叠加与稀疏自编码器                               ← 代码 05
§8–12  小结、误区、练习、延伸阅读、下一讲

本讲的实验都在 reason_lab.py 的一个小世界里:模型要算 k 个数字的和(取模 10),可以选择直接回答、简略地想、或完整地想。


1. 从思维链到推理模型 · From CoT to reasoning models

1.1 回顾:思维链

slides 先回顾第 11 讲:思维链提示(Wei et al., 2022)在少样本例子里写出推理过程,模型就会模仿着先推理、再回答;甚至只说一句”Let’s think step by step”(Kojima et al., 2022)也有用。第 11 讲 §4.2 给过一个计算上的解释:Transformer 每生成一个 token 只做固定层数的计算,写下的中间结果就是它的草稿纸。

思维链提示是”推理时请它想”;推理模型(reasoning model)是”训练它想”——它在回答之前先生成很长的”思考”,而这种行为是用强化学习专门练出来的。

1.2 o1 解一道密码题

slides 展示了 OpenAI o1 博客里的例子。题目:已知 “oyfjdnisdr rtqwainr acxz mynzbhhx” 解码后是 “Think step by step”,请解码另一串密文。o1 的思考(节选):

  • 先数字母:明文 “Think step by step” 去掉空格是 15 个字母(它先说成 18,再一个词一个词数出 15——“Hmm.”);密文是 30 个字母。
  • “密文的每个词恰好是明文对应词的两倍长(10 vs 5、8 vs 4、4 vs 2、8 vs 4)”——“也许要每两个字母还原一个”。
  • 试 “oy” → “T”:o = 15、y = 25,和 = 40,但 T = 20……(最后发现是两个字母序号的平均)。
  • 一千两百多行之后:解出的明文是 “THERE ARE THREE R’S IN STRAWBERRY”。

这个结论本身是个玩笑:早期的 LLM 常常数错 “strawberry” 里有几个 r。原因在第 3 讲讲过的分词:模型看到的不是字母,而是 “str”、“aw”、“berry” 这样的 token,“有几个 r”这种信息不在它的输入里,只能靠记忆”这个 token 里有哪些字母”。推理模型会先把单词逐个字母拼出来、再数——又一次”把计算写在纸上”。

slides 还指出:o1 选择不公开思考的原文,只给用户看一段摘要。

1.3 o1 的两个结果

o1 用强化学习训练,生成思维链式的推理过程(“思考 token”)再回答。博客的两张图:

  • 训练时计算越多(更多的强化学习),AIME 上的准确率越高;
  • 测试时计算越多(想得越久),准确率也越高。

AIME 是美国数学邀请赛,每道题的答案是 0–999 的整数——答案对不对一目了然,这一点后面很重要(§5)。o1 在数学、推理、常识、编程等题目上都明显超过 GPT-4o。

slides 自问自答:“为什么这些描述如此含糊、不技术?因为 OpenAI 只发了一篇博客,这差不多就是它说的全部。“闭源模型明显领先于开源模型,“于是我们等着开源模型追上来……”——这就是 §5 的 DeepSeek-R1。


2. 一个”会选择想多久”的小模型(代码 01)

2.1 任务

题目:k 个数字(k = 2…8),答案是它们的和取模 10。题目写在固定宽度的 8 个格子里(空格子是 ”_”)。模型在 ”=” 之后先写一个格式记号:

直接回答 A:   <s> 3 5 9 2 7 _ _ _ = A 6 </s>
简略思考 S:   <s> 3 5 9 2 7 _ _ _ = S 8 9 6 A 6 </s>        每两个数字写一次累加和:一步加两个数
完整思考 T:   <s> 3 5 9 2 7 _ _ _ = T 3 8 7 9 6 A 6 </s>    每个数字写一次累加和:一步只加一个数

直接回答只生成 3 个 token,完整思考要 k + 4 个。基础模型(第 2 讲的 GPT,20 万参数、4 层)先只练思考链 2000 步,再用三种格式 50% / 30% / 20% 的数据练 1500 步——它学会了三种写法,但更常”偷懒”。(为什么分两个阶段:三种格式一开始就混在一起时,模型 5000 步都停在平台上——见 README。)

2.2 强制用某种写法

k直接 A简略 S完整 T
20.9581.0001.000
40.2700.9801.000
60.0950.8920.998
80.1050.8800.993

(贪心解码,每格 400 道新题。)同一个模型、同样的参数,差别只在”写不写、写多细”:直接回答 k ≥ 5 时就退到瞎猜(0.1),完整思考到 k = 8 还是 0.993。

要小心解读:“直接回答差”不等于”一次前向算不出来”。求和满足结合律,4 层的网络原则上可以像一棵树那样两两相加(log₂8 = 3 层);我们训练的一个试验模型多练了直接回答,k = 8 直接回答能到 0.85(README)。基础模型只是还没学会这种一步到位的算法——而”每步只加一个数”容易学得多。真正必须串行的问题(不满足结合律的多步推理)上,思考的作用更不可替代。

2.3 让模型自己选

温度 1 采样,模型自己决定写法:

k选直接选简略选完整答对平均长度
20.470.310.220.9684.3
50.430.320.250.5985.8
80.480.290.220.4956.5

它选格式的比例就是”预训练”数据里的比例,和题目难易无关——它学会了怎样想,却没学会什么时候该想。所有 k 平均只答对 0.677。这就是一个”会思维链、但不是推理模型”的基础模型。接下来两条路:测试时多花计算(§3),训练时教它多想(§4、§5)。


3. 测试时计算 · Test-time compute(代码 02)

在难题(k = 6、7、8)上比较两种增加测试时计算的方式。

3.1 串行:想得更久

写法(温度 1)每道题生成的 token答对
直接3.00.083
简略7.70.880
完整11.00.967
自己选6.40.567

强制它”想完整”——这就是 o1 那张”测试时计算越多越准”的图最简单的版本。

3.2 并行:采样 N 次

每道题采样 N 条回答(模型自己选写法),三种挑法:

  • 多数投票(自一致性,Wang et al., 2023):取出现最多的答案;
  • 验证器:挑一条中间步骤全对的(只用题目本身逐步检查加法,不需要知道标准答案);
  • pass@N:N 条里只要有一条对就算对——“有一个完美的判官”时的上限。
N每道题的 token多数投票验证器pass@N
160.5830.5830.583
4260.7700.9370.957
161030.9400.9971.000
322060.9571.0001.000

投票有效,是因为直接回答的错误答案散落在 10 个数字上、互相抵消,而思考链给出的答案彼此一致、“抱团”。验证器更强:它能认出哪条是对的。但它只能检查有中间步骤的回答——“把推理写出来”的另一个好处是它可以被检查。R1 用规则检查最终答案(§5),过程奖励模型(PRM)则给每一步打分。

3.3 同样的预算:长回答还是很多短回答?(k = 8)

做法token答对
直接回答 × 16 条,投票480.160
简略思考 × 1 条80.900
完整思考 × 1 条121.000

16 条直接回答投票(48 个 token)还不如 1 条完整思考(12 个 token)。这个模型一次前向做不完 8 个数的加法,直接回答采样再多次,也只是在错误答案里挑;完整思考把它拆成 8 次”加一个数”,每一步它都会。在模型”一步做不完”的题上,串行地想得更久,是并行采样替代不了的(Snell et al., 2024 系统比较了两种测试时计算)。反过来,如果模型一步就能做对,多想只是浪费——§5.4 会回到这一点。


4. STaR:用自己写对的思考链训练自己(代码 03)

4.1 算法

slides:Self-Taught Reasoner(Zelikman et al., 2022)。

  • 数据:少量人写的思考链 + 大量只有答案、没有思考链的题。
  • 反复做:用少量例子(上下文学习)让模型为没有思考链的题生成思考链;答案错了,就给它答案作为提示、让它重新生成一条通向正确答案的思考链(“合理化” rationalization);用所有得到正确答案的思考链微调。

关键在过滤:只留”答案对了”的思考链——不需要人检查过程,只需要知道答案。

4.2 我们的实验

起点模型只见过 150 条人写的完整思考链(k = 2…8),其余训练数据都是只有答案的直接回答。题库 2000 道题、只有答案。每一轮:让上一轮的模型对每道题强制完整思考、采样 4 次,留下第一条答案对的;从起点模型出发用这些思考链微调 600 步(STaR 每一轮都从原模型重新开始)。

轮留下的思考链其中 k ≥ 7答案对、思考链错
11753(87.6%)36017(1.0%)
21970(98.5%)51317(0.9%)
31992(99.6%)53313(0.7%)

完整思考的准确率(贪心):

模型k = 24678
起点1.000.940.830.760.47
STaR 第 1 轮1.001.000.980.970.88
STaR 第 2 轮1.001.000.990.990.94
STaR 第 3 轮1.001.000.960.980.90
对照:只用答案微调,直接回答0.980.140.120.090.11

k = 7、8 的完整思考:起点 0.61 → 第 1 轮 0.93 → 第 2 轮 0.97 → 第 3 轮 0.94。模型没有再看到任何人写的思考链,只靠”自己写、留下答案对的、再学”。第 1 轮的提升最大:起点模型在长题上已经有一半左右能写对,这些写对的思考链就是新的训练数据;之后留下的已经接近题库的全部,再多几轮也学不到更多。对照组用同样的题、同样的答案直接微调,长题的直接回答毫无起色(0.11 → 0.10)——STaR 多做的只是”先让模型写出过程,再挑对的学”。

4.3 STaR 的前提与弱点

  • 蒙对的思考链:答案只有 10 种,错的思考链有约 1/10 的机会蒙对。STaR 只看答案,会把它们也学进去。这里只占 1% 左右,因为模型多数时候写得对,而且错法五花八门、互相抵消。
  • 前提是”偶尔能做对”:我们的第一版实验用一个只学过 k ≤ 4 的起点模型,想让 STaR 自己把能力扩展到更长的题。结果它在 k = 5 的题上几乎写不出第 5 步:第 1 轮留下的 928 条思考链里,k > 4 的只有 23 条,而”答案对、思考链错”的有 25 条——长题上留下来的基本是蒙对的;4 轮之后 k ≥ 5 的完整思考仍然只有 0.04–0.13(README 记录了这个失败)。STaR 不能从 0 学起;论文的”合理化”(给出答案让模型倒推过程)就是为了从做不对的题里也拿到训练信号。

STaR 是后来”拒绝采样微调”(R1 的第三阶段,§6)和强化学习式推理训练的前身:用可以自动检查的答案,代替人写的推理过程。


5. 强化学习:DeepSeek-R1-Zero 与 GRPO(代码 04)

5.1 R1-Zero 的训练方法

slides:DeepSeek-R1 是 6710 亿参数、开源权重的模型,在 DeepSeek-V3 基础模型上精心调出来,性能和 o1 相当。先看它的前身 R1-Zero:

  • 完全用强化学习训练,没有任何 SFT;从预训练的 DeepSeek-V3-Base 出发,不用人类偏好。
  • 是最早的大规模”只用 RL”训练 LLM 的例子之一;想看推理能力能不能只靠 RL 涌现出来、不需要标注数据。
  • 奖励模型不是神经网络,而是基于规则的两部分:准确率奖励(答对没有——数学题对答案、编程题跑测试)和格式奖励(有没有把思考写在 <think> 和 </think> 之间)。

基于规则的奖励不会被”钻空子”(第 12 讲 §3.4 的奖励欺骗),这正是 AIME 这类”答案一目了然”的任务适合 RL 的原因,也叫可验证奖励的强化学习(RLVR)。

5.2 GRPO

slides:DeepSeekMath 提出了 GRPO——一个类似 PPO 的 RL 算法,但去掉了价值模型,大大减少了显存需求。

回顾第 12 讲:PPO 需要一个价值模型 V(s)V(s) 给出基线,优势 AtA_t 由它(和 GAE)估计。GRPO 的做法:对每道题 qq,用旧策略采样一组 GG 个回答 o1,…,oGo_1, \ldots, o_G,得到奖励 r1,…,rGr_1, \ldots, r_G,组内标准化:

A^i=ri−mean(r1,…,rG)std(r1,…,rG)\hat A_{i} = \frac{r_i - \mathrm{mean}(r_1, \ldots, r_G)}{\mathrm{std}(r_1, \ldots, r_G)}

回答 oio_i 的每个 token 都用这个优势。目标函数(每个回答在自己的 token 上平均、再在回答之间平均):

1G∑i=1G1∣oi∣∑t[min⁡(ρi,tA^i, clip(ρi,t,1−ε,1+ε)A^i)−β DKL],ρi,t=πθ(oi,t∣q,oi,<t)πold(oi,t∣q,oi,<t)\frac{1}{G}\sum_{i=1}^{G}\frac{1}{|o_i|}\sum_{t}\Big[\min\big(\rho_{i,t}\hat A_i,\ \mathrm{clip}(\rho_{i,t}, 1-\varepsilon, 1+\varepsilon)\hat A_i\big) - \beta\,\mathbb{D}_{KL}\Big],\quad \rho_{i,t} = \frac{\pi_\theta(o_{i,t}\mid q, o_{i,<t})}{\pi_{\text{old}}(o_{i,t}\mid q, o_{i,<t})}

KL 项用 DeepSeekMath 的无偏估计(逐 token):DKL=πrefπθ−log⁡πrefπθ−1\mathbb{D}_{KL} = \frac{\pi_{\text{ref}}}{\pi_\theta} - \log\frac{\pi_{\text{ref}}}{\pi_\theta} - 1(总是 ≥ 0)。和第 12 讲的 PPO 相比:同一道题的几个回答互相当基线——比平均好的被加强、比平均差的被削弱,不需要另一个网络去估计”平均能得多少分”。

04 第 4 部分算了 8B 策略时的显存账(混合精度 Adam,16 字节 / 参数):策略 128 GB、参考模型 16 GB、奖励模型 16 GB、价值模型 128 GB(和策略一样大、也要训练)。PPO 共约 289 GB,GRPO(规则奖励,不要奖励模型)约 145 GB——几乎省一半;代价是每道题要采样一组回答。

5.3 R1-Zero 的结果

  • AIME 2024 的 pass@1 随 RL 训练从 15.6% 涨到 71.0%(多数投票 cons@64:86.7%);slides:“训练得越久越好,最终超过了 o1 的表现”。
  • 思考越来越长:slides:“模型逐渐学会用越来越长的思考 token 序列;这完全来自强化学习的目标;没有任何直接增加推理长度的做法。“论文还描述了一个”aha moment”:模型在思考中途停下来重新审视自己的做法。
  • 问题:可读性差(人看不懂它在写什么);语言混杂(英文、中文混成一种”洋泾浜”)。

5.4 我们的 GRPO(代码 04)

从 §2 的基础模型出发(它常常偷懒直接回答),每步 16 道题 × 每题 8 个回答(k = 2…8),奖励 = 答对 1 + 格式完整 0.1,学习率 1e-4,150 步:

做法答对(前 25 步 → 最后 25 步)回答长度直接回答的比例完整思考的比例
GRPO,β = 0.040.848 → 0.9716.5 → 7.90.23 → 0.010.32 → 0.47
GRPO,β = 00.847 → 0.9916.5 → 8.00.23 → 0.000.32 → 0.51
REINFORCE,不减基线0.717 → 0.6505.5 → 5.10.45 → 0.540.22 → 0.12

(第 1 步时三者相同:答对 0.727、直接 / 简略 / 完整 = 0.37 / 0.35 / 0.27。)

  • “越想越长”的小模型版:奖励里没有任何一项鼓励写长;长度变长,是因为写出思考过程的回答更常答对,在同一道题的一组回答里优势为正、被一点点强化;直接回答在长题上常错、优势为负、被压下去。要注意我们的模型本来就会思考——RL 只是让它更常去用;R1-Zero 的基础模型从预训练里也学到了很多推理的写法,RL 是把它们”选”出来。
  • 基线很重要:不减基线的 REINFORCE 越练越差、越练越懒。所有奖励都 ≥ 0(答错但格式完整也有 0.1),每个被采到的回答都会被加强一点,模型本来最常做的事(直接回答)被加强得最多。组内平均做基线,“比平均差”的回答才会得到负的优势。
  • KL 惩罚在 150 步、这么小的学习率下影响不大(最后的 KL:β = 0.04 时 0.100,β = 0 时 0.062)。

训练之后,按题目长短看它怎样选(温度 1):

模型k答对选直接选完整平均长度
基础模型20.9680.390.294.5
基础模型80.5730.400.277.1
GRPO21.0000.010.525.5
GRPO80.9780.010.5110.0

GRPO 之后,连 k = 2 的易题也几乎不再直接回答——它没有学会”易题少想、难题多想”,而是处处都想。原因很简单:奖励里没有长度的代价,易题上多想不吃亏。这和真实推理模型的一个常见批评(“想得太多”,overthinking)是同一回事;后来很多工作在奖励里加入长度惩罚或思考预算。


6. DeepSeek-R1:多阶段训练

slides:R1 在 R1-Zero 的基础上用了混合的训练策略,解决 R1-Zero 的问题(重复、语言混杂),强调可读性、连贯性和准确率:

  1. 冷启动:先用几千条高质量的长思维链数据做 SFT——让输出可读、有固定的格式;
  2. 面向推理的 RL:和 R1-Zero 一样的规则奖励,另加语言一致性奖励(思考里目标语言的词占的比例),减少语言混杂;
  3. 拒绝采样 + SFT:用上一步的模型对大量题目采样,只留正确的回答(约 60 万条推理数据——这就是 §4 的 STaR 思路,规模大得多),再加约 20 万条非推理数据(写作、问答等),从基础模型重新做 SFT;
  4. 面向所有场景的 RL:推理题继续用规则奖励,一般问题用奖励模型(有用性、无害性)。

R1 的论文还把 R1 的推理能力”蒸馏”到小模型:用 R1 生成的 80 万条数据直接 SFT Qwen、Llama 的小模型,效果比在小模型上直接做 RL 还好。


7. 机制可解释性:为什么难——叠加(代码 05)

7.1 slides 的问题

slides 后半讲转向机制可解释性:我们能不能打开模型,看它在”想”的时候内部到底做了什么?“为什么可解释性难?叠加(superposition)是一个主要问题:‘特征’很少只在一个位置被激活;一个人能理解的特征,它的激活几乎总是分散在网络的很多位置上——跨注意力头、跨 MLP 神经元、跨层。”

7.2 玩具模型里的叠加(代码 05 第 1、2 部分)

Elhage et al. (2022) 的最小例子:20 个”特征”,每个以概率 1−S1 - S 出现(出现时取 [0, 1] 的均匀值),重要性 0.7i0.7^i 递减;压进 5 维的隐藏向量 h=Wxh = Wx,再还原 x′=ReLU(W⊤h+b)x' = \mathrm{ReLU}(W^\top h + b)。

模型稀疏度 S被表示的特征每个特征占几维
线性输出0 / 0.95 / 51.00
ReLU 输出051.00
ReLU 输出0.780.63
ReLU 输出0.990.56
ReLU 输出0.99110.39
  • 线性模型不管多稀疏都只表示最重要的 5 个特征,每个独占一维——就是主成分分析的解。
  • 加上 ReLU、特征又稀疏时,5 维里放下了远多于 5 个特征。特征越稀疏,同时出现、互相干扰的机会越小,模型越愿意把它们挤进同一个空间,代价是串扰;ReLU 能把小的负串扰截成 0,这是非线性让叠加”划算”的原因。没被表示的是最不重要的那些(第 11 个特征的重要性只有 0.020)。
  • W⊤WW^\top W 里出现了”对跖对”:S = 0.9 时有 4 对特征方向几乎相反(余弦 −1.00)——两个特征共用一维、一正一负,它们很少同时出现。

后果:如果你去看隐藏层的某一维(或真实网络的某个神经元),它同时对好几个不相关的特征有反应(多义神经元,polysemantic)。逐个神经元去解释网络,从一开始就走不通。

7.3 稀疏自编码器把它拆开(代码 05 第 3 部分)

既然特征是”很多方向、稀疏地出现”,那就去找这些方向:训练一个稀疏自编码器(SAE,Bricken et al., 2023),只看隐藏向量 hh,用一个比 hh 宽得多的字典(这里 40 列)重建它,并加 L1 惩罚让每次只用很少几列。S = 0.9 的模型里被表示的 9 个特征,9 个都在字典里找到了余弦 > 0.9 的方向——SAE 没见过真实的特征,只靠”稀疏地重建”就把挤在 5 维里的特征拆了出来。

7.4 归因图

slides 最后展示了 Anthropic 的”归因图”(attribution graphs,Lindsey et al., 2025 On the Biology of a Large Language Model):先用 SAE 的变体(转码器 transcoder)把每一层的激活拆成可解释的特征,再追踪”这个回答是由哪些特征、经过哪几步算出来的”。论文里的例子包括:回答”达拉斯所在州的首府”时,模型内部先出现”得克萨斯”的特征、再到”奥斯汀”——一个真实的两跳推理;写押韵的诗时,模型在写下一行之前就”计划”好了要押的词。这让我们可以检查推理模型写出来的思考,和它内部真正的计算是否一致——第 11 讲 §4.3 的”思维链是否忠实”问题,第 26 讲还会回来。


8. 小结 · Summary

  1. 推理模型 = 训练时用 RL 教它”想”,测试时让它”想得更久”;o1 的两条曲线就是这两种计算的规模定律。
  2. 测试时计算:串行(想得更长)在”一步做不完”的题上不可替代;并行(投票、验证器)能把一个不稳定的模型变稳定;能被检查的思考过程让验证器成为可能。
  3. STaR:只用答案过滤自己生成的思考链,就能把 150 条人写的思考链放大成 2000 条;前提是模型能偶尔做对,弱点是蒙对的思考链。
  4. GRPO:组内标准化的奖励代替价值模型,省一半显存;基于规则的可验证奖励不会被钻空子。
  5. “越想越长”可以完全来自”答对”这一个奖励:写出过程的回答更常答对、优势为正;没有长度代价时,模型会处处都想。
  6. 叠加让单个神经元无法解释;稀疏自编码器能把叠加的特征拆回来,归因图在此之上追踪推理的步骤。

9. 常见误区 · Common pitfalls

  • “推理模型的能力来自 RL 发明的新技能。” 在我们的实验里,RL 只是把模型本来就会、但很少用的写法(完整思考)选了出来(0.27 → 0.51)。R1-Zero 的基础模型同样从预训练里学过大量推理文本。
  • “采样越多次越好。” 模型一步做不完的题,16 条直接回答投票(0.160)还不如 1 条完整思考(1.000)。
  • “不加基线的 REINFORCE 只是方差大一点。” 奖励全为正时它会强化模型已有的习惯:我们的模型越练越懒(直接回答 0.45 → 0.54)、越练越差。
  • “思考越长越好。” 没有长度代价时模型在 k = 2 的易题上也写完整的思考链;真实系统要在准确率和延迟、成本之间取舍。
  • “直接回答答不对,说明一次前向算不出来。” 我们的基础模型只是没学会;多练了直接回答的试验模型 k = 8 能到 0.85。
  • “STaR 只要题目和答案,什么都能学会。” 起点模型在某类题上一次都做不对时,留下来的只有蒙对的思考链,学不到东西。
  • “一个神经元对应一个概念。” 叠加让一维里塞进好几个特征(我们:5 维放下 9–11 个)。

10. 练习 · Exercises

练习 1(多数投票)。 一个模型每次答对的概率是 0.6,答错时等可能地给出另外 9 个答案之一。采样 3 次多数投票(三个都不同时取第一个),答对的概率是多少?

参考答案

至少两次答对:3×0.62×0.4+0.63=0.6483 \times 0.6^2 \times 0.4 + 0.6^3 = 0.648;只有第一次答对、另外两个错且不相同(此时三个各不相同,取第一个):0.6×0.42×8/9=0.08530.6 \times 0.4^2 \times 8/9 = 0.0853。共 0.733。投票的收益来自”错误答案分散、正确答案集中”;如果错误答案也集中在某一个值上,投票就不灵了。

练习 2(GRPO 的优势)。 一组 8 个回答的奖励是 [1.1, 1.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1](两个答对,所有格式都对)。用样本标准差算每个回答的优势。如果 8 个都答对呢?

参考答案

均值 0.35,样本标准差 0.463:答对的 A^=(1.1−0.35)/0.463=1.62\hat A = (1.1 - 0.35)/0.463 = 1.62,答错的 −0.54-0.54。8 个都答对时奖励全相同、优势全为 0——这道题不提供任何学习信号(太容易或太难的题都一样)。所以 GRPO 的训练数据要”难度合适”,很多工作会筛掉全对或全错的题。

练习 3(为什么不减基线会变懒)。 用 §5.4 的设定解释:只有正奖励时,REINFORCE 的梯度期望为什么会增加”已经很常见的行为”的概率?加一个常数基线 bb 为什么不改变梯度的期望、却改变了这件事的结果?

参考答案

梯度 E[r(y)∇log⁡π(y)]\mathbb{E}[r(y)\nabla\log\pi(y)]:每个被采到的 yy 都被往上推 r(y)≥0r(y) \ge 0 的量。期望上它等于 ∇E[r]\nabla\mathbb{E}[r]——方向本身没错,但单次估计里,被采到的(常见的)行为总是被推高,没被采到的被动地变低;在小批量、有限步数下,这让分布向常见行为集中(“富者愈富”),尤其是常见行为的奖励并不低时(我们的直接回答在易题上是对的,答错也有 0.1)。减去基线后 E[(r−b)∇log⁡π]=E[r∇log⁡π]−b∇∑π=\mathbb{E}[(r - b)\nabla\log\pi] = \mathbb{E}[r\nabla\log\pi] - b\nabla\sum\pi = 同一个期望(因为 ∑yπ(y)=1\sum_y \pi(y) = 1),但单次估计里低于平均的回答被往下推,方差小得多,学习的方向更接近真实梯度。

练习 4(STaR 的蒙对率)。 一个模型的思考链有一半是错的;错的思考链的答案在 10 个数字上均匀分布。STaR 留下的思考链里,蒙对的占多少?

参考答案

留下的 = 对的 0.5 + 蒙对的 0.5×0.1=0.050.5 \times 0.1 = 0.05,蒙对的占 0.05/0.55≈9%0.05/0.55 \approx 9\%。思考链对的比例越低,这个比例越高:只有 10% 写对时,蒙对的占 0.09/0.19≈47%0.09/0.19 \approx 47\%——这就是我们第一版”从 k ≤ 4 扩展”失败的原因。

练习 5(显存)。 用 §5.2 的算法,策略是 70B 时 PPO 和 GRPO(规则奖励)各要多少显存(不算激活值)?

参考答案

70B × 16 字节 = 1120 GB(策略);参考模型 140 GB;奖励模型 140 GB;价值模型 1120 GB。PPO ≈ 2520 GB,GRPO ≈ 1260 GB。每一项都还要用第 17 讲的 ZeRO / 张量并行切到很多块 GPU 上。

练习 6(叠加)。 玩具模型里,ReLU、S = 0.99 时每个特征占 0.39 维、表示了 11 个特征。(a) ∥W∥F2\|W\|_F^2 约是多少?(b) 为什么线性模型永远只表示 5 个?

参考答案

(a) 每个特征占的维数定义为 m/∥W∥F2m/\|W\|_F^2,所以 ∥W∥F2=5/0.39≈12.8\|W\|_F^2 = 5/0.39 \approx 12.8(11 个特征的 ∥Wi∥2\|W_i\|^2 都略大于 1)。(b) 线性输出时 x′=W⊤Wx+bx' = W^\top W x + b,W⊤WW^\top W 的秩最多是 5,最小化加权平方误差的解就是保留最重要的 5 个方向(主成分);任何串扰都直接进入输出、没法被截掉,所以叠加从来不划算。

11. 延伸阅读 · Further reading

  • 思维链与测试时计算:Wei et al. (2022);Kojima et al. (2022);Wang et al. (2023), Self-Consistency;Lightman et al. (2023), Let’s Verify Step by Step(过程奖励);Snell et al. (2024), Scaling LLM Test-Time Compute Optimally。
  • 自举与 RL:Zelikman et al. (2022), STaR;Shao et al. (2024), DeepSeekMath(GRPO);DeepSeek-AI (2025), DeepSeek-R1;Lambert et al. (2024), Tülu 3(RLVR);Liu et al. (2025), Understanding R1-Zero-Like Training(Dr. GRPO:组内标准化和长度归一化的偏差)。
  • 可解释性:Elhage et al. (2022), Toy Models of Superposition;Bricken et al. (2023), Towards Monosemanticity;Templeton et al. (2024), Scaling Monosemanticity;Ameisen et al. (2025), Circuit Tracing;Lindsey et al. (2025), On the Biology of a Large Language Model。

12. 下一讲预告 · Next lecture

第 21 讲:状态空间模型与混合模型。推理模型要写很长的思考、长上下文要读很长的输入——而 Transformer 的 KV 缓存随长度线性增长(第 19 讲 §1.3)。有没有一种模型,训练时像 Transformer 一样并行,推理时像 RNN 一样只用常数大小的状态?状态空间模型(S4、Mamba)给出了肯定的回答:同一个模型有连续、递推、卷积三种写法。我们会看到线性注意力和 SSM 其实是一回事,也会看到”固定大小的状态”在联想记忆任务上的极限——以及为什么 Jamba、Nemotron-H、Qwen3-Next 都选择把少量注意力层和大量线性层混在一起。

← 返回课程目录