阶段 5 · 大模型怎么炼成

RLVR:把裁判换成一个
不会说谎的程序

上一章 《DPO 家族》 一步跳过了奖励模型,但只能在已有回答里排序。 RLHF 留下的毛病还在:裁判是学出来的,只会模仿人的偏好。 2025 年最重要的一次转向是:数学题对答案、代码跑单元测试,让程序来判分。 程序不会因为你嘴甜就给你分。

1

奖励模型是个可以被钻的漏洞

《DPO 家族》绕开了这个裁判,却没治好它。问题出在更前面的《RLHF》:裁判是一个 学出来的奖励模型,从人类偏好数据里模仿出来,所以有三个问题:

图解 · 奖励模型是怎么被钻的(RLHF 的问题全在这条链上)

人类偏好数据 A 比 B 好 奖励模型 学出来的裁判 策略模型 只朝“分数更高”走 分数很高 事情没做对 问题就在第三步:模型只会朝“分数更高”走,而那条路上裁判能看见的,只有它训练时见过的那点东西 RLVR 换掉的是第二个盒子 —— 不看人了,让程序对答案
问题具体表现
它模仿的是"人觉得好" 模型发现长回答、多分点、语气谦逊能让奖励模型打高分—— 哪怕内容是错的。这叫谄媚(sycophancy)
它只在训练分布内可靠 强化学习会主动把模型推到奖励模型的盲区。一旦越界, 奖励分数就完全失去意义——模型在刷分,不是在变好
人类标注成本极高 一份高质量偏好数据要人一条条对比,还很难覆盖数学、代码这类需要专业判断的领域

互动 · 拖「回答篇幅」,看裁判的分和真实正确率怎么分家

🎯 类比

奖励模型像一个靠印象打分的助教。学生很快发现:字写工整、卷面写满, 就算答案错了也能捞几分。于是全班开始练字,没人再认真做题。
RLVR(Reinforcement Learning with Verifiable Rewards)换的是一个对答案的老师—— 用规则或程序自动判对错,他只看最后的数字对不对,你写得多漂亮都没用。 它不是"更好的奖励模型",而是根本不要奖励模型。

2

哪些任务可以"验证"

图解 · 把任务摆到「有没有唯一答案」这根轴上

数学题 代码 选择题 结构化输出 逻辑 / 证明 对答案 · 跑测试 写文案 · 共情 · 创意 ← 有唯一答案:程序看一眼就知道对不对 没有唯一答案:只能请人来判 → RLVR 只能用到这左边
任务类型怎么自动判分能不能用
数学题把答案抽出来和标准答案做字符串/数值比对 ✅ RLVR 的主战场
代码真的把生成的代码跑一遍单元测试(一小段自动检查代码对不对的程序) ✅ 最干净的信号
结构化输出用正则或 JSON 解析器(按格式规则检查文本的小工具)检查格式 ✅ 常作为辅助奖励
选择题 / 填空题直接对答案 ✅
逻辑推理 / 证明用求解器或形式化验证器(能自动证明对错的程序)检查 ⚠️ 只覆盖能被形式化的那部分
写文案 / 共情 / 创意没有唯一正确答案 ❌ 用不了,只能回到 RLHF

标准答案不用现场请人打:它们来自现成的题库。

那这些数学题的标准答案是谁准备的?

GSM8K、MATH 这类数据集里,题目和答案都是人工标注、反复核对过的—— 判分程序直接拿它对答案。

⚠️ 这里有个大坑,必须先说

"可验证"不等于"等于人类想要的"。
你让程序检查最终答案,模型可能会学会猜答案格式—— 比如只把最终答案的格式写对,内容对不对全看运气。 信号不会说谎,但信号覆盖不到的地方,就是新的钻空子空间(第 7 节会展开)。

3

GRPO:把价值网络整个删掉

