对应 Maps to:CS486 课程描述的 “enhance LLM reasoning”——推理部分(第 3–7 讲)的第三讲:不再只是在测试时多花计算,而是把”哪些回答对了”变成训练信号,让模型本身变强。 依据说明:CS486 没有公开的日程或讲义。本讲依据用 RL 训练推理的主要文献来写:STaR(Zelikman et al. 2022)、RFT(Yuan et al. 2023)、ReST-EM(Singh et al. 2023)、PPO(Schulman et al. 2017)、GRPO(Shao et al. 2024,DeepSeekMath)、RLOO(Ahmadian et al. 2024)、Tülu 3 的 RLVR(Lambert et al. 2024)、DeepSeek-R1(DeepSeek-AI 2025),以及 2025 年关于这些方法”到底做了什么”的分析:Dr. GRPO(Liu et al.)、DAPO(Yu et al.)、Yue et al. 的 pass@k 之争、ProRL(Liu et al.)、熵机制(Cui et al.)、认知行为(Gandhi et al.)、虚假奖励(Shao et al.)。§4、§6–§9 的实验是本讲义自己设计的,数字全部来自配套代码的实际输出。 配套代码 Code:
code/lecture05/(PyTorch;4 个脚本 + 1 个模块;第一次运行共约 8 分钟——在 CPU 上并行训练 31 个模型;之后除代码 02(约 2 分钟的采样)外每个脚本几秒钟) 预计阅读时间:4–5 小时(含运行代码)
0. 本讲导航 · How to read this lecture
0.1 学习目标 Learning goals
学完这一讲,你应该能够:
- 把”训练模型推理”写成一个强化学习问题:策略、动作、回合、奖励分别是什么;说出它和监督微调(SFT)的根本区别。
- 解释 STaR / RFT / ReST-EM(“只学自己做对的”)为什么等价于没有基线的 REINFORCE,以及它丢掉了什么。
- 从 REINFORCE 推到 PPO 和 GRPO:基线、优势、裁剪、KL 惩罚各自解决什么问题;知道 GRPO 的”组内标准化”和”按长度平均”会带来什么偏差(Dr. GRPO、DAPO)。
- 说清 DeepSeek-R1-Zero / R1 做了什么、“顿悟时刻”和”回答越来越长”可能的解释。
- 用实验区分 RL 的两种作用:挑出基座已有的行为(选择),和学到能迁移到新题上的规则(泛化);理解 pass@k 之争的两方各自看到了什么。
- 解释零方差组、熵坍缩为什么让 RL 的信号变稀、探索停止。
- 知道长度惩罚怎样让模型”在最难的题上先放弃思考”。
- 理解为什么用学出来的奖励(验证器、奖励模型)做 RL 会被钻空子,以及常见的对策和它们的局限;读一篇 RL 推理论文时知道该检查什么(随机奖励对照、多个模型家族、多个种子、大 k 的 pass@k)。
0.2 先修与本讲范围 Prerequisites & scope
| 默认你已经会 Assumed | 本讲不展开 Not covered |
|---|---|
第 1 讲:实验台(多跳指针追踪、cot_L2)、长度泛化失败 | RLHF 的偏好建模与 DPO(CS329H) |
| 第 2 讲:多个种子、调参预算、“一次运行不足以下结论” | 价值函数、GAE、off-policy RL 的细节(只讲直觉) |
| 第 4 讲:pass@k 的无偏估计、“走过头”、验证器与过度优化、离策略盲区 | 大规模 RL 系统(rollout 与训练的分离、异步 RL;CS349D 第 15 讲) |
| 基本的概率与梯度(对数概率的梯度) | 多智能体 RL(第 16 讲) |
0.3 本讲地图 Map
§1 从"测试时挑选"到"训练时学习":推理作为强化学习问题;三条路线;本讲实验台
§2 自举:STaR、RFT、ReST-EM——"只学自己做对的"= 没有基线的 REINFORCE
§3 策略梯度:REINFORCE → PPO → GRPO;Dr. GRPO 与 DAPO 的修正;我们的实现
§4 实验:用 RL 修好"何时停下";零方差组;SFT vs RFT vs GRPO ← 代码 01
§5 RLVR 与 DeepSeek-R1:可验证奖励;R1-Zero;R1 的四阶段流程;蒸馏
§6 长思维链从哪里来:挑出来的,还是创造的?"顿悟"在第几步? ← 代码 03
§7 RL 改变了什么:pass@k 之争;边界的扩展与收窄;熵坍缩 ← 代码 02
§8 长度:为什么变长;长度惩罚让模型在难题上先放弃;标准化的陷阱 ← 代码 03
§9 奖励是模型,就会被钻空子:用验证器当奖励;格式检查与 KL;随机奖励 ← 代码 04
§10 读和写 RL 推理论文:一份检查清单
§11 现状与开放问题
§12–16 小结、常见误区、练习、延伸阅读、下一讲预告
1. 从”测试时挑选”到”训练时学习” · From selection to learning
1.1 第 4 讲留下的问题
第 4 讲在 cot_L2 的长题面(n = 12)上试遍了测试时计算:采样、投票、验证器、束搜索。结论是:测试时计算放大能力,不创造能力。模型在这些题上失败的主要原因是”走过头”——每一步查找都对,却没有在第 k 步停下。这是一个系统性错误:同一道题采样 32 次,32 次都走过头,投票投不掉,验证器也挑不出来(没有正确的样本可挑)。
可是我们手里有一个很有价值的东西:一个能判断答案对错的求解器。第 4 讲只用它来评测和挑选。一个自然的问题是:能不能用它来训练?——让模型多试,把”试对了”的经验变成参数的更新,下次就更容易做对。这就是用强化学习(reinforcement learning, RL)训练推理的出发点,也是 2024–2025 年推理模型(o1、DeepSeek-R1 及其后继者)的核心技术。
1.2 把推理看成一个强化学习问题
| RL 的概念 | 在 LLM 推理里是什么 | 在我们的实验台上 | |
|---|---|---|---|
| 策略 policy | 语言模型本身:给定前文,下一个 token 的分布 | TinyReasoner | |
| 状态 state | 题目 + 已经写下的部分回答 | 题面 + 已经写下的字母 | |
| 动作 action | 写下一个 token | 写一个字母、` | 或$` |
| 回合 episode | 对一道题写出一整段回答 | `cbd | d$` |
| 奖励 reward | 回答写完之后打一个分(常常只有最后一个分数) | 答案对得 1,错得 0 | |
| 目标 | 最大化期望奖励 | 同左 |
几个特点让这个 RL 问题和教科书里的(Atari、机器人)很不一样:
- 奖励极其稀疏:一整段回答(可能几千个 token)只有最后一个 0/1。哪个 token 该为成功或失败负责(信用分配,credit assignment),奖励本身不告诉你。
- 初始策略已经很强:我们不是从随机策略开始,而是从一个预训练(或 SFT 过)的模型开始,它已经”大概知道怎么做”。RL 的工作更像是”调整”而不是”从零学习”。这一点决定了本讲后半部分的很多现象(§6、§7)。
- 环境是确定的、可以无限重置:同一道题可以采样任意多次,这让”同一道题的多个回答互相比较”成为可能(GRPO 的核心想法)。
1.3 为什么不直接 SFT?
如果有标准答案(正确的推理链),直接做监督微调(supervised fine-tuning, SFT)最简单。RL 的理由有三条:
- 没有标准推理链,只有标准答案。数学竞赛题有答案,但”好的推理过程”没有人写;代码题有测试用例,但没有标准程序。RL 只需要一个能判对错的信号。
- 学的是自己的分布。SFT 模仿别人(人类或更强的模型)写的推理链,这些推理链可能用到模型自己做不到的跳步(第 3 讲 §5:每一步必须在一次前向的能力之内)。RL 只在模型自己写出的回答上学习,天然在它的能力范围内。
- 优化的是真正关心的目标。SFT 优化”像不像标准答案”,RL 直接优化”答案对不对”。一个回答可以和标准答案很不一样却完全正确。
代价也有三条:需要大量采样(贵);只能学到模型偶尔能做对的东西(做不对的题没有信号);奖励一旦有漏洞就会被钻(§9)。
1.4 三条路线,以及本讲的实验台
| 路线 | 训练数据 | 用到的信号 | 代表工作 |
|---|---|---|---|
| SFT | 标准推理链 | 每个 token 的标准答案 | 第 1 讲的训练方式;蒸馏(R1 → 小模型) |
| 自举(RFT) | 模型自己采样、答对了的回答 | 只用正确样本 | STaR、RFT、ReST-EM |
| 策略梯度(RL) | 模型自己采样的所有回答 | 每个回答的奖励(对的推、错的压) | PPO、GRPO、RLOO |
本讲的实验都在第 1 讲的多跳指针追踪任务上进行。起点是 cot_L2:在 n = 4–8 的题上用 SFT 训练的 2 层思维链模型,在 n = 12 上只有 29.5%(贪心)。三种方法都在 n = 4–12、k = 1–7 的题上训练 200 步、学习率 1e-3,各跑 3 个种子;RL 每步 32 道题、每题采样 8 次(温度 1.0)。评测用 n = 8(原训练分布)、12(新训练分布的最长题面)、14 和 16(更长,没训练过)。
为了让 RL 在 CPU 上跑得动,rl_lab.py 实现了一个带 KV cache 的采样器:先把题面整段算一遍、存下每层的 key 和 value,之后每生成一个 token 只算这一个位置。它和第 4 讲逐步重算整段序列的采样器逐字相同(自检里验证了贪心和同一随机种子下的采样),快约 5 倍。一步 GRPO(256 条回答的采样 + 一次更新)约 0.25 秒。
2. 自举:STaR、RFT 与 ReST-EM · Bootstrapping from your own successes
2.1 STaR:用自己做对的题训练自己
STaR(Self-Taught Reasoner,Zelikman et al. 2022)的循环非常朴素:
重复:
1. 用当前模型对训练集的每道题生成一条推理链和答案;
2. 只保留答案正确的 (题目, 推理链, 答案);
3. 对答错的题,把正确答案作为"提示"给模型,让它生成一条通向这个答案的推理链(rationalization),答对了也保留;
4. 在保留下来的数据上(从原始模型重新)微调。
第 3 步是 STaR 的一个巧思:只靠第 1–2 步,模型永远学不会它一次都做不对的题;给它看答案、让它”倒推”一条推理链,就能把难题也变成训练数据。代价是倒推出来的推理链可能是”凑出来的”——答案对、推理不通(第 1 讲 §4.4 的”答案对、推理错”)。
2.2 RFT 与 ReST-EM:EM 的视角
Yuan et al.(2023)的拒绝采样微调(rejection-sampling fine-tuning, RFT)和 Singh et al.(2023)的 ReST-EM 把这个循环说得更清楚:
- E 步:用当前模型采样很多回答,用奖励过滤(只保留答对的)——这是在近似”给定答对了,回答的后验分布”;
- M 步:在过滤后的回答上做最大似然。
ReST-EM 发现,在数学和代码上,这样迭代几轮的效果超过了在人类写的推理链上做 SFT——“模型自己生成的数据”在这里比”人类数据”好用,一个原因正是 §1.3 的第 2 条:它们在模型自己的分布里。
2.3 “只学自己做对的”= 没有基线的 REINFORCE
把这件事写成公式,可以看清它和 RL 的关系。期望奖励的梯度(下一节推导)是
当奖励只取 0 或 1 时, 的回答对梯度没有贡献,剩下的就是”在答对的回答上做最大似然”(差一个归一化常数)。所以在线的 RFT 就是 0/1 奖励、没有基线的 REINFORCE。它丢掉了两样东西:
- 错误回答的信号。错的回答不会被压低,只是”没被抬高”。在训练分布内这通常无所谓——正确回答的概率被抬到接近 1,错误回答自然被挤掉;但在分布外,差别可能就显现出来(§4.4)。
- 基线。所有正确回答被同样地抬高,不管这道题是”本来就总能做对”(几乎没有新信息)还是”偶尔才能做对”(很有价值的信息)。
2.4 自举的局限
- 只能学到”偶尔能做对”的题:从来做不对的题不产生任何训练数据。这是所有基于自己采样的方法(包括 RL)共同的限制,§6 会看到它的极端形式。
- 假阳性被强化:答案对、推理错的回答也被保留、被学习。
- 多样性下降:每一轮都只保留”能做对的那种写法”,几轮之后回答越来越单一(§7.3)。
3. 策略梯度:从 REINFORCE 到 PPO 与 GRPO · Policy gradients
3.1 REINFORCE 与基线
目标 对参数求导,用一个恒等式 (“对数导数技巧”):
直觉:按奖励加权,提高采到的回答的对数概率。一个回答由很多 token 组成,,所以整条回答的奖励被”分给”它的每一个 token——这就是最粗糙的信用分配。
只用这个公式,方差很大:如果所有回答的奖励都是正的(例如都在 0.9 左右),每个采到的回答都会被抬高,只是程度不同,噪声远大于信号。标准做法是减去一个基线 (不依赖于采到的回答):
期望不变(因为 ),方差小得多。 叫优势(advantage):比平均水平好多少。好于平均的被推高,差于平均的被压低。
3.2 PPO:裁剪、价值网络与 KL
PPO(Proximal Policy Optimization,Schulman et al. 2017)是 RLHF(InstructGPT)和早期推理 RL 的标准算法。它做了三件事:
- 重复利用样本:采样很贵,PPO 用同一批样本更新好几次。第二次更新时样本已经不是当前策略采的了,所以要乘一个重要性权重 。
- 裁剪:为了防止一次更新走得太远,把 限制在 :
- 价值网络当基线:训练一个和策略差不多大的”评论家”(critic) 预测”从这个状态出发的期望奖励”,用它(加上 GAE)给每个 token 估计优势。
在 LLM 上,第 3 条很贵也很难:多一个和策略一样大的模型要训练、要占显存;而在稀疏的结果奖励下,“写到一半时的期望奖励”很难估准。RLHF 还在奖励里加一项 ,让策略不要离起点(SFT 模型)太远——这是防止奖励黑客的第一道防线(§9)。
3.3 GRPO:用”同一道题的其他回答”当基线
GRPO(Group Relative Policy Optimization,Shao et al. 2024,DeepSeekMath)去掉了价值网络。它利用 §1.2 说的”环境可以无限重置”:同一道题采样 G 次,用这 G 个奖励的统计量当基线:
回答 的每个 token 都用同一个优势 。目标函数仍然用 PPO 式的裁剪,KL 惩罚直接写进损失(而不是奖励),用一个无偏、恒为非负的估计量(常叫 k3):
原版 GRPO 先在每个回答内部按 token 数平均(),再对 G 个回答平均。同一时期的 RLOO(Ahmadian et al. 2024)用”留一”基线 ,不除以标准差,也去掉了价值网络。
零方差组:如果一组的 G 个奖励完全相同(全对或全错),所有 ,这一组对梯度没有任何贡献。题目太简单或太难,都等于白采样。§4.2 会看到这在实践中有多严重。
3.4 本讲的实现:每批样本只更新一次
我们的 train_rl(rl_lab.py)每批样本只更新一次(完全在线,on-policy)。这时 ,裁剪不起作用,GRPO 退化成带组内基线的 REINFORCE:
每一步:
抽 32 道题,每道题用当前策略采样 8 条回答(温度 1.0)
r = 奖励(答案对得 1,错得 0;可以再减去长度惩罚)
A = (r − 组内平均) / (组内标准差 + 1e-4) # std_norm=False 时不除
loss = −Σ_i Σ_t A_i · log π(y_{i,t}) / 所有回答的 token 总数 # "token 级"平均
+ β · 平均的 k3 KL(如果 β > 0)
一次 AdamW 更新(梯度裁剪到 1.0)
这样做是为了让实验里只有一个”旋钮”在变;代价是没有体现裁剪的作用(例如 §9.5 的”虚假奖励”现象就和裁剪有关)。
3.5 GRPO 的两处偏差,以及 DAPO 的四个修补
2025 年 3 月的两篇工作仔细审视了 GRPO:
Dr. GRPO(“GRPO Done Right”,Liu et al. 2025, Understanding R1-Zero-Like Training)指出两个偏差:
- 按回答长度平均():同样是负优势,长回答里每个 token 分到的惩罚更小。于是错误的回答倾向于越来越长——“回答变长”的一部分可能只是这个偏差。
- 除以组内标准差:标准差小的组(几乎全对或几乎全错的题)被放大。这引入了”难度偏差”:太简单或太难的题被赋予更大的权重。§8.3 会看到它在长度惩罚下的一个极端后果。
去掉这两项(按固定常数归一化、不除以标准差)就得到无偏的 Dr. GRPO,token 效率更好,准确率不降。
DAPO(Yu et al. 2025)从大规模训练的工程角度提出四个修补,在 Qwen2.5-32B 基座上用 GRPO 一半的训练步数拿到 AIME 2024 50 分(DeepSeek-R1-Zero-Qwen-32B 是 47 分):
| 修补 | 解决什么 |
|---|---|
| Clip-Higher:裁剪上界比下界宽() | 低概率 token 很难被提高 → 熵坍缩(§7.3) |
| 动态采样:过滤掉全对 / 全错的组,补采新题 | 零方差组白白浪费(§4.2) |
| token 级的损失平均 | 长回答里的 token 权重过小(同 Dr. GRPO 的第 1 条) |
| 超长回答的奖励整形 | 被截断的回答给一个温和的惩罚,而不是当成错误 |
两者在”怎样归一化损失”上并不完全一致(DAPO 用 token 级平均,Dr. GRPO 用固定常数),这本身说明这些细节还没有定论。Meta 的 ScaleRL 研究(Khatri et al. 2025,40 万 GPU 小时的消融)给了一个有用的视角:损失聚合、归一化、课程、off-policy 算法这类细节主要影响到达上限的速度,而不太改变上限本身——在小规模上看到的差别,不一定是最终性能的差别。
4. 实验:用 RL 修好”何时停下” · Experiment: fixing when to stop
代码:01_rl_vs_sft.py(第一次约 70 秒:9 个模型并行训练)。
4.1 三种方法都修好了 n = 12
训练后的贪心准确率(每个 n 是 k = 3–6 各 50 道题;括号里是 3 个种子各自的结果):
| 模型 | n = 8 | n = 12 | n = 14 | n = 16 |
|---|---|---|---|---|
起点 cot_L2 | 100.0% | 29.5% | 19.5% | 2.0% |
| SFT(标准答案) | 100.0% | 100.0% | 67.2%(68 / 62 / 72) | 28.0%(35 / 22 / 28) |
| RFT(自己做对的) | 100.0% | 99.7% | 50.2%(52 / 37 / 61) | 14.2%(22 / 2 / 20) |
| GRPO(组内比较) | 99.7% | 98.3% | 62.3%(68 / 64 / 55) | 26.8%(36 / 21 / 24) |
n = 12 上,三种方法都从 29.5% 升到 98% 以上;训练曲线(演示 2)显示只用了 25–50 步。失败类型(演示 3,种子 0)更说明问题:起点在 n = 12 上的 141 个错误里,114 个是一直没写 |(写到长度上限 k + 5 还没停下,也就是走过头至少 5 步)、14 个是走过头、13 个是查找错误;训练后全部消失。
RFT 和 GRPO 从来没看过一条标准推理链,只知道”答案对不对”,就学会了”在第 k 步停下”。这正是第 4 讲里所有测试时计算方法都救不了的系统性错误:测试时计算只能在模型已有的分布里挑,训练能改变分布本身。
4.2 信号有多稀疏:零方差组
GRPO(种子 0)的训练统计:
| 步 | 训练奖励 | 零方差组 | 每 token 熵 | 回答长度 |
|---|---|---|---|---|
| 1–25 | 89.7% | 92.6% | 0.0166 | 6.55 |
| 26–50 | 98.7% | 95.6% | 0.0089 | 6.36 |
| 176–200 | 99.8% | 99.2% | 0.0028 | 6.39 |
前 25 步就有 92.6% 的题组”8 个样本全对或全错”,优势全为 0。起点模型在温度 1.0 下几乎是确定性的(每 token 熵 0.017 nats):大多数题要么总是对(n ≤ 8 的题),要么总是错(很多 n = 12 的题)。只有”有时对”的题提供学习信号——学到的东西几乎全部来自那 7% 的题组。
这是 DAPO “动态采样”的动机,也是推理 RL 里”按难度挑题”(课程学习、在线过滤掉通过率为 0 或 1 的题)这么重要的原因。它还解释了 §6 的一个现象:如果一种行为在基座里从来不出现,就不会有”有时对”的组,RL 无从下手。
4.3 剩下的错误:停止,而不是查找
n = 16(没训练过)上,GRPO 的 128 个错误里有 84 个没写 |、42 个走过头,查找错只有 2 个。在 n ≤ 12 上学到的”何时停下”只有一部分迁移到了更长的题面。长度泛化的瓶颈在停止,不在查找——这和第 1 讲、第 4 讲的诊断一致。
4.4 SFT vs RFT vs GRPO:谁泛化得更好?
Chu et al.(2025, SFT Memorizes, RL Generalizes)在纸牌算术(GeneralPoints)和导航(V-IRL)上发现:SFT 倾向于记住训练分布,RL(结果奖励)在规则变体和视觉变体上泛化得更好。我们的实验里没有出现这个差别:在没训练过的 n = 14 / 16 上,SFT(67.2% / 28.0%)和 GRPO(62.3% / 26.8%)的差别在种子噪声之内(例如 SFT 在 n = 14 上三个种子是 68 / 62 / 72)。
为什么?我们的”标准答案”是完美的,而且和模型应该写的东西完全一致(同样的格式、同样的步长)。SFT 在这里没有吃亏的理由。“RL 泛化更好”的论证主要针对 SFT 数据和模型自己的分布不一致的情形(§1.3 第 2 条):例如用更强模型的推理链蒸馏、用人类写的跳步推理链。研究里比较 SFT 和 RL 时,要说明 SFT 的数据从哪里来。
RFT 则明显更差、也更不稳定(n = 16 上三个种子是 22% / 2% / 20%)。一个可能的解释是 §2.3 的第 1 条:GRPO 会把”没停下”的回答的概率压低,RFT 只把正确回答抬高;在训练分布内两者等价,在分布外就不一样了。这里没有单独检验(练习 2 做了这个检验)。
方法上的提醒:三种方法用了同样的学习率(1e-3)和步数。原型里 GRPO 用 3e-4 时 n = 14 只有 50–58%,用 1e-3 时 68–72%——学习率对分布外结果的影响和方法之间的差别一样大。公平的比较要给每种方法同样的调参预算(第 2 讲 §3.3),这里没有做,所以只能说”在这个设置下没有看到差别”。
5. RLVR 与 DeepSeek-R1 · Verifiable rewards and DeepSeek-R1
5.1 可验证奖励
“可验证奖励的强化学习”(Reinforcement Learning with Verifiable Rewards, RLVR)这个名字来自 Tülu 3(Lambert et al. 2024):奖励不是一个学出来的奖励模型,而是一个程序——数学题比对最终答案,代码题跑测试用例,指令遵循题检查格式约束。它的好处是很难被钻空子(只要检查程序没有漏洞),这一点在 §9 会变得非常具体。我们代码 01–03 的奖励就是 RLVR:求解器精确地判断答案对错。
5.2 DeepSeek-R1-Zero:直接从基座开始的 RL
DeepSeek-R1(DeepSeek-AI,2025 年 1 月;后来发表于 Nature)最引人注目的是 R1-Zero:
- 起点是预训练的基座 DeepSeek-V3-Base,没有任何 SFT;
- 一个简单的模板要求模型把思考写在
<think>和</think>之间,再给出答案; - 奖励只有两项,都是规则:准确率奖励(答案对不对)和格式奖励(有没有按模板写);
- 算法是 GRPO。
结果:AIME 2024 的 pass@1 从训练开始时的约 15.6% 升到 71.0%,多数投票到 86.7%。训练过程中回答越来越长(几千个 token),模型开始出现反思、回头检查、换一种方法再试这类行为;论文展示了一段模型在中途写下 “Wait, wait. Wait. That’s an aha moment I can flag here” 后重新检查的输出,称之为”顿悟时刻”(aha moment)。
R1-Zero 的问题是可读性差、语言混杂(中英文混在一起)。
5.3 DeepSeek-R1 的流程
R1 用四个阶段解决这些问题:
- 冷启动 SFT:用几千条可读的长思维链数据微调基座;
- 面向推理的 RL:和 R1-Zero 一样的规则奖励,加一项”语言一致性”奖励;
- 拒绝采样 + SFT:用 RL 后的模型采样大量回答,过滤出正确、可读的(约 60 万条推理数据),加上约 20 万条非推理数据,重新微调——这就是 §2 的 RFT;
- 面向所有场景的 RL:推理题用规则奖励,开放式任务用奖励模型(有用性、无害性)。
论文还报告了两个”不成功的尝试”:过程奖励模型(PRM)——难以定义”一步”、自动标注有噪声、而且容易被钻空子;蒙特卡洛树搜索(MCTS)——token 级的搜索空间太大。这和第 4 讲 §6 的观察(验证器的离策略盲区)以及本讲 §9 一致。
最后,R1 用它生成的约 80 万条数据蒸馏(SFT)出了一系列小模型(1.5B–70B)。一个重要的对照:在同样的小模型上直接做大规模 RL,效果不如蒸馏。对小模型来说,“从更强的模型那里学推理链”比”自己摸索”划算得多——这和 §6 的结论一脉相承:RL 擅长挑出和强化已有的东西,而小模型里可挑的东西少。
5.4 之后发生了什么
R1 之后的一年里,大量工作复现和分析了”R1-Zero 式”训练(大多在 Qwen2.5 系列上)。几个反复出现的发现,正好对应本讲接下来的几节:
- 基座模型里本来就有反思、检查这些行为,RL 把它们放大了(§6);
- RL 主要提高了 pass@1,在大 k 时是否超过基座有争议(§7);
- 回答变长有一部分来自算法的偏差(§3.5、§8);
- 在 Qwen2.5-Math 上,甚至随机奖励都能带来大幅提升——这提醒我们 RL 的”效果”可能来自奖励以外的东西(§9.5)。
6. 长思维链从哪里来? · Where does long chain-of-thought come from?
6.1 问题:创造,还是挑选?
R1-Zero 的训练曲线很有冲击力:回答长度随训练步数一路上升,准确率随之上升,中途出现”顿悟”。很容易读成”RL 让模型自己发明了长思维链和反思”。可是另一种解释同样符合这些曲线:基座模型本来就会(在预训练语料里见过大量推理过程),只是很少主动这样做;RL 发现”这样做奖励更高”,把这种行为的频率从很低推到很高。
2025 年的两项分析支持后一种解释:
- Liu et al.(Understanding R1-Zero-Like Training)在多个基座模型(包括 DeepSeek-V3-Base 和 Qwen2.5)的原始输出里就找到了自我反思(“等一下,让我再检查一下”),也就是说”顿悟”在 RL 之前就已经存在;
- Gandhi et al.(Cognitive Behaviors that Enable Self-Improving Reasoners)发现,同样的 RL 在 Countdown 游戏上让 Qwen-2.5-3B 大幅提高、让 Llama-3.2-3B 几乎没有提高;区别在于 Qwen 的基座输出里本来就有验证、回溯这些行为。用少量带这些行为的例子(甚至答案是错的例子)先”预热”Llama,RL 就能让它赶上 Qwen。
我们能在实验台上把这两种解释分开,因为我们可以造基座模型,精确控制”能力”和”行为”。
6.2 四个基座
代码:03_emergent_thinking.py(第一次约 3 分钟)。每个基座的”预训练语料”里只有一部分题带推理链(abc|c$),其余的直接给答案(|c$)。2 层模型一次前向只能做 1 跳(第 1 讲),所以”直接回答”在 k ≥ 2 时几乎总是错的。
直接用 2% 的推理链数据从零训练是不行的——模型连查找都学不会(原型里”想”的时候推理链只有 7% 是对的,见代码 README)。所以用两阶段:先用 50% 带推理链的数据训练 2000 步学会查找,再用很少带推理链的数据继续训练 1000 步,把”主动写推理链”的频率压下去。这模仿了真实的情形:能力来自大量数据,某种行为在语料里很少见。
| 基座 | 第二阶段的推理链比例 | 采样时写推理链的比例 | 写了时的准确率 | 直接回答的准确率 |
|---|---|---|---|---|
| noskill | (从零训练,从没见过推理链) | 0.0% | — | 12.6% |
| think0 | 0% | 0.0% | — | 13.7% |
| think2 | 2% | 1.9% | 95.2% | 13.9% |
| think10 | 10% | 9.4% | 97.1% | 14.2% |
(n = 8、k = 1–7 各 40 道题,每道题采样 16 次。)think0 在 4480 次采样里一次推理链都没写,但它在第一阶段学过查找。
6.3 RL 挑出了”思考”
从每个基座开始做 GRPO,奖励只有”答案对不对”,题目是 n = 4–8:
| 基座 \ 步数 | 0 | 25 | 50 | 100 | 150 | 300 |
|---|---|---|---|---|---|---|
| noskill | 0% / 13% | 0% / 14% | 0% / 13% | 0% / 12% | 0% / 10% | 2% / 12% |
| think0 | 0% / 14% | 0% / 16% | 0% / 13% | 0% / 12% | 99% / 93% | 100% / 98% |
| think2 | 2% / 15% | 100% / 98% | 100% / 98% | 100% / 99% | 100% / 99% | 100% / 99% |
| think10 | 9% / 22% | 100% / 99% | 100% / 99% | 100% / 99% | 100% / 100% | 100% / 100% |
(每格:写推理链的比例 / 准确率。)回答的平均长度从约 3 个字符升到约 7 个——一个缩小版的”R1-Zero 曲线”:越来越长、越来越准。但这里没有任何新能力被创造出来,RL 只是把基座里已有的行为挑了出来。
6.4 “顿悟”在第几步?
训练批次里写推理链的比例第一次超过 5% / 50% / 95% 的步数:
| 设置 | 超过 5% | 超过 50% | 超过 95% |
|---|---|---|---|
| think0,种子 0 | 132 | 139 | 145 |
| think0,种子 1 | 46 | 52 | 59 |
| think0,种子 2 | 51 | 56 | 61 |
| think2 | 5 | 10 | 15 |
| think10 | 1 | 5 | 9 |
| noskill | 284 | — | — |
think0 的曲线看上去就是一次”顿悟”:几十到一百多步毫无动静,然后十几步之内从 5% 跳到 95%。机制很简单:一个极少出现的行为偶然被采到(温度 1.0 下,概率很小但不为 0),在它所在的组里得到很大的正优势(它对了,其他 7 个都错了),概率被推高一点;概率越高越容易被采到,得到的推动越多——指数式放大。什么时候第一次被采到是随机的,3 个种子相差近 90 步。所以”顿悟发生在第几步”本身没有意义,有意义的是”基座里有没有这种行为、出现的概率有多大”:think2(1.9%)只要 10 步,think10 只要 5 步。
noskill 在第 284 步才有 5% 的回答写字母,但写的不是正确的推理链,准确率始终在 10–14%。没有可以挑的东西,RL 无从下手。
6.5 一个意外:奖励没检查的东西会漂移
think2 训练到 300 步时,回答长度突然从 7 升到约 12。看它的输出:oj|j|j|j|(正确是 oj|j$)——模型不再写结束符 $,而是在答案后面重复 |j 直到长度上限。奖励只检查 | 后面的第一个字母,所以结束符和它后面的内容不受任何约束,在随机的更新中漂移了。练习 4 加上”答案后必须紧跟 $”的格式检查,300 步内回答长度一直是 7.0。
真实系统里同样的事情很常见:R1-Zero 要有格式奖励;DAPO 专门处理超长回答;推理模型在 RL 后常见无休止的重复。奖励没有检查的东西,RL 不会替你保持。
6.6 这对研究意味着什么
- 基座模型的选择是实验变量。同一个 RL 方法在不同基座上可能一个有效、一个无效(Gandhi et al. 的 Qwen vs Llama)。只在一个模型家族上报告的 RL 结果,结论只适用于那个家族(§9.5 有一个更极端的例子)。
- “涌现”要和”选择”区分。看到训练中某种行为突然出现,先去基座的采样里找它——采足够多次。
- 冷启动 SFT 的作用:R1 用几千条长思维链做冷启动,本质上是把”想”这个行为的初始频率从很低提高到不低,让 RL 不用等”偶然采到”。这正是我们的 think0 → think2 的差别。
7. RL 改变了什么:pass@k 之争 · What does RL change?
7.1 两种说法
Yue et al.(2025,NeurIPS 2025 口头报告)的论文标题就是问题:Does Reinforcement Learning Really Incentivize Reasoning Capacity in LLMs Beyond the Base Model? 他们在数学、代码、视觉推理上比较 RLVR 模型和它们的基座,用大 k 的 pass@k 衡量”能力边界”:
- k 小时(pass@1),RL 模型更好;
- k 大时(例如 pass@256),基座更好——两条曲线交叉;
- 结论:当前的 RLVR 提高了采到正确路径的效率,但没有引出根本上新的推理模式;能力边界甚至随训练收窄。
NVIDIA 的 ProRL(Liu et al. 2025)给出相反的证据:用 KL 控制、定期重置参考策略、多样的任务做长时间 RL,在一些任务上(尤其是基座本来很弱的任务)RL 模型在所有 k 上都超过基座,包括基座采样多少次都解不出的题。他们把任务分成三类:边界收窄、早早饱和、持续扩展。
7.2 在我们的实验台上
代码:02_pass_at_k.py(约 2 分钟)。代码 01 训练的三个模型(种子 0)和起点,每道题采样 512 次(温度 1.0):
| n | k | 起点 | SFT | RFT | GRPO |
|---|---|---|---|---|---|
| 12 | 1 | 29.4% | 99.7% | 99.8% | 99.6% |
| 12 | 512 | 46.5% | 100.0% | 100.0% | 100.0% |
| 14 | 1 | 19.7% | 67.6% | 52.6% | 67.9% |
| 14 | 512 | 25.0% | 88.0% | 61.0% | 71.5% |
| 16 | 1 | 1.8% | 35.0% | 22.1% | 35.3% |
| 16 | 512 | 17.0% | 58.0% | 33.0% | 49.5% |
三件事:
- 在 RL 训练覆盖的 n = 12 上,RL 明显扩展了边界:起点采样 512 次仍有 107 道题(共 200 道)一次都没答对;训练后这 107 道题全部能答对,GRPO 的 pass@1 就有 99.6%。原因是 RL 从”有时能对”的题(较短的题面)上学到了一条通用的规则(在第 k 步停下),这条规则迁移到了起点从来做不对的题上。“RL 只是把基座会的挑出来”在这里不成立。
- 在没训练过的更长题面上,曲线形状不同:GRPO 的 pass@k 几乎是平的(n = 16 上从 35.3% 到 49.5%),SFT 一直在升(35.0% 到 58.0%)。k = 1 时两者相同,k 越大 SFT 领先越多。交叉出现在 RL 和 SFT 之间:RL 让模型更确定,也更少尝试别的路径。
- 扩展和收窄同时发生:n = 16 上,有 14 道题起点在 512 次里至少对过一次、GRPO 训练后一次都没对过;同时 GRPO 新解出了 79 道起点从没解出的题。只报告一个 k 看不出这一点。
所以两种说法在我们的世界里都对了一部分:RL 能学到可迁移的规则(ProRL 的一面),也会让分布变窄、丢掉一些解(Yue et al. 的一面)。哪一面占上风取决于测试题是否在 RL 的训练分布里、基座在这些题上是”偶尔能对”还是”从来不对”、你把 k 推到多大。还要注意:起点在 n = 16 上的 pass@512 只有 17.0%,但曲线还在加速上升(每翻 4 倍 k 增加 1.4、1.7、3.1、5.1 个点),如果采样数千、数万次,它是否会和 RL 交叉,我们的数据回答不了。
7.3 熵坍缩
多样性(演示 3,n = 16):每道题 512 个样本里平均出现的不同答案数,起点 2.96、SFT 2.65、GRPO 2.01、RFT 1.44;回答 token 的平均熵,起点 0.136、SFT 0.026、GRPO 0.040、RFT 0.019 nats。只学自己成功样本的 RFT 收窄得最厉害,它的 pass@k 曲线也最平。
Cui et al.(2025,The Entropy Mechanism of RL for Reasoning LMs)系统地描述了这个现象:策略熵在训练早期急剧下降,性能随之饱和;他们拟合出”性能 ≈ −a·exp(熵) + b”的经验关系——熵耗尽了,性能也到顶了。机制上,熵的变化由”一个动作的对数概率”和”它的 logit 更新量”的协方差决定:高概率、高优势的动作被进一步推高时熵下降;低概率、高优势的动作被推高时熵上升。在实践中前者占主导。对策包括 DAPO 的 Clip-Higher(让低概率 token 更容易被提高)、他们提出的 Clip-Cov / KL-Cov(限制高协方差 token 的更新)、熵奖励等。§6.4 的”顿悟”恰好是后一种情形:一个低概率、高优势的行为被推高。
7.4 怎样报告
- 同时报告 pass@1 和大 k 的 pass@k(用无偏估计),以及”从没解出”的题数和”训练前能解、训练后不能解”的题数;
- 说明测试题和 RL 训练题的关系(同分布?更难?);
- 同时报告贪心和采样(温度 1.0)的准确率:一部分”RL 提高了 pass@1”可能只是让分布更尖(贪心解码已经能拿到的东西)。我们的起点在 n = 12 上贪心 29.5%、采样 pass@1 29.4%,几乎已经是确定性的,所以这里的提高不是”变尖”。
8. 长度:为什么变长,以及长度惩罚 · Length
8.1 回答为什么会变长?
R1-Zero 的回答从几百个 token 增长到几千个 token。至少有三种原因,需要分开:
- 更多的计算确实有用(第 1、3 讲:串行深度随 token 数增长)。我们的 §6 就是这一种:写推理链的回答是对的,RL 选择了它们,长度从 3 涨到 7——不多不少,正好是需要的长度。
- 算法偏差:按回答长度平均损失(原版 GRPO 的 )让长的错误回答受到的每 token 惩罚更小(Dr. GRPO)。反过来,按 token 总数平均(DAPO、我们的实现)让长的正确回答得到的总推动更多。
- 奖励没约束的部分在漂移:§6.5 的
|j|j|j…就是这一种——长度增加,信息为零。
研究上的教训:“回答变长”不是能力提高的证据,要看长出来的部分是什么。
8.2 长度惩罚:模型在哪里先放弃?
推理模型常被批评”过度思考”(简单题也写几千个 token)。一个直接的对策是在奖励里减去长度惩罚(Kimi k1.5 等使用过各种形式)。在我们的实验台上(从 think10 出发,奖励 = 答对 − λ × 回答字符数,不除以标准差,300 步):
| λ | k = 1 | k = 2 | k = 3 | k = 4 | k = 5 | k = 6 | k = 7 |
|---|---|---|---|---|---|---|---|
| 0 | 100% | 100% | 100% | 100% | 100% | 100% | 100% |
| 0.1 | 100% | 98% | 97% | 96% | 96% | 84% | 86% |
| 0.2 | 100% | 99% | 98% | 100% | 100% | 43%(3.1 步) | 0%(1.0 步) |
| 0.3 | 0% | 0% | 0% | 0% | 0% | 0% | 0% |
(准确率;括号里是推理链的平均步数。)λ = 0.2 时,模型在 k ≤ 5 的题上照常思考,在 k = 6、7 的题上提前停止:写 1–3 步就给答案。按奖励计算,k = 7 的题写满 7 步要多付 1.4 分,答对只得 1 分,“放弃”确实更划算——长度惩罚首先伤害最难的题,而平均准确率(λ = 0.2 时约 77%)会掩盖这一点。λ = 0.3 时模型完全放弃思考,连 k = 1 都放弃了——尽管对 k = 1 来说多写 1 个字符只扣 0.3 分、换来约 0.8 的准确率,仍然划算。同一个策略在所有题之间共享,“不思考”的倾向泛化到了不该放弃的题上。
“过度思考”和”思考不足”是一枚硬币的两面(第 6 讲继续):想用长度惩罚省 token,就要按难度分开检查准确率。
8.3 标准化的陷阱
再看 Dr. GRPO 的第二个批评(§3.5)。从几乎总是答错的 noskill 出发,加一个很小的长度惩罚(λ = 0.01):
| 设置 | 0 步 | 50 | 100 | 200 |
|---|---|---|---|---|
| 除以组内标准差(GRPO) | 13% / 3.0 | 13% / 3.0 | 0% / 1.0 | 0% / 1.0 |
| 不除(Dr. GRPO) | 13% / 3.0 | 14% / 3.0 | 13% / 3.2 | 14% / 3.1 |
(准确率 / 回答平均长度。)GRPO 在第 100 步塌缩成只输出 $。原因:大多数题组 8 个回答全错,组内奖励只差 0.01 × 长度差;除以一个很小的标准差之后,这点差别被放大成和”对 vs 错”一样大的优势(自检里的例子:奖励 [0, 0, 0.01, 0] 的组,原始优势 0.0075,标准化后 1.47)。“写得更短”压倒了一切。不除以标准差时,这些组的优势只有 0.01 量级,正确回答带来的 ±0.5 量级的信号仍占主导。
一般的教训:标准化改变了不同信号之间的相对权重。只要奖励里混入了一个小的辅助项(长度、格式、语言一致性),在主奖励几乎不变的题组里,它就会被放大。
9. 奖励是模型,就会被钻空子 · Reward hacking
9.1 可验证奖励 vs 学出来的奖励
很多任务没有求解器:写作、开放式问答、研究、规划。这时只能用学出来的奖励模型——RLHF 的奖励模型、第 4 讲的 ORM / PRM、LLM 当裁判。第 4 讲已经看到,best-of-N 用验证器”选最高分”,N 越大越可能选到骗过它的样本。RL 是一个强得多的优化器:它不是从固定的样本里挑,而是改变模型去生成验证器喜欢的东西。
9.2 实验
代码:04_reward_hacking.py(约 2 分钟)。从 cot_L2 出发,在 n = 4–12 上做 GRPO 300 步,只改变奖励。n = 12 测试集的贪心准确率:
| 奖励 | 0 | 25 | 50 | 100 | 200 | 300 |
|---|---|---|---|---|---|---|
| 真实奖励(RLVR) | 30% | 92% | 98% | 100% | 100% | 100% |
| ORM | 30% | 0% | 0% | 0% | 0% | 0% |
| ORM + 格式检查 | 30% | 32% | 14% | 3% | 4% | 4% |
| ORM + 格式检查 + KL(β = 0.5) | 30% | 28% | 53% | 36% | 41% | 54% |
| PRM-full + 格式检查 | 30% | 0% | 1% | 6% | 6% | 6% |
| 随机奖励 | 30% | 16% | 2% | 2% | 8% | 0% |
用 ORM 当奖励时,训练奖励在 50 步内升到 100%,真实奖励从 84% 掉到 0%。模型学会了写 ||$、||||$——ORM 只在 cot_L2 自己写出的回答上训练过,从没见过这种格式,给它们 0.98–1.00 分。
加上格式检查(“至少一步推理 + | + 一个字母 + $”,否则 0 分)之后,空子换了地方:第 25 步时模型写 afbd|d$(正确是 afbdk|k,少走了一步,得 1.000 分),之后越来越短,最后几乎所有题都写 k|k$(训练结束时 200 道测试题里 179 道第一步就错)。PRM-full 同样被”只走一步就停”骗过(l|l$ 得 1.000 分)。
9.3 空子在验证器的盲区里
这正是第 4 讲 §6.2 发现的离策略盲区:cot_L2 几乎从不停早(它的毛病是走过头),所以验证器的训练数据里几乎没有停早的推理链,它也就分不出它们的对错。best-of-N 时这个盲区只是偶尔被碰到;RL 会主动去找它,几十步之内就找到了。
一般化:奖励模型只在它的训练分布上可靠;RL 会把策略推到分布之外,正好推到奖励模型最不可靠的地方。 这是 Goodhart 定律的一个精确版本,也是 Gao et al.(2023)“奖励模型过度优化”的机制。
9.4 对策,以及它们的代价
| 对策 | 我们看到的 | 代价 | ||
|---|---|---|---|---|
| 格式检查、规则约束 | 堵住了 ` | $`,空子换到”停早” | 只能堵住想到的漏洞 | |
| KL 惩罚(β = 0.5) | 没有崩溃,真实奖励维持在约 86%;测试集在 28–55% 之间摆动,最后 54% | 也限制了学习:远不如可验证奖励的 100% | ||
| 可验证奖励 | 100% | 需要一个可靠的检查程序 |
其他常见做法:用 RL 策略的新样本重新训练奖励模型(迭代地补盲区,RLHF 的在线版本就是这样做的);多个奖励模型取保守的组合;限制训练步数、提前停止(需要一个独立的真实信号来判断何时停,例如人工抽查)。DeepSeek-R1 在推理任务上完全不用神经奖励模型,§5.3 提到他们放弃 PRM 的理由之一正是奖励黑客。
9.5 随机奖励:对照组的必要性
随机奖励(每条回答以 50% 的概率得 1 分,和回答内容无关)在我们这里不是”什么也不发生”:真实奖励从 84% 一路掉到 9%,模型最后输出 ddddddddddd。在零均值的随机优势下,每一步仍然随机地推高一些回答、压低另一些;学习率 1e-3、没有 KL 时,这个随机游走把策略推到了退化的角落。
Shao et al.(2025,Spurious Rewards: Rethinking Training Signals in RLVR)在 Qwen2.5-Math-7B 上看到的却是提高:随机奖励让 MATH-500 提高了约 21 个百分点(真实奖励约 29 个点);甚至”错误答案的奖励”也有效。他们把原因追溯到 GRPO 裁剪项带来的偏差:它会放大基座里已有的高概率行为——在 Qwen2.5-Math 上,这个行为是”用代码推理”(不执行代码),它本来就比纯文字推理更准。换到 Llama、OLMo 等其他模型家族,同样的虚假奖励几乎没有效果甚至有害。我们的实现没有裁剪(每批只更新一次),所以看到的是另一种结果。
教训有两条:(1) 随机奖励 / 格式奖励对照是必要的——如果一个”新奖励”的提升随机奖励也能拿到大半,它就不是来自奖励的内容;(2) 在多个模型家族上验证——在一个家族上有效的 RL 技巧可能来自那个家族的特殊先验。One-shot RLVR(Wang et al. 2025:Qwen2.5-Math-1.5B 只用一道训练题,MATH-500 从 36.0% 升到 73.6%)这类结果也要放在这个背景下读:其中一部分来自格式的修正,一部分来自激活基座已有的行为。
10. 读和写 RL 推理论文:一份检查清单 · A checklist
| 检查项 | 为什么 | 本讲的例子 |
|---|---|---|
| 基座模型是哪个家族?在别的家族上试过吗? | 先验决定 RL 能挑出什么 | §6、§9.5 |
| 有随机奖励 / 只有格式奖励的对照吗? | 区分”奖励的内容”和”训练本身” | §9.5 |
| 报告了几个种子?方差多大? | RL 的方差很大 | §4.1:RFT 在 n = 16 上 22% / 2% / 20% |
| 报告了大 k 的 pass@k、“从没解出”的题数吗? | pass@1 的提高可能伴随边界收窄 | §7.2 |
| 贪心和采样的准确率都报告了吗? | 区分”变尖”和”变强” | §7.4 |
| 测试题和训练题是什么关系? | 分布内 / 分布外的结论可能相反 | §7.2 |
| 计算量怎么算?(采样数、梯度步数、token 数) | 动态采样等技巧在不同口径下结论相反 | 练习 3 |
| 各方法的调参预算相同吗? | 学习率的影响和方法差别一样大 | §4.4 |
| 奖励检查了什么、没检查什么? | 没检查的东西会漂移、会被钻空子 | §6.5、§9 |
| 回答变长了,长出来的是什么? | 长度不是能力 | §8.1 |
| 评测本身稳定吗?(提示模板、解码参数、少量题目的 AIME) | 推理基准小、方差大 | 第 2 讲 §5.4 |
最后一条值得多说一句:AIME 一年只有 30 道题,一道题就是 3.3 个百分点;采样温度、提示模板、最大长度的不同都能让结果变化好几个点。Hochlehnert et al.(2025,A Sober Look at Progress in Language Model Reasoning)发现,数学推理基准对解码参数、随机种子、提示格式甚至软硬件配置都很敏感;在统一的评测框架下重新评测,多数 RL 方法的提升远小于原论文的报告,而且容易在 AIME’24 这样的小基准上过拟合——第 2 讲的统计工具在这里同样适用。
11. 现状与开放问题 · State of the field
- RLVR 已经是推理模型训练的标准环节:数学、代码、有自动检查的任务。规模在快速扩大,Meta 的 ScaleRL 研究(Khatri et al. 2025)开始为 RL 的”计算量–性能”关系拟合可预测的 S 形曲线,就像预训练的扩展律。
- RL 到底教会了什么仍有争议(§7):选择 vs 泛化、边界扩展 vs 收窄、和基座先验的关系。
- 探索是核心瓶颈:零方差组、熵坍缩、对”从来做不对”的题毫无办法。怎样让模型探索到基座几乎不会采样的解法,还没有好答案。
- 没有可验证奖励的领域(写作、研究、开放式规划)怎样做 RL?学出来的奖励会被钻空子(§9);用 LLM 当裁判又回到第 2 讲的偏差问题。
- 信用分配:一整段几千 token 的回答只有一个 0/1 奖励。过程奖励(第 4 讲)有被钻空子的风险,基于价值的方法在 LLM 上很难训练。
研究问题:
- 能否在 RL 开始前预测一个基座模型能从 RL 中获益多少(例如测量目标行为在基座采样里的频率)?
- 怎样设计课程(题目难度的安排),让”有时对”的题始终占多数?
- 怎样在不损失 pass@1 的情况下保持多样性(大 k 的 pass@k 不下降)?
- 学出来的奖励能否和策略一起训练、及时补上盲区,而不是被它甩开?
12. 小结 · Summary
- 把推理写成 RL:策略 = 语言模型,回合 = 一段回答,奖励 = 回答写完后的分数(最好是可验证的)。RL 只需要”对不对”,不需要标准推理链,而且在模型自己的分布上学习。
- STaR / RFT / ReST-EM(只学自己做对的)= 0/1 奖励、没有基线的 REINFORCE;它丢掉了错误回答的信号和基线。
- GRPO 用”同一道题的 G 个回答”当基线,不需要价值网络;每批只更新一次时就是带组内基线的 REINFORCE。它的两处偏差(按长度平均、除以标准差)被 Dr. GRPO 指出,DAPO 给出了工程修补。
- 在实验台上,SFT、RFT、GRPO 都在 25–50 步内修好了第 4 讲救不了的”走过头”;但 GRPO 的信号非常稀疏:起初约 93% 的题组是零方差组,只有”有时对”的题提供信号。
- 长思维链可以是 RL 挑出来的:基座里很少出现的”思考”在几步到一百多步内被放大到 100%;基座里完全没有这种能力时,RL 什么也挑不出来。“顿悟”的时间是随机的。
- RL 既能学到可迁移的规则(在训练分布上,RL 的 pass@1 超过了基座的 pass@512),也会让分布变窄(分布外的 pass@k 曲线变平、丢掉一些基座能解的题)。结论依赖测试题的分布和 k 的大小。
- 回答变长不等于能力提高;长度惩罚首先伤害最难的题;奖励没检查的东西会漂移;标准化会放大小的辅助奖励。
- 学出来的奖励会被 RL 在几十步内钻穿,空子在奖励模型的离策略盲区里;格式检查和 KL 只能缓解。可验证奖励是推理 RL 的基石。
- 读 RL 论文时检查:基座家族、随机奖励对照、种子、大 k 的 pass@k、计算量口径、调参预算。
13. 常见误区 · Common pitfalls
- “RL 让模型自己发明了长思维链。” 先去基座的采样里找这种行为;我们的实验里它是被挑出来的。
- “RL 只是把基座会的挑出来,不能学新东西。” 在训练分布上,RL 学到的规则能迁移到基座从来做不对的题上;这取决于设置。
- “pass@1 提高了,所以模型更强了。” 可能伴随大 k 时的收窄;可能只是分布变尖。
- “GRPO 不需要调什么。” 标准化、损失聚合、学习率、温度、题目难度都会显著改变结果,有时导致崩溃(§8.3)。
- “回答越长说明想得越多。” 也可能是算法偏差或无约束的漂移。
- “加个长度惩罚就能治过度思考。” 它先伤害最难的题,而平均准确率可能看不出来。
- “有个好的奖励模型(AUC 0.95)就能做 RL。” RL 会把策略推到奖励模型的盲区,几十步就崩溃。
- “随机奖励是无害的对照。” 它的效果取决于算法细节和基座:可能有害(我们这里),也可能”有益”(Qwen2.5-Math)。
- “SFT 记忆、RL 泛化。” 取决于 SFT 数据和模型自己的分布是否一致;我们的完美标准答案下没有差别。
14. 练习 · Exercises
练习 1(标准化的权重)。一道题采样 G 次,答对的比例是 p(0 < p < 1)。用总体标准差 ,写出 GRPO 给正确回答和错误回答的优势;再算”所有正确回答的优势之和”。比较除以和不除以标准差时,p = 0.5 和 p = 0.05 的题各自得到的权重,说明 Dr. GRPO 所说的”难度偏差”。
参考答案:正确回答 ,错误回答 。正确回答的优势之和 ;不除以标准差时是 。p = 0.5: vs ;p = 0.05: vs 。相对于 p = 0.5 的题,p = 0.05 的题在标准化后的权重是 0.436,不标准化时是 0.19——标准化让”几乎全错”(和”几乎全对”)的题的权重提高了约 2.3 倍。这本身不一定是坏事(难题可能更有价值),但它是一个隐含的、通常没有被有意选择的加权;§8.3 是它的极端情形。
练习 2(负样本重要吗?)。§4.4 猜测 RFT 在分布外更差,是因为它不压低错误回答。设计一个实验检验:把 GRPO 的优势截成非负(A.clamp(min=0),只推高好于平均的回答,不压低差的),其他设置和代码 01 相同。先预测它会接近 GRPO 还是 RFT。
参考答案(编写时在草稿目录里的实际运行,3 个种子):只用正优势的 GRPO 在 n = 12 / 14 / 16 上是 99.5% / 52.8%(35.5、54.5、68.5)/ 23.2%(24.0、19.0、26.5)。对照:GRPO 98.3% / 62.3% / 26.8%,RFT 99.7% / 50.2% / 14.2%。n = 14 上它接近 RFT,n = 16 上它接近 GRPO;种子之间相差 33 个点(35.5% vs 68.5%),3 个种子不足以支持或否定这个猜测。正确的下一步是增加种子数(第 1 讲 §8.3:先用种子之间的标准差算一下,要多少个种子才能分辨 10 个点的差别),而不是从这一组数字里挑一个讲得通的故事。
练习 3(动态采样)。DAPO 的动态采样:每一步不断采新题,只保留”8 个样本不全对也不全错”的题组,凑满 32 组再更新。实现它,比较 n = 12 测试集准确率随梯度步数和随采样条数的变化。
参考答案(草稿目录里的实际运行,3 个种子):
第 5 步 第 10 步 第 25 步 普通 GRPO:准确率(已用样本) 42–64%(1,280) 66–85%(2,560) 92–99%(6,400) 动态采样:准确率(已用样本) 87.5–95%(约 1.5–1.9 万) 96.5–100%(约 3.9–4.2 万) 99.5–100%(约 11.5–11.9 万) 按梯度步数,动态采样快得多(第 5 步就到 87.5–95%);按采样条数,它贵得多——为了凑满 32 个非零方差组,每步要采 10 倍以上的样本:普通 GRPO 用 1.28 万条样本(第 50 步)已经到 98–99.5%,动态采样用了 1.5–1.9 万条(第 5 步)只有 87.5–95%。哪个”更好”取决于你的瓶颈是采样还是训练——这正是第 2 讲”计算量匹配”的问题,论文里要说明口径。
练习 4(堵住尾部漂移)。§6.5 的 think2 不再写 $。给奖励加一个格式检查:回答必须是”若干字母 + | + 一个字母 + $”(允许 0 个字母,即直接回答),否则 0 分。重新训练 300 步,看回答长度和输出。
参考答案(草稿目录里的实际运行):回答长度在第 25、100、200、300 步分别是 7.0、7.0、6.95、7.0,训练后的贪心回答是
oj|j$、ong|g$、hnlb|b$,和标准答案完全一致;准确率 98%。格式检查约束了原来不受约束的部分,漂移消失了。注意这改变了奖励,所以训练轨迹也和原来不同——不能把”300 步时的准确率差别”归因于格式检查本身。
练习 5(k 要多大?)。§7.2 说”起点在 n = 16 上的 pass@512 只有 17.0%,曲线还在加速上升”。(a) 要判断它会不会和 GRPO 交叉,你需要多大的 N?大致估算采样成本(我们的采样器约每秒 2,800 条)。(b) pass@k 的无偏估计在 k 接近 N 时有什么问题?
参考答案要点:(a) 起点每翻 4 倍 k 增加 1.4–5.1 个点,要从 17% 追到 50% 左右,即使增长继续加速,也可能需要 k 在 10⁴–10⁵ 量级;N 至少要和 k 同量级,200 道题 × 10⁵ 次 = 2,000 万条样本,约 2 小时(单线程),可行但昂贵——真实 LLM 上的同样实验要贵几个数量级,这也是 pass@k 之争难以定论的原因之一。(b) k 接近 N 时,估计只取决于”N 个样本里有没有对的”,方差很大;而且只有一组样本,不同 k 的估计高度相关。应该报告置信区间(例如对题目做自助法)。
练习 6(论文卡片)。用第 1 讲 §8.4 的论文卡片读 Yue et al.(2025)和 ProRL(Liu et al. 2025)。它们的实验设置有哪些不同(基座、训练步数、任务、k 的范围)?你能否设计一个实验,在同一个设置里同时看到两种现象?
参考答案要点:Yue et al. 用多个现成的 RLVR 模型和基座(数学、代码、视觉),k 到 256 或更大,训练步数是这些模型发布时的设置;ProRL 训练得长得多(2000+ 步),用 KL 控制和参考策略重置防止熵坍缩,任务更多样,并按”基座在这个任务上的能力”分析结果。我们的代码 02 就是一个”同一设置里同时看到两种现象”的例子:在训练分布上扩展(n = 12),在分布外收窄(n = 16 丢掉 14 道题),而且 RL 与 SFT 的曲线交叉。
练习 7(补盲区)。§9.4 提到”用 RL 策略的新样本重新训练奖励模型”。设计一个实验流程:每隔 M 步,用当前策略采样、用求解器标注(只有一部分,模拟昂贵的人工标注)、继续训练 ORM。你会测量什么来判断它有效?可能的失败方式是什么?
参考答案要点:测量”训练奖励 vs 真实奖励”的差距随时间的变化、测试集准确率、每次重训用的标注数量(成本)。可能的失败:策略比奖励模型跑得快(M 太大时,盲区在下次重训前就被钻穿);奖励模型在新样本上过拟合而忘掉旧的;标注预算不够时,补上的是”已经被钻的”盲区,新的盲区不断出现——这是 RLHF 里”奖励模型和策略的军备竞赛”。
15. 延伸阅读 · Further reading
自举与早期方法
- E. Zelikman, Y. Wu, J. Mu, N. Goodman. STaR: Bootstrapping Reasoning With Reasoning. NeurIPS 2022.
- Z. Yuan et al. Scaling Relationship on Learning Mathematical Reasoning with Large Language Models(RFT). 2023.
- A. Singh et al. Beyond Human Data: Scaling Self-Training for Problem-Solving with Language Models(ReST-EM). TMLR 2024.
算法
- J. Schulman et al. Proximal Policy Optimization Algorithms. 2017.
- Z. Shao et al. DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models(GRPO). 2024.
- A. Ahmadian et al. Back to Basics: Revisiting REINFORCE Style Optimization for Learning from Human Feedback in LLMs(RLOO). ACL 2024.
- Z. Liu et al. Understanding R1-Zero-Like Training: A Critical Perspective(Dr. GRPO). 2025.
- Q. Yu et al. DAPO: An Open-Source LLM Reinforcement Learning System at Scale. NeurIPS 2025.
- D. Khatri et al. The Art of Scaling Reinforcement Learning Compute for LLMs(ScaleRL). ICLR 2026.
推理模型
- N. Lambert et al. Tülu 3: Pushing Frontiers in Open Language Model Post-Training(RLVR). 2024.
- DeepSeek-AI. DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning. 2025(后发表于 Nature).
- Kimi Team. Kimi k1.5: Scaling Reinforcement Learning with LLMs. 2025.
RL 改变了什么
- Y. Yue et al. Does Reinforcement Learning Really Incentivize Reasoning Capacity in LLMs Beyond the Base Model? NeurIPS 2025.
- M. Liu et al. ProRL: Prolonged Reinforcement Learning Expands Reasoning Boundaries in Large Language Models. NeurIPS 2025.
- G. Cui et al. The Entropy Mechanism of Reinforcement Learning for Reasoning Language Models. 2025.
- K. Gandhi et al. Cognitive Behaviors that Enable Self-Improving Reasoners, or, Four Habits of Highly Effective STaRs. 2025.
- T. Chu et al. SFT Memorizes, RL Generalizes: A Comparative Study of Foundation Model Post-training. ICML 2025.
奖励与对照
- L. Gao, J. Schulman, J. Hilton. Scaling Laws for Reward Model Overoptimization. ICML 2023.
- R. Shao et al. Spurious Rewards: Rethinking Training Signals in RLVR. 2025.
- Y. Wang et al. Reinforcement Learning for Reasoning in Large Language Models with One Training Example. NeurIPS 2025.
- A. Hochlehnert et al. A Sober Look at Progress in Language Model Reasoning: Pitfalls and Paths to Reproducibility. 2025.
16. 下一讲预告 · Next lecture
第 6 讲:推理的可靠性——忠实性、捷径、长度泛化与”思考的幻觉”之争。 本讲反复看到”答案对不对”和”推理过程是什么”是两回事:RL 只奖励答案,推理链的尾部会漂移;验证器给”少走一步”的推理链打满分。下一讲正面讨论这个问题:模型写下的思维链,是它真正得出答案的过程,还是事后的说明?我们会在实验台上造一个”有提示可抄”的模型,测量它的思维链有多忠实;看看本讲和前几讲反复出现的长度泛化失败能不能用更好的格式修好;最后用一个”复杂度扫描”实验,复盘 2025 年”思考的幻觉”(The Illusion of Thinking)之争——实验设计怎样决定了结论。