第 6 讲:训练时扩展——用强化学习扩展推理(STaR、GRPO、DAPO)

Self-Improving AI Agents · Lecture 06。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

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

本篇目录

对应: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 学完本讲,你应该能够

  1. 说出为什么要把 test-time 的搜索”训练进模型”:一次付出训练成本,以后每次推理都受益;以及 RLVR(reinforcement learning with verifiable rewards)是什么。
  2. 写出 STaR 的循环(生成 → 只保留答对的 → 微调 → 重复)和 rationalization;解释 STaR 为什么可以看成一种策略梯度;说出它的两个弱点:飞轮会停转、verifier 的 false positive 会被学进去。
  3. 推导 REINFORCE 的策略梯度(log-derivative trick),解释基线为什么不改变梯度的期望却能减小方差,什么是优势(advantage)。
  4. 写出 PPO 的裁剪目标和 GRPO 的组内相对优势;说出 GRPO 相对 PPO 省掉了什么(价值网络)、付出了什么(每道题要采样一组);说出 DeepSeekMath 的主要结果和”Maj@K 提高、Pass@K 不明显提高”的发现。
  5. 说出 DAPO 的四个技巧(clip-higher、dynamic sampling、token-level loss、overlong reward shaping)各自解决什么问题。
  6. 讨论”RL 是在教模型新的能力,还是只把 pass@k 变成 pass@1”,并说出 toy world 为什么得出了和真实 LLM 不同的结论。

0.2 先修知识