有了可靠的奖励还不够,怎么把它变成梯度是另一半问题。
PPO 的做法是训练一个额外的价值网络(critic)去预测"这一步大概能拿多少分", 再用它算优势。问题很直接:critic 和策略模型一样大,显存直接翻倍。 (图上那格「12 字节/参数」是什么,第 4 节拆开算。)

GRPO(Group Relative Policy Optimization,组内相对的策略优化)的想法是:我不需要预测分数,我只需要比较。 对同一个问题采样一组回答,用这一组内部的相对好坏来算优势。

图解 · GRPO 删掉的那个盒子,在哪一条线上

PPO 采样 G 条回答 价值网络 critic 可训练 · 12 字节/参数 优势 A 更新策略模型 GRPO 采样 G 条回答 组内标准化 不用训练 · 0 字节/参数 优势 A 更新策略模型 这一格换成一个统计量

人话版 Ai = ( ri − mean(r) ) / std(r)

r = 这一组每个回答拿到的奖励 A = 优势(比这一组的平均水平好多少)

它跟《强化学习入门》第 2 节的「减去平均分」是同一件事,只是把那里的基线 b,换成了同一题几次回答的平均,再除以一个标准差。

👆 先悬停,再点那个按钮

把鼠标停在下面公式里有下划线的符号上——下面「奖励类型」和「全对 / 全错」两组按钮会分别亮起来。 公式里的 r 和 std,就是你按的那两个按钮在改的东西。

互动 · 组内优势的计算

💡 一定要亲手点一下"全对"和"全错"

你会发现 std = 0,所有优势都变成 0,梯度整个消失。
道理很简单:标准化要除以标准差。如果一组回答的分数完全一样, 那"比平均好多少"这个问题就没有意义——它们全都等于平均。
这不是 bug,这是 GRPO 的结构性约束,直接导致了两件事: ① 太简单的题白采样,太难的题也白采样;② 必须动态挑选"有区分度"的题—— 这正是 DAPO 里"动态采样"要解决的问题。

全对的一组确实没有信息:每条一样好,模型分不出哪种写法更好。

一组全是好答案,为什么反而没信息?

更新靠的是「比组内平均好多少」。全对时每条都一样好,模型分不出哪种写法更好; 整组一起加强只会让它更确信已经会的写法,学不到新东西。

M

数学 · A 怎么发到每个 token

上一节算出的优势 A,是一条回答一个数。 可一条回答有几千个 token——这一章的全部数学就是:这一个数,怎么发到每一个 token 头上。 这条路叫信用分配(credit assignment):干完一整件事只拿到一个总分,现在要把这个总分摊到每一步上。

动画 · 拖一个 A,看这一整条回答的每个 token 被改了多少

A0.87这一条回答的优势,一个数 gt12 个就是公式里的 ∇θ log πθ(o_t|q) Δt—A 乘 gt,每个 token 的更新量

互动 · 每个符号管图上的哪一块

🎯 用「教练打分」理解这个式子

一条回答 = 一场比赛,每个 token = 场上的一个动作。
A 是赛后那一个总分(比同组的其他场次高,还是低)。
教练没时间逐个动作点评,他只能把这个总分乘到每一个动作上: 这局赢了,所有动作都说「照这样做」;输了,所有动作都说「换个做法」。
这就是信用分配:一个标量,摊到几千个动作。

🎬 自己验一遍

把上面那张图的 A 拖到 0:每一根柱子一起消失, 整条回答一个 token 都没被改。
这就是第 3 节「全对」那一组在公式上的样子——GRPO 的「白采样」。

4

显存账本:省掉的到底是多少

"删掉价值网络"听起来只是少了一个模型,但在训练时它省掉的是一整套优化器状态。 下面按参数量真实计算。

互动 · PPO vs GRPO 的显存清单

为什么能省一半?因为省掉的是两个模型(价值网络 + 奖励模型), 而且训练中的模型和冻结的模型,每个参数占的字节完全不同:

