对应:Stanford CS329A Autumn 2025 Lecture 6(Fri 10/10,Train Time Scaling/Scaling RL);项目提案在这一天截止。阅读材料:STaR: Bootstrapping Reasoning With Reasoning(Zelikman et al. 2022)、DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models(Shao et al. 2024,提出 GRPO)、DAPO: An Open-Source LLM Reinforcement Learning System at Scale(Yu et al. 2025)。幻灯片没有公开,本讲依据这三篇论文编写,并补充了策略梯度的基础。 配套代码:
code/lecture06/(只用 Python 标准库,每个文件 12 秒) 预计阅读时间:34 小时(含运行代码)
0. 本讲导航
0.1 学完本讲,你应该能够
- 说出为什么要把 test-time 的搜索”训练进模型”:一次付出训练成本,以后每次推理都受益;以及 RLVR(reinforcement learning with verifiable rewards)是什么。
- 写出 STaR 的循环(生成 → 只保留答对的 → 微调 → 重复)和 rationalization;解释 STaR 为什么可以看成一种策略梯度;说出它的两个弱点:飞轮会停转、verifier 的 false positive 会被学进去。
- 推导 REINFORCE 的策略梯度(log-derivative trick),解释基线为什么不改变梯度的期望却能减小方差,什么是优势(advantage)。
- 写出 PPO 的裁剪目标和 GRPO 的组内相对优势;说出 GRPO 相对 PPO 省掉了什么(价值网络)、付出了什么(每道题要采样一组);说出 DeepSeekMath 的主要结果和”Maj@K 提高、Pass@K 不明显提高”的发现。
- 说出 DAPO 的四个技巧(clip-higher、dynamic sampling、token-level loss、overlong reward shaping)各自解决什么问题。
- 讨论”RL 是在教模型新的能力,还是只把 pass@k 变成 pass@1”,并说出 toy world 为什么得出了和真实 LLM 不同的结论。
0.2 先修知识
| 知识点 | 用在哪里 | 最低要求 |
|---|---|---|
| 第 1~5 讲 | 全讲 | toy world、verifier 的 false positive(第 3 讲)、RLEF 里的 REINFORCE(第 4 讲) |
| 微积分 | 第 3 节 | 导数、链式法则; |
| 概率 | 第 3 节 | 期望、方差;“期望的梯度 = 梯度的期望”(在本讲的场景下可以交换) |
| softmax | 第 3.3 节 | |
| 强化学习入门 | 全讲 | 策略、奖励、回报(CS234 第 1~2 讲;不熟也能读懂第 2、5 节) |
0.3 本讲地图
第1节 从 test-time 到 train-time:为什么要用 RL 训练推理
第2节 STaR:用自己答对的推理训练自己 ← 代码 01
第3节 策略梯度基础:REINFORCE、基线、优势 ← 代码 02 演示 1
第4节 从 PPO 到 GRPO(DeepSeekMath) ← 代码 02 演示 1、2
第5节 DAPO:大规模 RL 训练的四个技巧 ← 代码 03
第6节 RL 到底教会了模型什么?
第7–10节 小结、练习、延伸阅读、下一讲预告
0.4 本讲的 toy world:一个可以训练的模型
前面几讲的 ToyLLM 是固定的。本讲的 trainable_llm.py 给它加上可以学习的参数:对每一种”情境”——运算类型 × 这一步的难度(例如”乘两位数、被乘数 ≥ 100”)——有一个长度为 3 的偏移量 ,加到原来的 logits 上:
- 初始为 0:训练前的模型和第 1 讲的 1B ToyLLM 完全一样。
- 所有题目里同一种情境共享同一组参数:在一道题上学到的,会用到所有有这种情境的题上(泛化)。
- 训练就是调整 ,让”做对”的做法概率变大。这是一个只有十几个”神经元”的语言模型。
训练前,几个情境下选 correct 的概率:加法无进位 0.821,乘一位数 0.506,乘两位数 0.186,乘两位数且被乘数 ≥ 100 只有 0.102——后两个情境里,bug 的概率比 correct 还高(模型”最相信”错误的做法)。本讲训练和评估都用 temperature = 1(模型”本来的”分布)。
关于本讲的数字:论文里的数字注明出处;模拟实验的数字都来自 01~03 号代码的实际输出(固定随机种子,Python 3.9 与 3.13 逐字相同)。toy 模型的参数很少,训练几十步就能学会,效果的大小不代表真实的大规模训练,但其中的机制是相通的。
1. 从 test-time 到 train-time
1.1 为什么要把搜索训练进模型
第 2~5 讲的方法都在 test-time 花计算:采样很多次、验证、修改、搜索。它们很有效,但有两个问题:
- 每次推理都要付成本。服务大量用户时,推理成本会超过训练成本(第 2 讲第 4.6 节的 )。
- 没有积累。今天搜索找到的好解法,明天遇到类似的题还要重新搜一遍。
第 1 讲第 5.6 节描述过一个闭环:用 test-time 的搜索得到比模型单次输出更好的解,再用这些解训练模型,模型单次输出就变好了;然后再搜索、再训练……AlphaGo Zero 就是这样做的。在语言模型上,这个闭环有两种主要的形式:
- 自我训练(self-training):生成很多解答,用 verifier 过滤出好的,在它们上面做监督微调(STaR、rejection sampling fine-tuning、expert iteration)。
- 强化学习(RL):直接优化”得到高奖励的概率”,奖励来自 verifier(策略梯度、PPO、GRPO)。
第 2 节会看到,两者在数学上其实很接近。
1.2 RLVR:可验证的奖励
第 1 讲第 4.4 节列出了训练信号的演变:人写的示范 → 人的偏好 → AI 的反馈 → 可验证的奖励。本讲的方法几乎都用最后一种:
RLVR(reinforcement learning with verifiable rewards):奖励由程序判断——数学题核对最终答案,代码题跑测试——不需要训练 reward model。
好处是奖励精确、便宜、难以被钻空子(第 3 讲:verifier 的强弱决定一切,而程序化的核对是最强的 verifier 之一)。代价是只适用于有标准答案的任务。o1 和 DeepSeek-R1 的推理能力主要就来自 RLVR:在大量数学题、代码题上,只用”答对了没有”作为奖励,训练出了会长时间思考、会自我检查和回溯的模型(第 1 讲第 5.5 节)。
OpenAI 的 o1 博客展示了一个关键的观察:准确率随训练时的 RL 计算量呈 log-linear 增长,就像随 test-time 计算量增长一样。训练时的计算是另一条可以扩展的轴。
2. STaR:用自己答对的推理训练自己
2.1 动机
Zelikman et al. 2022 想解决的问题是:CoT(第 1 讲第 3.2 节)能提高推理能力,但要让模型学会写 CoT,有两种代价很高的办法:
- 收集大量人写的推理过程来微调——很贵;
- 只靠 few-shot 提示——效果比微调差很多。
能不能只用少量人写的推理示例,加上大量只有答案、没有推理过程的题目,让模型自己学会推理?
2.2 STaR 的循环
STaR(Self-Taught Reasoner)的循环很简单:
重复:
1. 用少量推理示例做 few-shot 提示,让当前模型为每道训练题生成推理 + 答案;
2. 只保留答案正确的(需要一个 verifier:核对标准答案);
3. rationalization:对答错的题,把正确答案作为提示给模型,让它生成一份通向这个答案的推理;
如果这份推理确实得到了正确答案,也保留下来(训练数据里不带提示);
4. 从原始的预训练模型出发,在保留下来的所有推理上微调;
5. 用微调后的模型回到第 1 步。
两个细节:
- rationalization:只用模型自己答对的题,模型永远学不会它答不对的题。给出答案提示后,模型更容易”倒推”出一份正确的推理,于是难题也能产生训练数据。训练时不带提示,模型学到的是”不看答案也这样推理”。
- 每一轮都从原始模型出发微调,而不是在上一轮的模型上继续微调,以减少过拟合。
结果:在 CommonsenseQA 上,GPT-J(6B)用 STaR 训练后的表现,和微调一个大 30 倍的 GPT-3(175B)相当,远好于直接微调来预测答案(不写推理)的模型。在 n 位数加法上,模型一轮一轮地学会了位数越来越多的加法,rationalization 让这个过程更快。
2.3 STaR 其实是一种策略梯度
论文指出了一个漂亮的联系。设模型生成推理 和答案 的概率是 ,我们想最大化”答对的概率”:
用第 3 节会推导的 log-derivative trick,它的梯度是
这正是”只在答对的样本上做最大似然”的梯度:答错的样本权重是 0,被直接扔掉;答对的样本权重是 1,被鼓励。所以 STaR 可以看成一种奖励为 0/1、没有基线的策略梯度(只是每轮在一批固定的数据上做很多步监督学习,而不是每采一次就更新一次)。
同一类方法还有很多名字:rejection sampling fine-tuning(RFT,Yuan et al. 2023)、ReST-EM(Singh et al. 2023)、expert iteration(Anthony et al. 2017)。它们的核心都是”采样 → 过滤 → 在好的样本上训练”。
2.4 toy world 里的 STaR
01_star.py:1B 可训练模型,300 道训练题、200 道测试题,跑 6 轮。三个版本:
- STaR:只用自己答对的推理。
- STaR + rationalization:答错的题,“看了答案提示”再生成一次(提示的效果卡通化为每一步 correct 的 logit + 1.5),答对了也保留。
- STaR + 粗糙的 verifier:verifier 只核对答案的个位数(像选择题一样,蒙对的机会是 10%)。
测试集 pass@1(括号里是这一轮保留的训练数据条数):
| 轮次 | STaR | + rationalization | + 粗糙的 verifier |
|---|---|---|---|
| 0 | 0.107 | 0.107 | 0.107 |
| 1 | 0.246(36 条) | 0.371(117 条) | 0.126(107 条,71 条错) |
| 2 | 0.393(101) | 0.446(245) | 0.179(140,99 条错) |
| 3 | 0.430(137) | 0.463(270) | 0.190(144,97 条错) |
| 4 | 0.424(138) | 0.476(280) | 0.228(168,102 条错) |
| 5 | 0.412(140) | 0.491(273) | 0.231(151,88 条错) |
| 6 | 0.395(130) | 0.477(269) | 0.219(165,96 条错) |
最后一轮,几个情境下选 correct 的概率:
| 情境 | 训练前 | STaR | + rationalization | + 粗糙的 verifier |
|---|---|---|---|---|
| 加法,无进位 | 0.821 | 0.961 | 0.959 | 0.917 |
| 乘一位数 | 0.506 | 0.836 | 0.820 | 0.790 |
| 乘两位数 | 0.186 | 0.577 | 0.654 | 0.394 |
| 乘两位数、被乘数 ≥ 100 | 0.102 | 0.202 | 0.557 | 0.122 |
- 自我改进的飞轮:STaR 只用自己答对的推理,pass@1 在前三轮里从 0.107 涨到 0.43;模型越强,答对的题越多,下一轮的训练数据就越多。
- 飞轮会停转:第三轮以后停在 0.4 左右(还有一点随机波动)。总有一批难题模型始终做不对,它们永远产生不了训练数据。最难的情境只从 0.10 升到 0.20。
- rationalization 让难题也产生数据:数据量翻倍,最难情境的正确率从 0.10 升到 0.56,pass@1 也更高。
- verifier 的 false positive 会被学进去:只核对个位数时,保留下来的数据超过一半其实是错的。模型在这些错误的推理上微调,被”教坏”了:pass@1 只涨到 0.2 出头,最难的情境几乎原地不动。这是第 3 讲”verifier 决定一切”在自我训练中的直接体现。STaR 论文也讨论过这个问题:在选择题上,蒙对的推理会混进训练数据。
3. 策略梯度基础:REINFORCE、基线与优势
STaR 只鼓励好的样本,不惩罚坏的样本。更一般的方法是直接对”期望奖励”做梯度上升。这一节推导它的基础。
3.1 目标
一个策略 (语言模型)对题目 生成回答 (一串 token,或 toy world 里的一串”做法”),得到奖励 。我们想最大化期望奖励:
困难在于: 是采样出来的离散序列,奖励 是一个程序(“答案对不对”),对 不可导。怎样求梯度?
3.2 log-derivative trick
对上式求梯度(奖励 和 无关):
关键的一步:(因为 )。代进去:
右边又是一个对策略采样的期望,于是可以用采样来估计:采几个回答,算出 ,取平均。这就是 REINFORCE(Williams 1992)。而语言模型的 是每个 token 的对数概率之和,梯度可以用反向传播算出来。
直觉: 指向”让 更可能”的方向。乘上 :奖励高的回答被推得更可能,奖励为 0 的回答不动。
3.3 在 toy world 里:softmax 的梯度
toy world 里,每一步在情境 下按 选做法。对数概率对 logits 的梯度是
即”选中的那个做法 +1,再减去所有做法的当前概率”。代码里的 add_grad 就是这一行公式(trainable_llm.py)。一个回答的梯度是它所有步骤的梯度之和。
3.4 基线:减去一个数,方差变小
REINFORCE 的估计是无偏的,但方差很大。设想所有回答的奖励都是 1:REINFORCE 会把所有采到的回答都推得更可能,而真正有用的信息(“哪个回答比别的好”)完全淹没在噪声里。
解决办法是减去一个基线 (只要它不依赖于采到的回答 ):
为什么不改变期望? 因为 。乘上一个常数 ,期望仍然是 0。
为什么减小方差? 选一个接近”平均奖励”的 , 的绝对值就变小了,而且有正有负:比平均好的回答被鼓励,比平均差的被打压,和平均差不多的几乎不动。 叫做优势(advantage):这个回答比”平常”好多少。(“减去平均奖励”通常能减小方差,但这不是无条件成立的,最优的基线也不一定是平均奖励——练习 1 有一个反例。)
几种常用的基线:
- 全局基线:过去奖励的滑动平均。
- 价值函数:一个学出来的 ,预测”这道题平均能得多少分”(PPO 的 critic,第 4.1 节)。
- 同一道题的其他样本:对同一道题采 个回答,用其他回答的平均奖励作为基线——RLOO(REINFORCE leave-one-out):。
- 组内归一化:——GRPO(第 4.2 节)。
3.5 toy world:四种优势的比较
02_policy_gradient.py 演示 1:每个训练步抽 16 道题、每题 8 个样本,梯度 ,四种 的定义用同一个学习率:
| 方法 | 第 0 步 | 第 15 步 | 第 30 步 | 第 45 步 | 第 60 步 |
|---|---|---|---|---|---|
| 只在答对的样本上 SFT() | 0.119 | 0.205 | 0.364 | 0.621 | 0.804 |
| REINFORCE + 全局基线 | 0.119 | 0.217 | 0.385 | 0.621 | 0.816 |
| RLOO | 0.119 | 0.176 | 0.396 | 0.677 | 0.856 |
| GRPO | 0.119 | 0.398 | 0.851 | 0.936 | 0.951 |
| RLOO(学习率 × 4) | 0.119 | 0.818 | 0.956 | 0.973 | 0.978 |
训练开始时,优势的平均绝对值:只在答对的样本上 SFT 0.115,REINFORCE + 全局基线 0.204,RLOO 0.163,GRPO 0.337。
- 四种方法都只用”答案对不对”作为奖励,都把 pass@1 从 0.12 提高到了 0.8 以上。RLVR 不需要 reward model。
- 同样的学习率下 GRPO 学得最快,但这主要是因为它除以了组内的标准差。它的优势平均幅度是 RLOO 的两倍;而且在”8 个里只对 1 个”这样的组里,标准差很小,那个答对的样本会得到很大的优势。把 RLOO 的学习率乘以 4,它就和 GRPO 一样快甚至更快。组内归一化本质上是一种按题目自适应的步长。
- “只在答对的样本上 SFT”不惩罚答错的样本;减去基线之后,答错的样本得到负的优势被”推开”,而”大家都能答对”的简单题上答对的样本几乎不再被鼓励——梯度集中在”有的对、有的错”的题上。
4. 从 PPO 到 GRPO
4.1 PPO:用一个 critic 估计优势,并限制每次更新的幅度
RLHF(第 1 讲第 4.3 节)用的 RL 算法是 PPO(Proximal Policy Optimization,Schulman et al. 2017)。它在 REINFORCE 的基础上做了两件事:
(1) 重要性采样 + 裁剪。 采一批数据要花很多计算(让模型生成很多回答),只用来更新一次太浪费。PPO 用同一批数据更新好几次。但更新几次之后,当前策略 已经和采样时的旧策略 不同了,所以要乘上重要性比值 ,并且裁剪它,防止一批数据把策略推得太远:
直觉: 时, 涨到 就不再往上推(“已经鼓励够了”); 时, 降到 就不再往下压。常用 。
(2) 用一个价值网络(critic)估计优势。 PPO 训练一个和策略差不多大的价值模型 ,预测”从这个位置往后能得多少奖励”,再用 GAE(generalized advantage estimation)为每个 token 算出优势。在 RLHF 里,还会在奖励里加一个 KL 惩罚,防止策略离参考模型太远。
问题是:critic 和策略一样大,要额外占用一份显存和计算;而且在”只有最后一个 token 有奖励”的推理任务里,训练一个准确的逐 token 价值函数很难。
4.2 GRPO:用一组回答互相比较,代替 critic
DeepSeekMath(Shao et al. 2024)提出 GRPO(Group Relative Policy Optimization):对每道题采样一组 个回答 ,得到奖励 ,用组内归一化的奖励作为每个回答(的每个 token)的优势:
目标函数和 PPO 一样带裁剪,外加一个直接加在损失里的 KL 惩罚:
KL 用一个无偏、恒为正的估计:。
GRPO 的取舍:
- 省掉了 critic:基线来自同一道题的其他回答,不需要训练价值网络,显存省了很多。
- 付出了采样成本:每道题要采一组(例如 64 个)回答。
- 天然适合 RLVR:奖励只在最后,同一道题的回答之间互相比较,“比平均好”就是好。
4.3 DeepSeekMath 的其他发现
数据:从 Common Crawl 里用一个迭代的分类器流水线挑出了 1200 亿个数学相关的 token,在 DeepSeek-Coder-Base-v1.5 7B 上继续预训练,得到 DeepSeekMath-Base 7B。数据质量是一切的基础。
结果:DeepSeekMath 7B(经过 SFT 和 GRPO)在竞赛级的 MATH 上达到 51.7%(不用外部工具、不投票),接近 Gemini Ultra 和 GPT-4;64 个样本做 self-consistency 达到 60.9%。
统一的视角:论文把 SFT、RFT(rejection sampling fine-tuning)、在线 RFT、DPO、PPO、GRPO 写成同一个梯度公式的不同特例,区别只在三个方面:数据从哪里来(离线的数据集,还是当前策略在线采样)、奖励函数(规则还是模型)、梯度系数(每个 token 被鼓励或打压的程度)。第 2.3 节说”STaR 是一种策略梯度”,就是这个视角的一个例子。
RL 提高了什么? 一个重要的观察:RL 显著提高了 Maj@K(多数投票的准确率),却没有明显提高 Pass@K。论文的解读是:RL 让输出分布更稳健——把正确答案从”排在前 K 个里”推到”排第一”——而不是从根本上提高了模型的能力。第 6 节会回到这个问题。
4.4 toy world:RL 学到了什么?
02_policy_gradient.py 演示 2 把 GRPO 训练 60 步后的模型,和”直接把原模型的温度调低”比较:
| 模型 | pass@1 | pass@16 | 平均熵 |
|---|---|---|---|
| 原模型,温度 1.0 | 0.124 | 0.640 | 0.842 |
| 原模型,温度 0.7 | 0.165 | 0.640 | — |
| 原模型,温度 0.4 | 0.258 | 0.585 | — |
| GRPO 训练后,温度 1.0 | 0.966 | 1.000 | 0.044 |
| 情境 | 原模型 | GRPO 训练后 |
|---|---|---|
| 乘两位数 | 0.186 | 0.984 |
| 乘两位数、被乘数 ≥ 100 | 0.102 | 0.986 |
- 降温只能”更确定”,不能”更正确”:pass@1 提高一点,温度降得多时 pass@16 下降;而在模型”最相信错误做法”的情境里,降温只会更常犯错。
- RL 不只是降温:它把原本 bug 占优的情境改成了 correct 占优——奖励告诉了它哪种做法才是对的。
- 熵从 0.84 降到 0.04:策略几乎变成确定性的(entropy collapse)。
- pass@16 也升到了 1.0——这和 DeepSeekMath 在真实模型上的观察不同(见第 6 节的讨论)。
5. DAPO:大规模 RL 训练的四个技巧
5.1 动机:复现 R1 并不容易
DeepSeek-R1 的论文给出了 GRPO 和”只用规则奖励”的方法,但很多关键的细节没有公开。Yu et al. 2025(字节跳动 Seed 与清华 AIR)发现,直接用朴素的 GRPO 在 Qwen2.5-32B 上训练,结果远低于 R1 报告的水平,并且观察到了几个问题:熵崩塌(模型很快变得确定,不再探索)、奖励噪声、训练不稳定。他们提出了 DAPO(Decoupled Clip and Dynamic sAmpling Policy Optimization),并完全开源了训练代码(基于 verl 框架)和数据集。
结果:用 Qwen2.5-32B 基础模型,在 AIME 2024 上达到 50 分,超过了 DeepSeek-R1-Zero-Qwen-32B 的 47 分,而且只用了它一半的训练步数。
5.2 DAPO 的目标函数
和 GRPO 相比有四处不同(外加去掉了 KL 惩罚)。
5.3 技巧一:Clip-Higher
问题:对称的裁剪()对低概率和高概率的 token 不公平。一个概率 0.9 的 token,比值涨到 1.2 时概率是 1.08——早就超过 1 了,不受限制;一个概率 0.01 的 token,比值涨到 1.2 时概率只有 0.012。低概率的 token 很难被大幅提高,而探索恰恰需要提高那些”现在不太可能、但可能是对的”的 token。结果是策略的熵迅速下降,模型过早地变得确定。
做法:把上界和下界分开(decoupled), 保持不变(不让好的 token 被压得太狠), 放宽到 0.28(让低概率的 token 能被提高得更多)。论文显示这能明显延缓熵崩塌,保持样本的多样性。
5.4 技巧二:Dynamic Sampling
问题:如果一道题的 个回答全对或全错,组内奖励的标准差是 0,所有优势都是 0,这组样本对梯度没有任何贡献。随着训练进行,模型越来越强,“全对”的题越来越多,一批里有效的样本越来越少,梯度的方差变大,训练变慢。
做法:过采样,丢掉准确率为 0 或 1 的组,直到凑满一批”有对有错”的组(目标函数里的约束条件)。代价是要多采样;但论文发现总的训练时间并没有明显增加,因为收敛更快。
5.5 技巧三:Token-Level Policy Gradient Loss
问题:GRPO 先在每个回答内部对 token 求平均(),再对回答求平均()。这样,长回答里的每个 token 权重更小:一个 10000 token 的回答和一个 100 token 的回答对损失的贡献一样大。在长 CoT 的训练里这带来两个问题:长回答里的好推理模式学得慢;长回答里的坏模式(重复、胡言乱语)惩罚得不够,回答的长度和熵会不健康地增长。
做法:直接对一批里所有 token 求平均(),每个 token 一视同仁。(后来的 Dr. GRPO 等工作也指出了 GRPO 的这种长度偏差,以及除以标准差带来的难度偏差。)
5.6 技巧四:Overlong Reward Shaping
问题:训练时会设一个最大生成长度,超过就截断。被截断的回答通常得不到正确答案,奖励为 −1(或 0)。但一个推理得很好、只是还没写完的回答,被当成”错的”来惩罚,会给训练引入噪声。
做法:两步。Overlong filtering:被截断的样本不参与损失。Soft overlong punishment:在最大长度之前设一个缓冲区间(论文里最大长度 20480、缓冲 4096),长度进入缓冲区间后线性地增加惩罚,超过最大长度时惩罚为 −1:
这让模型平滑地学到”不要写得太长”,而不是突然被重罚。
5.7 为什么去掉 KL 惩罚?
RLHF 里的 KL 惩罚是为了防止模型离初始模型太远(被 reward model 钻空子)。DAPO 认为,在长 CoT 的推理训练里,模型的分布本来就应该和初始模型差别很大(要学会全新的长推理行为),而且规则化的奖励很难被钻空子,所以这个限制没有必要。
5.8 toy world 里的 DAPO
03_dapo.py 实现了带裁剪、每批更新 4 次的 GRPO,再逐个加上前三个技巧(1B 模型,2~12 步题,每批 16 组 × 8 个样本,学习率 4):
| 配置 | 第 10 批 | 第 20 批 | 第 30 批 | 第 30 批时累计生成的样本数 |
|---|---|---|---|---|
| GRPO( = 0.2 / 0.2) | 0.250 | 0.656 | 0.848 | 3840 |
| + clip-higher(0.2 / 0.28) | 0.254 | 0.684 | 0.860 | 3840 |
| + dynamic sampling | 0.468 | 0.859 | 0.958 | 6728 |
| + token-level loss(= DAPO) | 0.446 | 0.853 | 0.916 | 6256 |
被裁剪(不贡献梯度)的步数比例:所有配置都在 0.1%~1.7% 之间。
- 全对或全错的组:训练越往后越多(模型变强,很多题 8 个全对),它们白白花掉了采样的成本。
- dynamic sampling 在同样的更新次数下学得快得多(第 30 批 0.958 vs 0.860),但多采了约 75% 的样本。按样本数算,效率和 GRPO 差不多:dynamic sampling 第 20 批用了 3864 个样本,pass@1 0.859;GRPO 第 30 批用了 3840 个样本,0.848。它用采样的成本换来了每次更新的效率。真实训练里,更新(反向传播)往往比采样更贵,这笔交易通常划算。
- clip-higher 在这里几乎没有影响:裁剪只在不到 2% 的步骤上发生,放宽上界自然改变不了什么。toy 模型的参数太少、更新太温和,低概率动作的比值很少超出 1.2。真实的大规模训练里,低概率 token 很容易在几次更新后就撞上上界,这正是 DAPO 观察到熵崩塌的原因。
- token-level loss 在这里也没有明显的提升(这次略差,在噪声范围内;编写时换别的学习率试过,有时更好)。toy world 里的”长回答”只有 12 步,没有真实长 CoT 里”上万个 token、夹杂重复和胡言乱语”的问题。
这一节的诚实总结:DAPO 的四个技巧都是为了解决大规模、长 CoT 训练中出现的具体问题。toy world 只能清楚地演示其中一个(dynamic sampling 的”无效样本”问题);另外几个技巧要解决的问题在小模型、短回答上根本不出现。一个技巧在小实验里没有效果,不代表它在大规模训练里没用;反过来也一样。
6. RL 到底教会了模型什么?
6.1 两种观点
这是 2025 年讨论最多的问题之一:
观点一:RL 主要是”锐化”(sharpening)已有的能力。
- DeepSeekMath:RL 提高了 Maj@K,但 Pass@K 没有明显提高。
- Yue et al. 2025(Does Reinforcement Learning Really Incentivize Reasoning Capacity in LLMs Beyond the Base Model?):在多个模型和任务上测量 pass@k 曲线,发现 很小时 RL 后的模型更好,但 很大时原模型的 pass@k 反而更高。他们认为 RL 让模型更容易采到它”本来就能”采到的正确推理,但缩小了它能覆盖的推理范围。
- 直觉:RL 的奖励只来自模型自己采到的样本。模型从来没采到过的正确推理,RL 无从鼓励(第 4 讲 RLEF 的”探索不足”,第 2.4 节 STaR 的”飞轮停转”)。
观点二:足够的 RL 可以扩展能力的边界。
- 也有工作(例如 NVIDIA 的 ProRL)认为,训练得足够久、配合保持探索的技巧(防止熵崩塌、定期重置参考模型等),RL 能让模型解出原模型采样很多次也解不出的题。
- o1、R1 的长 CoT 里出现了基础模型很少表现出的行为(长时间的自我检查和回溯),至少说明 RL 能大幅改变”模型倾向于怎样推理”。
这个问题还没有定论,也是很好的研究项目方向。
6.2 toy world 为什么得出了不同的结论?
第 4.4 节里,GRPO 训练后的模型 pass@16 从 0.64 升到了 1.0,似乎支持”RL 扩展了能力”。但要注意 toy world 的两个特点:
- 每一步只有一种正确的做法。 真实的推理有很多条正确的路;RL 把概率集中到少数几条上时,可能把模型原本偶尔会走的、对某些难题才有用的路给”压没了”。toy world 里没有这种”多样性的损失”。
- 参数在所有题之间完全共享。 在 toy world 里学会了”乘两位数要怎么算”,所有有这一步的题就全会了。真实模型的知识和能力分布在巨大的参数空间里,在一类题上的强化不一定迁移到另一类题。
所以 toy world 展示的是 RL 能做到的事(把模型”最相信的错误做法”纠正过来,这是降温做不到的),但不能回答”真实 LLM 上 RL 的边界在哪里”。
6.3 几个实践上的提醒
- verifier 的质量决定上限:粗糙的 verifier 会把错误的推理学进去(第 2.4 节);规则奖励也会被钻空子,例如模型学会输出一个格式正确但无意义的答案、或者利用答案解析程序的漏洞。
- 数据的难度要合适:太难的题全错、太简单的题全对,都没有梯度(dynamic sampling 的动机)。很多工作会按当前模型的准确率筛选训练题(curriculum)。
- 采样是主要的成本:RL 训练的大部分时间花在让模型生成回答上。GRPO 省掉了 critic,却要求每道题采一组。
- 训练时计算和测试时计算是互补的:RL 训练出的 reasoning model,测试时仍然可以用多采样、验证和搜索(第 2~5 讲)进一步提高。
7. 小结
- 为什么要 train-time 的自我改进:test-time 的搜索每次都要付成本、没有积累;把好的解法训练进模型,以后每次推理都受益。RLVR 用程序判断的奖励(核对答案、跑测试),精确、便宜、难以被钻空子;准确率随训练时的 RL 计算呈 log-linear 增长。
- STaR:生成 → 只保留答对的 → 从原始模型微调 → 重复;rationalization 让模型答不对的题也能产生数据。它是一种奖励为 0/1、没有基线的策略梯度。toy world 显示了它的飞轮(pass@1 三轮从 0.11 到 0.43)、飞轮的停转(做不对的题永远产生不了数据)、以及粗糙 verifier 的危害(一半以上的训练数据是错的推理)。
- 策略梯度:(log-derivative trick);减去基线不改变期望、减小方差, 是优势。RLOO 用同一道题的其他样本当基线,GRPO 再除以组内的标准差——这相当于一种按题目自适应的步长(toy world 里,RLOO 的学习率乘以 4 就和 GRPO 一样快)。
- PPO → GRPO:PPO 用 critic 估计优势、用裁剪限制每次更新的幅度;GRPO 用一组回答互相比较代替 critic,省显存、适合 RLVR。DeepSeekMath 7B 在 MATH 上达到 51.7%;它发现 RL 提高了 Maj@K 而 Pass@K 不明显——RL 让输出分布更稳健。
- DAPO:clip-higher(放宽上界,延缓熵崩塌)、dynamic sampling(丢掉全对或全错的组)、token-level loss(长回答的 token 一视同仁)、overlong reward shaping(平滑地惩罚超长),并去掉 KL;Qwen2.5-32B 在 AIME 2024 上达到 50 分。toy world 只能清楚地演示 dynamic sampling 的作用,其余技巧要解决的问题在小模型、短回答上不出现。
- RL 教会了什么:真实 LLM 上,有证据表明 RL 主要是锐化已有的能力(大 时原模型的 pass@k 更高),也有工作认为足够的 RL 能扩展边界。toy world 显示 RL 能纠正”最相信的错误做法”(降温做不到),但它的结构(每步只有一种正确做法、参数完全共享)让它回答不了真实模型的边界问题。
8. 练习
1. log-derivative trick(第 3.2 节) 一个策略只有两个动作:A 的概率 ,B 的概率 。选 A 奖励 1,选 B 奖励 0。 (a) 写出 ,直接求 。 (b) 用 REINFORCE 的公式 再算一遍,验证两者相等。 (c) 如果减去基线 ,REINFORCE 估计的期望变了吗?在 时,比较有无基线时单个样本梯度估计的方差。
参考答案
(a) ,。 (b) 选 A(概率 ):,;选 B:。期望 。相等。 (c) 期望不变:选 B 时 ,多出来的项是 。 时,单个样本的梯度估计 :
- 无基线:选 A 得 (概率 0.9),选 B 得 0。均值 0.09,方差 。
- 基线 0.5:选 A 得 ,选 B 得 。均值仍是 0.09,方差 ——反而变大了。
- 基线 0.1:选 A 得 ,选 B 得 。两种情况的估计完全相同,方差为 0!
方差最小的基线是 ( 是 ),这里等于 ,并不是平均奖励 0.9。这道题说明:基线不改变期望,但选得不好也可能增大方差;“减去平均奖励”是一个简单、通常有效的近似,不是最优解。
2. 为什么基线不改变期望(第 3.4 节) 证明 。如果基线 依赖于采到的回答 本身(例如 ),为什么就不行了?
3. RLOO 和 GRPO(第 3.4、4.2 节) 一道题采了 4 个回答,奖励是 1, 0, 0, 0。 (a) 用 RLOO 算每个回答的优势。 (b) 用 GRPO(总体标准差)算每个回答的优势。 (c) 如果奖励是 1, 1, 1, 0 呢?比较 (a)(b)(c),说明 GRPO 的归一化在”很难”和”很简单”的题上分别放大了什么。
参考答案
(a) 答对的:;答错的:。 (b) 均值 0.25,标准差 。答对的:;答错的:。 (c) RLOO:答错的 ,答对的 。GRPO:均值 0.75,标准差 0.433,答错的 ,答对的 。在很难的题上(只对 1 个),GRPO 把那个罕见的正确答案的优势放大到 1.73;在很简单的题上(只错 1 个),把那个罕见的错误答案的惩罚放大到 −1.73。罕见的结果被放大——这也是 Dr. GRPO 指出的”难度偏差”。
4. PPO 的裁剪(第 4.1、5.3 节) 某个 token 的旧概率是 0.02,优势 ,。 (a) 这一批更新里,它的概率最多被提高到多少就不再有梯度? (b) 换成 呢? (c) 另一个 token 的旧概率是 0.8,同样的问题。为什么说对称的裁剪”对低概率 token 不公平”?
参考答案
(a) 。 (b) 。 (c) ( 时上限 1.024,实际受概率不超过 1 的限制)。高概率 token 一批之内可以涨 0.16,低概率 token 只能涨 0.004;而探索恰恰需要提高低概率的 token。
5. Dynamic sampling 的成本(第 5.4、5.8 节) 某个阶段,模型在训练题上的准确率是 0.9,每组 8 个样本。 (a) 一组全对的概率是多少?(假设每个样本独立、每道题的准确率都是 0.9) (b) 为了凑满 16 个”有对有错”的组,平均要采多少组? (c) 如果每道题的准确率不同(一半题 0.99、一半题 0.81),全对的比例会怎样变化?
参考答案
(a) (全错的概率 可以忽略)。 (b) 每组有效的概率约 0.57,平均要采 组,多采约 75%。 (c) ,更多的组是全对的。实际训练集里题目难度参差不齐,全对或全错的组比”平均准确率”暗示的更多。
6. STaR 的飞轮(第 2.4 节)
(a) 为什么纯 STaR 在第三轮以后就停止进步了?用”哪些题能产生训练数据”解释。
(b) rationalization 给的”提示”在真实任务里是什么?它有没有可能带来新的问题(提示:模型可能学会”凑”答案)?
(c) 在 01 号文件里把 HINT_BONUS 改成 0.5 和 3.0,结果怎样变化?
7. RL 与降温(第 4.4 节) (a) 为什么降低温度能提高 pass@1?在什么情况下降温反而会让 pass@1 下降? (b) 在 02 号文件演示 2 里,再加一行”GRPO 训练后,温度 0.5”。它的 pass@16 和温度 1.0 比如何?
8. 动手改代码
(a) 在 02 号文件里把 GROUP 从 8 改成 2 和 32。RLOO 和 GRPO 的学习速度怎样变化?
(b) 在 03 号文件里把学习率 LR 改成 16,被裁剪的比例会变多少?clip-higher 开始有影响了吗?
(c) 在 03 号文件里把 MU(每批更新几次)从 4 改成 1。还有裁剪发生吗?为什么?
(d) 在 01 号文件里把粗糙的 verifier 改成”只核对答案是不是偶数”(蒙对的机会 50%)。STaR 还能学到东西吗?
9. 研究问题 设计一个实验,检验”RL 是锐化还是扩展”:你会用什么任务、什么模型、测量什么指标?怎样排除”训练集和测试集太像”带来的混淆?
9. 延伸阅读
本讲的阅读材料
- Zelikman et al. 2022. STaR: Bootstrapping Reasoning With Reasoning.
- Shao et al. 2024. DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models.(GRPO)
- Yu et al. 2025. DAPO: An Open-Source LLM Reinforcement Learning System at Scale.
策略梯度与 PPO
- Williams 1992. Simple Statistical Gradient-Following Algorithms for Connectionist Reinforcement Learning.(REINFORCE)
- Schulman et al. 2017. Proximal Policy Optimization Algorithms.
- Ahmadian et al. 2024. Back to Basics: Revisiting REINFORCE Style Optimization for Learning from Human Feedback in LLMs.(RLOO)
- 同目录 CS234 第 5~7 讲(策略梯度、PPO)、CS329H 第 8 讲(RLHF 里的 PPO)、CS336 第 16 讲(RLVR)。
自我训练
- Yuan et al. 2023. Scaling Relationship on Learning Mathematical Reasoning with Large Language Models.(RFT)
- Singh et al. 2023. Beyond Human Data: Scaling Self-Training for Problem-Solving with Language Models.(ReST-EM)
RL 教会了什么
- DeepSeek-AI 2025. DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning.
- Yue et al. 2025. Does Reinforcement Learning Really Incentivize Reasoning Capacity in LLMs Beyond the Base Model?
- Liu et al. 2025. Understanding R1-Zero-Like Training: A Critical Perspective.(Dr. GRPO)
10. 下一讲预告
第 7 讲:开放式演化——自我改进 agent 的自动设计
本讲改进的是模型的权重。还有一层更”激进”的自我改进:改进系统的设计本身。第 7 讲讨论:
- ADAS:让一个 meta agent 用代码写出新的 agent 设计,不断存档、迭代。
- The AI Scientist:从产生想法、做实验到写论文、自动审稿,全流程自动化的科研 agent。
- AlphaEvolve:LLM 驱动的演化式编程,配合自动的评估器,发现了新的矩阵乘法算法和数学构造。
- 共同的问题:怎样保证”评估器”不被钻空子?“新颖”怎样衡量?