上一章 《DPO 家族》 一步跳过了奖励模型,但只能在已有回答里排序。
《DPO 家族》绕开了这个裁判,却没治好它。问题出在更前面的《RLHF》:裁判是一个 学出来的奖励模型,从人类偏好数据里模仿出来,所以有三个问题:
图解 · 奖励模型是怎么被钻的(RLHF 的问题全在这条链上)
| 问题 | 具体表现 |
|---|---|
| 它模仿的是"人觉得好" | 模型发现长回答、多分点、语气谦逊能让奖励模型打高分—— 哪怕内容是错的。这叫谄媚(sycophancy) |
| 它只在训练分布内可靠 | 强化学习会主动把模型推到奖励模型的盲区。一旦越界, 奖励分数就完全失去意义——模型在刷分,不是在变好 |
| 人类标注成本极高 | 一份高质量偏好数据要人一条条对比,还很难覆盖数学、代码这类需要专业判断的领域 |
互动 · 拖「回答篇幅」,看裁判的分和真实正确率怎么分家
奖励模型像一个靠印象打分的助教。学生很快发现:字写工整、卷面写满,
就算答案错了也能捞几分。于是全班开始练字,没人再认真做题。
RLVR(Reinforcement Learning with Verifiable Rewards)换的是一个对答案的老师——
用规则或程序自动判对错,他只看最后的数字对不对,你写得多漂亮都没用。
它不是"更好的奖励模型",而是根本不要奖励模型。
图解 · 把任务摆到「有没有唯一答案」这根轴上
| 任务类型 | 怎么自动判分 | 能不能用 |
|---|---|---|
| 数学题 | 把答案抽出来和标准答案做字符串/数值比对 | ✅ RLVR 的主战场 |
| 代码 | 真的把生成的代码跑一遍单元测试(一小段自动检查代码对不对的程序) | ✅ 最干净的信号 |
| 结构化输出 | 用正则或 JSON 解析器(按格式规则检查文本的小工具)检查格式 | ✅ 常作为辅助奖励 |
| 选择题 / 填空题 | 直接对答案 | ✅ |
| 逻辑 | 用求解器或形式化验证器(能自动证明对错的程序)检查 | ⚠️ 只覆盖能被形式化的那部分 |
| 写文案 / 共情 / 创意 | 没有唯一正确答案 | ❌ 用不了,只能回到 RLHF |
标准答案不用现场请人打:它们来自现成的题库。
GSM8K、MATH 这类数据集里,题目和答案都是人工标注、反复核对过的—— 判分程序直接拿它对答案。
"可验证"不等于"等于人类想要的"。
你让程序检查最终答案,模型可能会学会猜答案格式——
比如只把最终答案的格式写对,内容对不对全看运气。
信号不会说谎,但信号覆盖不到的地方,就是新的钻空子空间(第 7 节会展开)。
有了可靠的奖励还不够,怎么把它变成梯度是另一半问题。
PPO 的做法是训练一个额外的价值网络(critic)去预测"这一步大概能拿多少分",
再用它算优势。问题很直接:critic 和策略模型一样大,
GRPO(Group Relative Policy Optimization,组内相对的策略优化)的想法是:我不需要预测分数,我只需要比较。 对同一个问题采样一组回答,用这一组内部的相对好坏来算优势。
图解 · GRPO 删掉的那个盒子,在哪一条线上
人话版 Ai = ( ri − mean(r) ) / std(r)
r = 这一组每个回答拿到的奖励 A = 优势(比这一组的平均水平好多少)
它跟《强化学习入门》第 2 节的「减去平均分」是同一件事,只是把那里的基线 b,换成了同一题几次回答的平均,再除以一个标准差。
把鼠标停在下面公式里有下划线的符号上——下面「奖励类型」和「全对 / 全错」两组按钮会分别亮起来。 公式里的 r 和 std,就是你按的那两个按钮在改的东西。
互动 · 组内优势的计算
你会发现 std = 0,所有优势都变成 0,梯度整个消失。
道理很简单:标准化要除以标准差。如果一组回答的分数完全一样,
那"比平均好多少"这个问题就没有意义——它们全都等于平均。
这不是 bug,这是 GRPO 的结构性约束,直接导致了两件事:
① 太简单的题白采样,太难的题也白采样;② 必须动态挑选"有区分度"的题——
这正是 DAPO 里"动态采样"要解决的问题。
全对的一组确实没有信息:每条一样好,模型分不出哪种写法更好。
更新靠的是「比组内平均好多少」。全对时每条都一样好,模型分不出哪种写法更好; 整组一起加强只会让它更确信已经会的写法,学不到新东西。
上一节算出的优势 A,是一条回答一个数。 可一条回答有几千个 token——这一章的全部数学就是:这一个数,怎么发到每一个 token 头上。 这条路叫信用分配(credit assignment):干完一整件事只拿到一个总分,现在要把这个总分摊到每一步上。
动画 · 拖一个 A,看这一整条回答的每个 token 被改了多少
互动 · 每个符号管图上的哪一块
一条回答 = 一场比赛,每个 token = 场上的一个动作。
A 是赛后那一个总分(比同组的其他场次高,还是低)。
教练没时间逐个动作点评,他只能把这个总分乘到每一个动作上:
这局赢了,所有动作都说「照这样做」;输了,所有动作都说「换个做法」。
这就是信用分配:一个标量,摊到几千个动作。
把上面那张图的 A 拖到 0:每一根柱子一起消失,
整条回答一个 token 都没被改。
这就是第 3 节「全对」那一组在公式上的样子——GRPO 的「白采样」。
"删掉价值网络"听起来只是少了一个模型,但在训练时它省掉的是一整套优化器状态。 下面按参数量真实计算。
互动 · 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》那章同一口径)。
DeepSeek-R1 的论文里记录了一个没人预料到的现象: 训练到中途,模型自己学会了停下来重新检查。
互动 · 训练过程中的长度自发增长
没有人教它"要检查"。训练数据里没有这种样本,奖励函数也只检查最终答案对不对。
它之所以长出来,是因为:检查一遍能提高答对的概率,而答对能拿奖励。
于是"多想一会儿"这个行为被强化了。
这说明 RLVR 不只是"让模型更准"——它能逼出新的行为模式。
这也是"推理模型"这个概念的技术来源。
同样的机制也会导致模型越写越长直到啰嗦——在数学题上多写几步推理往往更容易答对
(R1 论文观察到,训练中回答长度一路增长)。
于是需要额外的 长度惩罚(太长的回答扣一点分)或长度控制。
这是 RL 的典型特征:你奖励什么,就会得到什么,包括你没想要的那些。
图解 · 这条线上的改动,方向一直是同一个
| 方法 | 改了什么 | 为什么改 |
|---|---|---|
| PPO 2017 / RLHF 2019 |
策略 + 价值网络 + 优势估计(GAE)+ 裁剪目标 | 通用 RL 算法,什么任务都能用,但要训 critic |
| RLOO 2024 |
优势 = 当前奖励 − 其他回答的平均奖励(留一法:算谁的基线,就把它自己排除在外) | GRPO 的近亲,不用除以标准差,更容易实现 |
| GRPO 2024 |
删掉 critic,用组内标准化算优势 | 显存砍半,训练更简单,成为事实标准 |
| Dr.GRPO 2025 |
去掉 GRPO 里对长度的隐式偏置——训练时每条回答的每个词都会算一个损失 (优势 × 这个词的对数概率),原版把它们加起来再除以回答长度, 于是回答越长,每个词挨的罚越少 | 原版 GRPO 有个长度偏置:答错时越写越长、答对时反而被往短里推, 整体回答被拉长(尤其答错的)——白烧 token |
| DAPO 2025 |
① clip-higher(放宽裁剪上界,让低概率的好答案也能涨——防的是熵坍塌:
模型越来越只会一种说法、不再探索)② 动态采样(丢掉全对/全错的组)
③ |
直接针对 GRPO 的四个已知痛点。目前最强的开源配方之一 |
| GSPO 2025 |
把重要性比(新旧模型对同一个词的概率之比)从 token 级改成序列级 (整条回答共用一个比值,不再每个词一个) | 长序列训练更稳定,梯度方差更小 |
| ReMax / RLOO 变体 | 用贪心解码的奖励当基线,省掉组采样 | 省约 50% 显存、约 2 倍快;代价是额外跑一次贪心生成 |
从 PPO → GRPO → DAPO,改动方向一直是同一个:
不断删掉"需要额外训练的组件",用更简单的统计量替代。
代价估计(critic)→ 组内均值;奖励模型 → 程序判分。
每一刀都砍在"训练更稳、跑得更省"上,而不是"理论更漂亮"。
这是理解这两年 RL 进展最快的角度。
选择很简单:有现成的「A 比 B 好」偏好对就用 《DPO 家族》, 有自动判分就用 GRPO。
任务开放(写文案、对话)、手上已有偏好对 → 用 DPO,一步到位; 有能自动判对错的场地、目标是练推理 → 用 GRPO。两者不冲突,常分阶段用。
| 硬伤 | 具体表现 |
|---|---|
| ① 只能用在可验证任务上 | 写作、共情、开放式创作、审美——这些恰恰是人类最在意的一批任务, 但没有自动判分的方法。所以只做 RLVR 的模型,会把能力集中到这类任务上,说话的分寸没人优化 |
| ② reward hacking(钻奖励的空子)换了形式 | 程序不会说谎,但它只检查它检查的那件事。 只检查最终答案 → 模型学会猜答案;只检查格式 → 模型学会写格式; 只检查单元测试 → 模型学会过测试而不是写对的代码 |
| ③ 全对/全错组没有梯度 | std = 0 就白采样。简单题和极难题都在浪费算力, 必须动态筛选"有区分度"的题——这本身就是个需要额外工程的问题 |
| ④ 采样成本极高 | GRPO 每个问题要采样 G 个回答(常见 8~64 个), 长思维链(CoT,下一章细讲)任务下每个回答几千 token。一次梯度更新可能要生成几十万 token |
互动 · 判分器只检查一部分,模型就只在那一部分上用力
互动 · 一次梯度更新,要先生成多少 token
RLVR 不是"更好的
RLHF 优化的是"人类喜欢";RLVR 优化的是"答案正确"。
这两件事有重叠但不相等——一个永远答对但语气傲慢、拒绝解释、
对无关问题也硬套数学格式的模型,在 RLVR 下会拿满分。
所以现实里的配方从来不是二选一,而是分阶段:
先 RLVR 把推理能力打上去,再用少量 RLHF 把说话方式拉回来。
可验证任务不用偏好数据;开放任务仍然要——那里的对错只能靠人来判。
这一章属于七条线里的一条,而且它把那条线摆到了台面上: 你不可能什么都优化,你必须挑一个假设。
回到第 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 = 用程序判分,把"可以被讨好的裁判"换成"不会说谎的裁判"。
它解决了 RLHF 最大的漏洞(谄媚和刷分),但只能在有唯一正确答案的任务上用。
GRPO = 删掉价值网络的 PPO,用同一组回答的组内标准化算优势:
A = (r − mean) / std。省掉一半显存——它至少不比 PPO 差,而且跑得起。
两个必须记住的坑:全对或全错时 std = 0,梯度整个消失;
它只在能自动判分的地方变强,判分之外的地方没人管。
上面讲的都是「够用」的版本。想往下挖,这里有三个入口—— 它们不是必修内容,是给想再往前走一步的读者准备的。