模型状态每个参数占多少字节为什么
冻结(只做前向)2 字节 只存一份 bf16 权重(16 位的低精度浮点数,省内存),梯度、优化器状态都不需要
可训练(Adam 优化)12 字节 2(权重)+ 2(梯度)+ 4(动量 m)+ 4(方差 v)
差距6 倍 所以"少一个可训练模型"等于省掉 6 个冻结模型的量

RLHF 里的 PPO 要四个模型(策略 ✓训练、价值 ✓训练、参考 ✗冻结、奖励 ✗冻结)= 28 字节/参数; GRPO + RLVR 只要两个(策略 ✓训练、参考 ✗冻结)= 14 字节/参数—— 可验证任务里连奖励模型也不要,所以省掉的是两个模型:价值网络 12 + 奖励模型 2。 只删价值网络是 16 字节/参数,也就是省 43%(把上面开关切到「开放式」就是这个数)。 显存直接砍半。这就是为什么 2025 年之后,几乎所有开源推理模型都用 GRPO 而不是 PPO—— 它至少不比 PPO 差,而且跑得起。

口径注:这里的 12 字节 = 权重 2 + 梯度 2 + Adam 的 m、v 各 4,不含 FP32 参数主副本 (《LoRA》那章同一口径)。混合精度训练通常还要多存一份 4 字节主副本 (给优化器用的高精度参数备份),加上它就是可训练 16 字节/参数, 两个总数变成 PPO 36、GRPO 18 字节/参数(《分布式训练与集群》《显存账本》用的正是含主副本的口径)。 砍半的结论不变,只是 7B 的绝对值抬到 ≈ 250 GB。

5

那个著名的"顿悟时刻"

DeepSeek-R1 的论文里记录了一个没人预料到的现象: 训练到中途,模型自己学会了停下来重新检查。

互动 · 训练过程中的长度自发增长

为什么这件事重要

没有人教它"要检查"。训练数据里没有这种样本,奖励函数也只检查最终答案对不对。
它之所以长出来,是因为:检查一遍能提高答对的概率,而答对能拿奖励。 于是"多想一会儿"这个行为被强化了。
这说明 RLVR 不只是"让模型更准"——它能逼出新的行为模式。 这也是"推理模型"这个概念的技术来源。

⚠️ 但它也带来了长度爆炸

同样的机制也会导致模型越写越长直到啰嗦——在数学题上多写几步推理往往更容易答对 (R1 论文观察到,训练中回答长度一路增长)。 于是需要额外的 长度惩罚(太长的回答扣一点分)或长度控制。
这是 RL 的典型特征:你奖励什么,就会得到什么,包括你没想要的那些。

6

GRPO 之后的一堆变体

图解 · 这条线上的改动,方向一直是同一个

PPO 2017 RLOO 2024 GRPO 2024 Dr.GRPO 修偏置 DAPO 2025 GSPO 2025 删掉 critic ↓ 用组内统计量代替它 丢掉全对 / 全错的组 方向上只做一件事:把“需要额外训练的组件”一个一个换成简单的统计量
方法改了什么为什么改
PPO
2017 / RLHF 2019
策略 + 价值网络 + 优势估计(GAE)+ 裁剪目标 通用 RL 算法,什么任务都能用,但要训 critic
RLOO
2024
优势 = 当前奖励 − 其他回答的平均奖励(留一法:算谁的基线,就把它自己排除在外) GRPO 的近亲,不用除以标准差,更容易实现
GRPO
2024
删掉 critic,用组内标准化算优势 显存砍半,训练更简单,成为事实标准
Dr.GRPO
2025
去掉 GRPO 里对长度的隐式偏置——训练时每条回答的每个词都会算一个损失 (优势 × 这个词的对数概率),原版把它们加起来再除以回答长度, 于是回答越长,每个词挨的罚越少 原版 GRPO 有个长度偏置:答错时越写越长、答对时反而被往短里推, 整体回答被拉长(尤其答错的)——白烧 token
DAPO
2025
① clip-higher(放宽裁剪上界,让低概率的好答案也能涨——防的是熵坍塌: 模型越来越只会一种说法、不再探索)② 动态采样(丢掉全对/全错的组) ③ token 级损失(每个词各算各的,不再按整条回答平摊) ④ 超长奖励塑形(回答太长就扣一点分) 直接针对 GRPO 的四个已知痛点。目前最强的开源配方之一
GSPO
2025
把重要性比(新旧模型对同一个词的概率之比)从 token 级改成序列级 (整条回答共用一个比值,不再每个词一个) 长序列训练更稳定,梯度方差更小
ReMax / RLOO 变体 用贪心解码的奖励当基线,省掉组采样 省约 50% 显存、约 2 倍快;代价是额外跑一次贪心生成
看这张表要抓住一条主线