知识点用在哪里最低要求
第 1~5 讲全讲toy world、verifier 的 false positive(第 3 讲)、RLEF 里的 REINFORCE(第 4 讲)
微积分第 3 节导数、链式法则;ddxlog⁡f(x)=f′(x)f(x)\frac{d}{dx}\log f(x) = \frac{f'(x)}{f(x)}
概率第 3 节期望、方差;“期望的梯度 = 梯度的期望”(在本讲的场景下可以交换)
softmax第 3.3 节πj=ezj/∑kezk\pi_j = e^{z_j} / \sum_k e^{z_k}
强化学习入门全讲策略、奖励、回报(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 的偏移量 Δ\Delta,加到原来的 logits 上:

logits(情境)=ToyLLM 原来的 logits+Δ[情境]\text{logits}(\text{情境}) = \text{ToyLLM 原来的 logits} + \Delta[\text{情境}]
  • Δ\Delta 初始为 0:训练前的模型和第 1 讲的 1B ToyLLM 完全一样。
  • 所有题目里同一种情境共享同一组参数:在一道题上学到的,会用到所有有这种情境的题上(泛化)。
  • 训练就是调整 Δ\Delta,让”做对”的做法概率变大。这是一个只有十几个”神经元”的语言模型。

训练前,几个情境下选 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 节的 R≫1R \gg 1)。
  • 没有积累。今天搜索找到的好解法,明天遇到类似的题还要重新搜一遍。

第 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 其实是一种策略梯度

论文指出了一个漂亮的联系。设模型生成推理 rr 和答案 y^\hat{y} 的概率是 pθ(r,y^∣x)p_\theta(r, \hat{y} \mid x),我们想最大化”答对的概率”:

J(θ)=Ex E(r,y^)∼pθ[1[y^=y]]J(\theta) = \mathbb{E}_{x}\ \mathbb{E}_{(r, \hat{y}) \sim p_\theta}\big[\mathbb{1}[\hat{y} = y]\big]

用第 3 节会推导的 log-derivative trick,它的梯度是

∇J(θ)=E[ 1[y^=y]⋅∇log⁡pθ(r,y^∣x) ]\nabla J(\theta) = \mathbb{E}\big[\ \mathbb{1}[\hat{y} = y] \cdot \nabla \log p_\theta(r, \hat{y} \mid x)\ \big]

这正是”只在答对的样本上做最大似然”的梯度:答错的样本权重是 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
00.1070.1070.107
10.246(36 条)0.371(117 条)0.126(107 条,71 条错)
20.393(101)0.446(245)0.179(140,99 条错)
30.430(137)0.463(270)0.190(144,97 条错)
40.424(138)0.476(280)0.228(168,102 条错)
50.412(140)0.491(273)0.231(151,88 条错)
60.395(130)0.477(269)0.219(165,96 条错)

最后一轮,几个情境下选 correct 的概率:

情境训练前STaR+ rationalization+ 粗糙的 verifier
加法,无进位0.8210.9610.9590.917
乘一位数0.5060.8360.8200.790
乘两位数0.1860.5770.6540.394
乘两位数、被乘数 ≥ 1000.1020.2020.5570.122
  1. 自我改进的飞轮:STaR 只用自己答对的推理,pass@1 在前三轮里从 0.107 涨到 0.43;模型越强,答对的题越多,下一轮的训练数据就越多。
  2. 飞轮会停转:第三轮以后停在 0.4 左右(还有一点随机波动)。总有一批难题模型始终做不对,它们永远产生不了训练数据。最难的情境只从 0.10 升到 0.20。
  3. rationalization 让难题也产生数据:数据量翻倍,最难情境的正确率从 0.10 升到 0.56,pass@1 也更高。
  4. verifier 的 false positive 会被学进去:只核对个位数时,保留下来的数据超过一半其实是错的。模型在这些错误的推理上微调,被”教坏”了:pass@1 只涨到 0.2 出头,最难的情境几乎原地不动。这是第 3 讲”verifier 决定一切”在自我训练中的直接体现。STaR 论文也讨论过这个问题:在选择题上,蒙对的推理会混进训练数据。

3. 策略梯度基础:REINFORCE、基线与优势

STaR 只鼓励好的样本,不惩罚坏的样本。更一般的方法是直接对”期望奖励”做梯度上升。这一节推导它的基础。

3.1 目标

一个策略 πθ\pi_\theta(语言模型)对题目 xx 生成回答 y=(a1,a2,…,aT)y = (a_1, a_2, \ldots, a_T)(一串 token,或 toy world 里的一串”做法”),得到奖励 r(x,y)r(x, y)。我们想最大化期望奖励:

J(θ)=Ex Ey∼πθ(⋅∣x)[r(x,y)]=Ex∑yπθ(y∣x) r(x,y)J(\theta) = \mathbb{E}_{x}\ \mathbb{E}_{y \sim \pi_\theta(\cdot \mid x)}\big[r(x, y)\big] = \mathbb{E}_x \sum_y \pi_\theta(y \mid x)\, r(x, y)

困难在于:yy 是采样出来的离散序列,奖励 rr 是一个程序(“答案对不对”),对 θ\theta 不可导。怎样求梯度?

3.2 log-derivative trick

对上式求梯度(奖励 rr 和 θ\theta 无关):

∇θJ=Ex∑yr(x,y) ∇θπθ(y∣x)\nabla_\theta J = \mathbb{E}_x \sum_y r(x, y)\, \nabla_\theta \pi_\theta(y \mid x)

关键的一步:∇π=π⋅∇log⁡π\nabla \pi = \pi \cdot \nabla \log \pi(因为 ∇log⁡π=∇π/π\nabla \log \pi = \nabla \pi / \pi)。代进去:

∇θJ=Ex∑yπθ(y∣x) r(x,y) ∇θlog⁡πθ(y∣x)=Ex, y∼πθ[ r(x,y) ∇θlog⁡πθ(y∣x) ]\nabla_\theta J = \mathbb{E}_x \sum_y \pi_\theta(y \mid x)\, r(x, y)\, \nabla_\theta \log \pi_\theta(y \mid x) = \mathbb{E}_{x,\ y \sim \pi_\theta}\big[\ r(x, y)\, \nabla_\theta \log \pi_\theta(y \mid x)\ \big]

右边又是一个对策略采样的期望,于是可以用采样来估计:采几个回答,算出 r⋅∇log⁡πr \cdot \nabla \log \pi,取平均。这就是 REINFORCE(Williams 1992)。而语言模型的 log⁡πθ(y∣x)=∑tlog⁡πθ(at∣x,a<t)\log \pi_\theta(y \mid x) = \sum_t \log \pi_\theta(a_t \mid x, a_{<t}) 是每个 token 的对数概率之和,梯度可以用反向传播算出来。

直觉:∇log⁡π(y)\nabla \log \pi(y) 指向”让 yy 更可能”的方向。乘上 rr:奖励高的回答被推得更可能,奖励为 0 的回答不动。

3.3 在 toy world 里:softmax 的梯度

toy world 里,每一步在情境 cc 下按 π(⋅∣c)=softmax(zc)\pi(\cdot \mid c) = \text{softmax}(z_c) 选做法。对数概率对 logits 的梯度是

∂log⁡π(a∣c)∂zc,j=1[j=a]−π(j∣c)\frac{\partial \log \pi(a \mid c)}{\partial z_{c,j}} = \mathbb{1}[j = a] - \pi(j \mid c)

即”选中的那个做法 +1,再减去所有做法的当前概率”。代码里的 add_grad 就是这一行公式(trainable_llm.py)。一个回答的梯度是它所有步骤的梯度之和。

3.4 基线:减去一个数,方差变小

REINFORCE 的估计是无偏的,但方差很大。设想所有回答的奖励都是 1:REINFORCE 会把所有采到的回答都推得更可能,而真正有用的信息(“哪个回答比别的好”)完全淹没在噪声里。

解决办法是减去一个基线 bb(只要它不依赖于采到的回答 yy):

∇θJ=E[ (r(x,y)−b(x)) ∇θlog⁡πθ(y∣x) ]\nabla_\theta J = \mathbb{E}\big[\ (r(x, y) - b(x))\, \nabla_\theta \log \pi_\theta(y \mid x)\ \big]

为什么不改变期望? 因为 Ey∼π[∇log⁡π(y)]=∑yπ(y)∇π(y)π(y)=∇∑yπ(y)=∇1=0\mathbb{E}_{y \sim \pi}[\nabla \log \pi(y)] = \sum_y \pi(y) \frac{\nabla \pi(y)}{\pi(y)} = \nabla \sum_y \pi(y) = \nabla 1 = 0。乘上一个常数 bb,期望仍然是 0。

为什么减小方差? 选一个接近”平均奖励”的 bb,r−br - b 的绝对值就变小了,而且有正有负:比平均好的回答被鼓励,比平均差的被打压,和平均差不多的几乎不动。r−br - b 叫做优势(advantage):这个回答比”平常”好多少。(“减去平均奖励”通常能减小方差,但这不是无条件成立的,最优的基线也不一定是平均奖励——练习 1 有一个反例。)

几种常用的基线:

  • 全局基线:过去奖励的滑动平均。
  • 价值函数:一个学出来的 V(x)V(x),预测”这道题平均能得多少分”(PPO 的 critic,第 4.1 节)。
  • 同一道题的其他样本:对同一道题采 GG 个回答,用其他回答的平均奖励作为基线——RLOO(REINFORCE leave-one-out):Ai=ri−1G−1∑j≠irjA_i = r_i - \frac{1}{G-1}\sum_{j \ne i} r_j。
  • 组内归一化:Ai=ri−mean(r1..G)std(r1..G)A_i = \frac{r_i - \text{mean}(r_{1..G})}{\text{std}(r_{1..G})}——GRPO(第 4.2 节)。

3.5 toy world:四种优势的比较

02_policy_gradient.py 演示 1:每个训练步抽 16 道题、每题 8 个样本,梯度 =1128∑iAi∑t∇log⁡π(at)= \frac{1}{128}\sum_i A_i \sum_t \nabla \log \pi(a_t),四种 AiA_i 的定义用同一个学习率:

方法第 0 步第 15 步第 30 步第 45 步第 60 步
只在答对的样本上 SFT(A=rA = r)0.1190.2050.3640.6210.804
REINFORCE + 全局基线0.1190.2170.3850.6210.816
RLOO0.1190.1760.3960.6770.856
GRPO0.1190.3980.8510.9360.951
RLOO(学习率 × 4)0.1190.8180.9560.9730.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 用同一批数据更新好几次。但更新几次之后,当前策略 πθ\pi_\theta 已经和采样时的旧策略 πold\pi_{\text{old}} 不同了,所以要乘上重要性比值 ρt=πθ(at)πold(at)\rho_t = \frac{\pi_\theta(a_t)}{\pi_{\text{old}}(a_t)},并且裁剪它,防止一批数据把策略推得太远:

LCLIP(θ)=Et[min⁡(ρtAt, clip(ρt,1−ϵ,1+ϵ) At)]L^{\text{CLIP}}(\theta) = \mathbb{E}_t\Big[\min\big(\rho_t A_t,\ \text{clip}(\rho_t, 1 - \epsilon, 1 + \epsilon)\, A_t\big)\Big]

直觉:At>0A_t > 0 时,ρt\rho_t 涨到 1+ϵ1 + \epsilon 就不再往上推(“已经鼓励够了”);At<0A_t < 0 时,ρt\rho_t 降到 1−ϵ1 - \epsilon 就不再往下压。常用 ϵ=0.2\epsilon = 0.2。

(2) 用一个价值网络(critic)估计优势。 PPO 训练一个和策略差不多大的价值模型 VϕV_\phi,预测”从这个位置往后能得多少奖励”,再用 GAE(generalized advantage estimation)为每个 token 算出优势。在 RLHF 里,还会在奖励里加一个 KL 惩罚,防止策略离参考模型太远。

问题是:critic 和策略一样大,要额外占用一份显存和计算;而且在”只有最后一个 token 有奖励”的推理任务里,训练一个准确的逐 token 价值函数很难。

4.2 GRPO:用一组回答互相比较,代替 critic

DeepSeekMath(Shao et al. 2024)提出 GRPO(Group Relative Policy Optimization):对每道题采样一组 GG 个回答 o1,…,oGo_1, \ldots, o_G,得到奖励 r1,…,rGr_1, \ldots, r_G,用组内归一化的奖励作为每个回答(的每个 token)的优势:

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

目标函数和 PPO 一样带裁剪,外加一个直接加在损失里的 KL 惩罚:

JGRPO(θ)=E[1G∑i=1G1∣oi∣∑t=1∣oi∣(min⁡(ρi,tA^i,t, clip(ρi,t,1−ϵ,1+ϵ)A^i,t)−β DKL[πθ ∥ πref])]J_{\text{GRPO}}(\theta) = \mathbb{E}\Bigg[\frac{1}{G}\sum_{i=1}^{G}\frac{1}{|o_i|}\sum_{t=1}^{|o_i|}\Big(\min\big(\rho_{i,t}\hat{A}_{i,t},\ \text{clip}(\rho_{i,t}, 1-\epsilon, 1+\epsilon)\hat{A}_{i,t}\big) - \beta\, \mathbb{D}_{\text{KL}}\big[\pi_\theta \,\|\, \pi_{\text{ref}}\big]\Big)\Bigg]

KL 用一个无偏、恒为正的估计:DKL≈πref(oi,t)πθ(oi,t)−log⁡πref(oi,t)πθ(oi,t)−1\mathbb{D}_{\text{KL}} \approx \frac{\pi_{\text{ref}}(o_{i,t})}{\pi_\theta(o_{i,t})} - \log\frac{\pi_{\text{ref}}(o_{i,t})}{\pi_\theta(o_{i,t})} - 1。

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@1pass@16平均熵
原模型,温度 1.00.1240.6400.842
原模型,温度 0.70.1650.640—
原模型,温度 0.40.2580.585—
GRPO 训练后,温度 1.00.9661.0000.044
情境原模型GRPO 训练后
乘两位数0.1860.984
乘两位数、被乘数 ≥ 1000.1020.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 的目标函数

JDAPO(θ)=E[1∑i=1G∣oi∣∑i=1G∑t=1∣oi∣min⁡(ρi,tA^i,t, clip(ρi,t,1−ϵlow,1+ϵhigh)A^i,t)]s.t.0<∣{oi 答对}∣<GJ_{\text{DAPO}}(\theta) = \mathbb{E}\Bigg[\frac{1}{\sum_{i=1}^{G}|o_i|}\sum_{i=1}^{G}\sum_{t=1}^{|o_i|}\min\Big(\rho_{i,t}\hat{A}_{i,t},\ \text{clip}\big(\rho_{i,t}, 1 - \epsilon_{\text{low}}, 1 + \epsilon_{\text{high}}\big)\hat{A}_{i,t}\Big)\Bigg] \quad \text{s.t.}\quad 0 < \big|\{o_i \text{ 答对}\}\big| < G

和 GRPO 相比有四处不同(外加去掉了 KL 惩罚)。

5.3 技巧一:Clip-Higher

问题:对称的裁剪(ϵ=0.2\epsilon = 0.2)对低概率和高概率的 token 不公平。一个概率 0.9 的 token,比值涨到 1.2 时概率是 1.08——早就超过 1 了,不受限制;一个概率 0.01 的 token,比值涨到 1.2 时概率只有 0.012。低概率的 token 很难被大幅提高,而探索恰恰需要提高那些”现在不太可能、但可能是对的”的 token。结果是策略的熵迅速下降,模型过早地变得确定。

做法:把上界和下界分开(decoupled),ϵlow=0.2\epsilon_{\text{low}} = 0.2 保持不变(不让好的 token 被压得太狠),ϵhigh\epsilon_{\text{high}} 放宽到 0.28(让低概率的 token 能被提高得更多)。论文显示这能明显延缓熵崩塌,保持样本的多样性。

5.4 技巧二:Dynamic Sampling

问题:如果一道题的 GG 个回答全对或全错,组内奖励的标准差是 0,所有优势都是 0,这组样本对梯度没有任何贡献。随着训练进行,模型越来越强,“全对”的题越来越多,一批里有效的样本越来越少,梯度的方差变大,训练变慢。

做法:过采样,丢掉准确率为 0 或 1 的组,直到凑满一批”有对有错”的组(目标函数里的约束条件)。代价是要多采样;但论文发现总的训练时间并没有明显增加,因为收敛更快。

5.5 技巧三:Token-Level Policy Gradient Loss

问题:GRPO 先在每个回答内部对 token 求平均(1∣oi∣∑t\frac{1}{|o_i|}\sum_t),再对回答求平均(1G∑i\frac{1}{G}\sum_i)。这样,长回答里的每个 token 权重更小:一个 10000 token 的回答和一个 100 token 的回答对损失的贡献一样大。在长 CoT 的训练里这带来两个问题:长回答里的好推理模式学得慢;长回答里的坏模式(重复、胡言乱语)惩罚得不够,回答的长度和熵会不健康地增长。

做法:直接对一批里所有 token 求平均(1∑i∣oi∣∑i∑t\frac{1}{\sum_i |o_i|}\sum_i\sum_t),每个 token 一视同仁。(后来的 Dr. GRPO 等工作也指出了 GRPO 的这种长度偏差,以及除以标准差带来的难度偏差。)

5.6 技巧四:Overlong Reward Shaping

问题:训练时会设一个最大生成长度,超过就截断。被截断的回答通常得不到正确答案,奖励为 −1(或 0)。但一个推理得很好、只是还没写完的回答,被当成”错的”来惩罚,会给训练引入噪声。

做法:两步。Overlong filtering:被截断的样本不参与损失。Soft overlong punishment:在最大长度之前设一个缓冲区间(论文里最大长度 20480、缓冲 4096),长度进入缓冲区间后线性地增加惩罚,超过最大长度时惩罚为 −1:

Rlength(y)={0,∣y∣≤Lmax⁡−Lcache(Lmax⁡−Lcache)−∣y∣Lcache,Lmax⁡−Lcache<∣y∣≤Lmax⁡−1,∣y∣>Lmax⁡R_{\text{length}}(y) = \begin{cases} 0, & |y| \le L_{\max} - L_{\text{cache}} \\ \frac{(L_{\max} - L_{\text{cache}}) - |y|}{L_{\text{cache}}}, & L_{\max} - L_{\text{cache}} < |y| \le L_{\max} \\ -1, & |y| > L_{\max} \end{cases}

这让模型平滑地学到”不要写得太长”,而不是突然被重罚。

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(ϵ\epsilon = 0.2 / 0.2)0.2500.6560.8483840
+ clip-higher(0.2 / 0.28)0.2540.6840.8603840
+ dynamic sampling0.4680.8590.9586728
+ token-level loss(= DAPO)0.4460.8530.9166256

被裁剪(不贡献梯度)的步数比例:所有配置都在 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 曲线,发现 kk 很小时 RL 后的模型更好,但 kk 很大时原模型的 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 的两个特点:

  1. 每一步只有一种正确的做法。 真实的推理有很多条正确的路;RL 把概率集中到少数几条上时,可能把模型原本偶尔会走的、对某些难题才有用的路给”压没了”。toy world 里没有这种”多样性的损失”。
  2. 参数在所有题之间完全共享。 在 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. 小结

  1. 为什么要 train-time 的自我改进:test-time 的搜索每次都要付成本、没有积累;把好的解法训练进模型,以后每次推理都受益。RLVR 用程序判断的奖励(核对答案、跑测试),精确、便宜、难以被钻空子;准确率随训练时的 RL 计算呈 log-linear 增长。
  2. STaR:生成 → 只保留答对的 → 从原始模型微调 → 重复;rationalization 让模型答不对的题也能产生数据。它是一种奖励为 0/1、没有基线的策略梯度。toy world 显示了它的飞轮(pass@1 三轮从 0.11 到 0.43)、飞轮的停转(做不对的题永远产生不了数据)、以及粗糙 verifier 的危害(一半以上的训练数据是错的推理)。
  3. 策略梯度:∇J=E[r⋅∇log⁡π]\nabla J = \mathbb{E}[r \cdot \nabla \log \pi](log-derivative trick);减去基线不改变期望、减小方差,r−br - b 是优势。RLOO 用同一道题的其他样本当基线,GRPO 再除以组内的标准差——这相当于一种按题目自适应的步长(toy world 里,RLOO 的学习率乘以 4 就和 GRPO 一样快)。
  4. PPO → GRPO:PPO 用 critic 估计优势、用裁剪限制每次更新的幅度;GRPO 用一组回答互相比较代替 critic,省显存、适合 RLVR。DeepSeekMath 7B 在 MATH 上达到 51.7%;它发现 RL 提高了 Maj@K 而 Pass@K 不明显——RL 让输出分布更稳健。
  5. DAPO:clip-higher(放宽上界,延缓熵崩塌)、dynamic sampling(丢掉全对或全错的组)、token-level loss(长回答的 token 一视同仁)、overlong reward shaping(平滑地惩罚超长),并去掉 KL;Qwen2.5-32B 在 AIME 2024 上达到 50 分。toy world 只能清楚地演示 dynamic sampling 的作用,其余技巧要解决的问题在小模型、短回答上不出现。
  6. RL 教会了什么:真实 LLM 上,有证据表明 RL 主要是锐化已有的能力(大 kk 时原模型的 pass@k 更高),也有工作认为足够的 RL 能扩展边界。toy world 显示 RL 能纠正”最相信的错误做法”(降温做不到),但它的结构(每步只有一种正确做法、参数完全共享)让它回答不了真实模型的边界问题。

8. 练习

1. log-derivative trick(第 3.2 节) 一个策略只有两个动作:A 的概率 p=σ(θ)p = \sigma(\theta),B 的概率 1−p1 - p。选 A 奖励 1,选 B 奖励 0。 (a) 写出 J(θ)J(\theta),直接求 dJdθ\frac{dJ}{d\theta}。 (b) 用 REINFORCE 的公式 E[r⋅ddθlog⁡π]\mathbb{E}[r \cdot \frac{d}{d\theta}\log\pi] 再算一遍,验证两者相等。 (c) 如果减去基线 b=0.5b = 0.5,REINFORCE 估计的期望变了吗?在 p=0.9p = 0.9 时,比较有无基线时单个样本梯度估计的方差。

参考答案

(a) J=p=σ(θ)J = p = \sigma(\theta),dJdθ=p(1−p)\frac{dJ}{d\theta} = p(1-p)。 (b) 选 A(概率 pp):r=1r = 1,ddθlog⁡p=1−p\frac{d}{d\theta}\log p = 1 - p;选 B:r=0r = 0。期望 =p⋅1⋅(1−p)=p(1−p)= p \cdot 1 \cdot (1 - p) = p(1-p)。相等。 (c) 期望不变:选 B 时 ddθlog⁡(1−p)=−p\frac{d}{d\theta}\log(1-p) = -p,多出来的项是 −0.5 [ p(1−p)+(1−p)(−p) ]=0-0.5\,[\,p(1-p) + (1-p)(-p)\,] = 0。 p=0.9p = 0.9 时,单个样本的梯度估计 XX:

  • 无基线:选 A 得 1×0.1=0.11 \times 0.1 = 0.1(概率 0.9),选 B 得 0。均值 0.09,方差 0.9×0.01−0.092=0.00090.9 \times 0.01 - 0.09^2 = 0.0009。
  • 基线 0.5:选 A 得 0.5×0.1=0.050.5 \times 0.1 = 0.05,选 B 得 (−0.5)(−0.9)=0.45(-0.5)(-0.9) = 0.45。均值仍是 0.09,方差 0.0225−0.0081=0.01440.0225 - 0.0081 = 0.0144——反而变大了。
  • 基线 0.1:选 A 得 0.9×0.1=0.090.9 \times 0.1 = 0.09,选 B 得 (−0.1)(−0.9)=0.09(-0.1)(-0.9) = 0.09。两种情况的估计完全相同,方差为 0!

方差最小的基线是 b∗=E[r g2]E[g2]b^* = \frac{\mathbb{E}[r\, g^2]}{\mathbb{E}[g^2]}(gg 是 ∇log⁡π\nabla \log \pi),这里等于 0.9×0.010.9×0.01+0.1×0.81=0.1\frac{0.9 \times 0.01}{0.9 \times 0.01 + 0.1 \times 0.81} = 0.1,并不是平均奖励 0.9。这道题说明:基线不改变期望,但选得不好也可能增大方差;“减去平均奖励”是一个简单、通常有效的近似,不是最优解。

2. 为什么基线不改变期望(第 3.4 节) 证明 Ey∼π[∇log⁡π(y)]=0\mathbb{E}_{y \sim \pi}[\nabla \log \pi(y)] = 0。如果基线 bb 依赖于采到的回答 yy 本身(例如 b=r(y)b = r(y)),为什么就不行了?

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) 答对的:1−0=11 - 0 = 1;答错的:0−1/3=−1/30 - 1/3 = -1/3。 (b) 均值 0.25,标准差 0.25×0.75≈0.433\sqrt{0.25 \times 0.75} \approx 0.433。答对的:0.75/0.433≈1.730.75 / 0.433 \approx 1.73;答错的:−0.25/0.433≈−0.58-0.25/0.433 \approx -0.58。 (c) RLOO:答错的 0−1=−10 - 1 = -1,答对的 1−2/3=1/31 - 2/3 = 1/3。GRPO:均值 0.75,标准差 0.433,答错的 −1.73-1.73,答对的 0.580.58。在很难的题上(只对 1 个),GRPO 把那个罕见的正确答案的优势放大到 1.73;在很简单的题上(只错 1 个),把那个罕见的错误答案的惩罚放大到 −1.73。罕见的结果被放大——这也是 Dr. GRPO 指出的”难度偏差”。

4. PPO 的裁剪(第 4.1、5.3 节) 某个 token 的旧概率是 0.02,优势 A>0A > 0,ϵ=0.2\epsilon = 0.2。 (a) 这一批更新里,它的概率最多被提高到多少就不再有梯度? (b) 换成 ϵhigh=0.28\epsilon_{\text{high}} = 0.28 呢? (c) 另一个 token 的旧概率是 0.8,同样的问题。为什么说对称的裁剪”对低概率 token 不公平”?

参考答案

(a) 0.02×1.2=0.0240.02 \times 1.2 = 0.024。 (b) 0.02×1.28=0.02560.02 \times 1.28 = 0.0256。 (c) 0.8×1.2=0.960.8 \times 1.2 = 0.96(ϵhigh=0.28\epsilon_{\text{high}} = 0.28 时上限 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) 0.98≈0.430.9^8 \approx 0.43(全错的概率 0.180.1^8 可以忽略)。 (b) 每组有效的概率约 0.57,平均要采 16/0.57≈2816 / 0.57 \approx 28 组,多采约 75%。 (c) 0.5×0.998+0.5×0.818≈0.5×0.923+0.5×0.185≈0.550.5 \times 0.99^8 + 0.5 \times 0.81^8 \approx 0.5 \times 0.923 + 0.5 \times 0.185 \approx 0.55,更多的组是全对的。实际训练集里题目难度参差不齐,全对或全错的组比”平均准确率”暗示的更多。

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 驱动的演化式编程,配合自动的评估器,发现了新的矩阵乘法算法和数学构造。
  • 共同的问题:怎样保证”评估器”不被钻空子?“新颖”怎样衡量?
← 返回课程目录