可验证奖励与 GRPO 从零写 — 没有示范时,靠对错训练
这一章讲三件事: 强化学习的三个核心词;GRPO 怎么用「组内平均分」当尺子; 以及为什么纯强化学习能训出没人示范过的推理行为。 延续上一章的写法:训练循环亲手写一遍,同一个模型、同一个优化器,单卡能跑。 读完你能回答:「R1-Zero 没人教它推理,推理是从哪来的?」
1. 先看现象:没有示范可抄的任务
SFT 有个前提:每条 prompt 都得有人写好、验过的标准回答。格式、风格这类事写得出来;但数学题的最优解法、代码的最干净写法——正确答案容易检验,最好的写法却难写出来。书里把这条分界说得很白:当「正确答案难写、却容易检查」时,就该换方法了1。
换的方法就是强化学习(RL):不提供目标回答,只提供一个给任意回答打分的函数。模型自己生成候选,自己被打分,自己往高分挪2。
原书用一个 Note 点破了本章与上一章的关系,那也是全书的主旨——两个循环共享同一个模型、同一个优化器,只差一处:训练信号从哪来。SFT 复制你给的信号;RL 从你定义的奖励里发现信号3。
2. 顶层全景
┌────────────────────────────────────────────┐
│ │
▼ │
策略(就是模型本身) │
│ ① rollout:对同一道题采样一整组回答(G=8 条) │
▼ │
奖励函数逐条打分 │
│ ② 组内求平均、求标准差 │
▼ │
优势 = (每条的分 − 组平均) / 组标准差 │
│ ③ 高于平均 → 抬概率 低于平均 → 压概率 │
└────────────────────────────────────────────┘
图说:没有标准答案,只有「比同组其他回答好还是差」。
这一圈转一次,权重挪一步;转几百次,平均分往上爬。
3. 三个词,把强化学习说小
书里明说:强化学习的词汇听着比代码重,撑起这个循环的只有三个词4:
| 词 | 是什么 | 在主走查里 |
|---|---|---|
| 策略(policy) | 模型本身:输入 prompt、输出「一组回答的概率分布」,这个输入到输出的对应关系术语叫映射;它就是被训练的东西 | Qwen3-0.6B |
| 奖励(reward) | 一个函数:回答进去,数字出来,越高越好 | 检查 <answer> 标签的那段代码 |
| rollout | 从策略采样(按概率抽,不是总挑最大)出一条回答的动作——模型的「一次尝试」 | 对「说出一种原色」采样 8 次 |
SFT 有固定目标、要模型贴上去;RL 没有目标,只有分数,候选是模型自己写的——它从「自己写过的答案」里学,按分数加权5。
4. 为什么 RL 能超过示范,而 SFT 不能
这是本章最重要的一步。SFT 的信号来自示范,示范里没有的行为,它永远学不到。RL 的信号来自奖励:模型采样时偶然撞到一个好回答,奖励函数给了高分,这条回答就被加强——哪怕从来没有人给它示范过6。
「撞到」这个说法藏着两个前提,书里原话点明:模型得至少偶尔撞得到,奖励函数得认得出。撞不到就没有可加强的东西;认不出,撞到了也白撞。这两点后面反复回来7。
5. 最小环境:一个可验证的格式任务
RL 需要奖励,而最好的第一档奖励是能靠规则判定、不靠人判的——这就是「可验证」:一个程序就能断对错。数学题对答案、代码过测试是正典;书里的演示任务更简单:把答案放进 <answer></answer> 标签对里8。
奖励函数三级计分,<answer> 出现 +1、</answer> 出现 +1、开闭标签配平且中间有内容再 +1,合计 0 到 3 分9:
| 得分 | 回答长什么样 |
|---|---|
| 0 | 空串,或裸答案「42」(一个标签都没有) |
| 1 | <answer>42(只开了头) |
| 3 | <answer>42</answer>(完整配平) |
书里特意提醒:打分必须有区分度。接下来你会看到,更新靠的是「组内分数的差异」——一个给所有回答打同样分数的奖励函数,什么都教不会10。
6. GRPO:组就是自己的基线
策略梯度要一把尺子
策略梯度(policy gradient)是一类方法的总称:沿着奖励的期望值(平均下来能拿到多少分)的梯度方向调参数,让高奖励的回答更可能出现。但「哪条回答该加强」需要一个比照对象——基线:总分 2 分是好是坏?要看同组其他人拿几分。比基线好的加强,比基线差的压制11。
GRPO 的取巧:现成的组均值
经典做法(PPO)专门训第二个网络(critic)来估计这个基线——显存翻倍,还自带一个训练问题。GRPO 的替代简单到近乎取巧:每个问题采样一组回答(主走查里 G=8),组内平均分直接当基线。代价是每个问题要多采几条(花生成时间);当生成比养第二个网络便宜时,这笔交换是划算的——这也是 GRPO 能在推理模型上扩展好的部分原因12。
主走查:一组 8 条回答的更新
对同一道题「说出一种原色。把答案放进 answer 标签。」采样 8 条(奖励数值是为演示编的,机制与全部参数是书里的)13:
8 条回答的奖励: [3, 1, 0, 3, 0, 1, 3, 3]
组平均(基线): 1.75
组标准差: ≈1.30
优势 = (每条 − 1.75) / 1.30:
得 3 分的 4 条 → 优势 ≈ +0.96 加强
得 1 分的 2 条 → 优势 ≈ −0.58 压制
得 0 分的 2 条 → 优势 ≈ −1.35 压制得更狠
得分恰等于平均的那条:优势为 0,一动不动
图说:「Group Relative(组内相对)」指的就是这把组内尺子。
每条回答的对数概率按优势加权升降:优势为正,抬;为负,压;
绝对值大小,就是抬压的力度。
写成损失,就是书里说的「整条规则」:loss = −(优势 × 该条回答的对数概率)。优势为正时最小化它 = 抬这条回答的概率;为负 = 压;这套更新就是 1992 年的 REINFORCE 算法(最古老的政策梯度法)加了一个组内基线14。