从 PPO → GRPO → DAPO,改动方向一直是同一个: 不断删掉"需要额外训练的组件",用更简单的统计量替代。
代价估计(critic)→ 组内均值;奖励模型 → 程序判分。
每一刀都砍在"训练更稳、跑得更省"上,而不是"理论更漂亮"。 这是理解这两年 RL 进展最快的角度。

选择很简单:有现成的「A 比 B 好」偏好对就用 《DPO 家族》, 有自动判分就用 GRPO。

DPO 和 GRPO 都在删模型,我什么时候用哪个?

任务开放(写文案、对话)、手上已有偏好对 → 用 DPO,一步到位; 有能自动判对错的场地、目标是练推理 → 用 GRPO。两者不冲突,常分阶段用。

7

RLVR 的四个硬伤

硬伤具体表现
① 只能用在可验证任务上 写作、共情、开放式创作、审美——这些恰恰是人类最在意的一批任务, 但没有自动判分的方法。所以只做 RLVR 的模型,会把能力集中到这类任务上,说话的分寸没人优化
② reward hacking(钻奖励的空子)换了形式 程序不会说谎,但它只检查它检查的那件事。 只检查最终答案 → 模型学会猜答案;只检查格式 → 模型学会写格式; 只检查单元测试 → 模型学会过测试而不是写对的代码
③ 全对/全错组没有梯度 std = 0 就白采样。简单题和极难题都在浪费算力, 必须动态筛选"有区分度"的题——这本身就是个需要额外工程的问题
④ 采样成本极高 GRPO 每个问题要采样 G 个回答(常见 8~64 个), 长思维链(CoT,下一章细讲)任务下每个回答几千 token。一次梯度更新可能要生成几十万 token

互动 · 判分器只检查一部分,模型就只在那一部分上用力

互动 · 一次梯度更新,要先生成多少 token

⚠️ 一个必须说清楚的事实

RLVR 不是"更好的对齐方法",它是"另一种优化目标"。
RLHF 优化的是"人类喜欢";RLVR 优化的是"答案正确"。 这两件事有重叠但不相等——一个永远答对但语气傲慢、拒绝解释、 对无关问题也硬套数学格式的模型,在 RLVR 下会拿满分。
所以现实里的配方从来不是二选一,而是分阶段: 先 RLVR 把推理能力打上去,再用少量 RLHF 把说话方式拉回来。 可验证任务不用偏好数据;开放任务仍然要——那里的对错只能靠人来判。

8

小结

这一章属于七条线里的一条,而且它把那条线摆到了台面上: 你不可能什么都优化,你必须挑一个假设。

它对应哪条线 ② 没有免费午餐 → 必须有归纳偏置——RLVR 做的是一个关于世界的假设: 「对错可以被一个廉价程序判定」。你只优化能被验证的那一类任务,换来一个不会说谎的裁判。
一句话 RLVR 的做法,本质上是在把「人类觉得好」这个昂贵且可被讨好的目标, 换成一个廉价、不会说谎、但只看一件事的目标——然后接受它只看那一件事的后果。
它牺牲了什么 牺牲了任务的覆盖面:写文案、共情、审美、开放式创作这些没有唯一答案的任务完全用不了; 而且信号覆盖不到的地方会立刻长出新的钻空子空间(第 7 节那张覆盖图)。 代价还有第二层:一个标量奖励要摊到几千个 token 上,信用分配变得极粗(回扣暗线 B 与 E)。
🎬 自己验一遍

回到第 3 节那张「组内优势的计算」,把那一组回答逐个点成「全对」,再点「全错」—— 你会看到 std = 0,所有优势一起归零。那个瞬间就是「免费午餐的账单」: 你选了一个只看对错的信号,太简单和太难的题就都被浪费掉了。

它在六条暗线里站在哪

下面就是这一章的答案。

暗线这一章的回答
A 信息流动 数据形状:一个 prompt(L 个 token)→ 采样 G 条回答 → 每条一个标量奖励 r(形状 G) → 组内标准化得到优势 A(形状 G)→ A 被广播回那条回答的每个 token 参与策略梯度。 奖励只给一个数,回答却有几千个词——这就是信用分配在本章的形状(见第 M 节)
B 什么被牺牲了 任务覆盖面与信用分配的粒度——上面「它牺牲了什么」已经展开,这里不重复。 换来的那个信号,零标注成本、也不可被讨好
C 参数账本 按第 4 节的口径:PPO 28 → GRPO 14 字节/参数(含主副本口径 36 → 18); 7B 约 196 → 98 GB(含主副本 252 → 126 GB)。采样账见第 7 节那个滑块
D 跑在什么上 算力受限(更准确地说是生成/采样受限)。RLVR 的时间几乎全花在 rollout 上—— 一次要并发生成 G 条长回答,每题几千个 token:长题目要先一口气读完(吃算力), 再一个词一个词往外吐(受显存读取速度限制)。
最贵的动作 = 采样(rollout),它通常占掉一多半的训练时间,而反向传播反而不是瓶颈。
完整的算力账在 《硬件与算力账本》
E 它假设了什么 假设了两件事,而且第二件经常不成立: ① 「正确」可以被一个廉价程序判定(在数学和代码上成立); ② 「程序判定的那件事」就是「人类想要的那件事」——这一条只在任务有唯一正确答案时才成立。 更隐蔽的第三层假设是:模型没学会的那部分能力可以通过抽样试错被找到; 如果模型本来连一次都答不对(全错组),这个假设就直接失效
F 违背了哪个直觉 两个:
① 「奖励越准确,模型一定越好」不成立。信号干净只说明「可钻的漏洞更集中」: 模型可能把全部力气花在钻这一个点上——干净不等于公平(第 7 节那张覆盖图)。
② 删掉一整个价值网络(可训练参数少一半),效果并没有变差。 这很反直觉——说明 PPO 里的那半个模型,很多时候不是在提供信息,而是在付一笔「信息税」
🎯 前后钩子

它接住了上一章的什么:《DPO 家族》只会在已有回答之间排序, 有标准答案的任务上浪费了探索能力。这一章把 RL 请回来,让程序来判分。

它给下一章留了什么:RLVR 训练出来的模型会「自己想得久一点」 (第 5 节那个顿悟时刻)。但「想多久」、「怎么控制长度」、「代价值不值」 是另一整章的问题——见 《思维链与测试时计算》。

一句话带走 RLVR 与 GRPO

RLVR = 用程序判分,把"可以被讨好的裁判"换成"不会说谎的裁判"。 它解决了 RLHF 最大的漏洞(谄媚和刷分),但只能在有唯一正确答案的任务上用。
GRPO = 删掉价值网络的 PPO,用同一组回答的组内标准化算优势: A = (r − mean) / std。省掉一半显存——它至少不比 PPO 差,而且跑得起。
两个必须记住的坑:全对或全错时 std = 0,梯度整个消失; 它只在能自动判分的地方变强,判分之外的地方没人管。

9

拓展阅读

上面讲的都是「够用」的版本。想往下挖,这里有三个入口—— 它们不是必修内容,是给想再往前走一步的读者准备的。

📄 这一章的说法从哪来

💻 工业界怎么写

∑ 更严格的形式