跳到主要内容

[LLM 5/10] GRPO:删掉价值网络,让一组回答互为 baseline

· 阅读需 8 分钟
Kobkrit Viriyayudhakorn
CEO, iApp Technology

上一章我们以 DPO 的空白收尾:它只能给文件里别人准备好的回答排序。 而第 3 章我们付过 PPO 的全价:4 个模型挤在显存里,还要额外训练一整个价值网络。 这一章把两边的优点合起来——让模型采样自己的回答来学习,是货真价实的 RL, 却把价值网络整个删掉。靠的是一个简单到让人恼火"为什么没人早点想到"的统计学观察: 对同一道题采样多个回答,这组回答的平均 reward,本来就是价值网络想要估计的那个 baseline。 而且只要题目能用代码批改,我们连人类偏好数据都不需要——零对,零成本。

Open in Colab05_grpo.ipynb

1. 问题(Problem statement)

设一道这样的题:教 Qwen3-0.6B 解泰语数学题。 最终答案是一个数字,一行 == 就能判对错。

把前三章的工具拿出来一件件比对,会发现没有一件正好合身:

方法模型能采样自己的回答来学习吗需要的人类 label显存中的模型
SFT(第 2 章)不能——只会模仿标准答案人写的标准答案1
PPO(第 3 章)训练 reward model 用的偏好对4
DPO(第 4 章)不能——纯 offline偏好对2(LoRA 减到 1)
  • SFT 教模型模仿标准答案的解法,但从不让模型自己试错。 模型从未见过"自己的哪种思路"能通向正确答案
  • PPO 让模型自己试,但代价是用偏好对训练一个 reward model, 外加一整个价值网络——尽管这个任务的 reward 直接就能写成一个 Python 函数
  • DPO 漂亮地砍掉了 RL,但它只能给数据集中已经存在的回答排序。 数学题需要的是让模型多试几条路,然后强化通向正确答案的那条

所以本章的问题又窄又锋利:当 reward 可以用代码批改时, PPO 里哪些零件是真必要的,哪些可以删掉?

2. 我们要做什么(Solution)

回到第 3 章价值网络的职责:它只回答一个问题—— "平均而言,这个 prompt 应该拿到多少 reward"——用作 baseline, 从真实 reward 里减掉:比平均"好"的回答拿正梯度,比平均"差"的拿负梯度。 没有这个 baseline,policy gradient 的噪声会大到几乎没法训练。

PPO 的回答方式是再训练一整个模型来预测这个平均值。 GRPO 的回答方式是直接采样出来看

本章的核心观点

对同一个 prompt 采样 GG 个回答,取组内 reward 的平均—— 这个平均值按定义就是"该 prompt 期望 reward"的 unbiased estimate。 它和价值网络想估计的是同一个东西,却不用训练、不用加载、永远不会估歪。 于是整个价值网络可以删掉。 而当 reward 用代码批改(数字答案对或错)时, reward model 和人类偏好数据也跟着消失——剩下零 label。

这就是 GRPO(Group Relative Policy Optimization),由 Shao 等人(2024)在 DeepSeekMath 中提出, 也是训练 DeepSeek-R1 的那台发动机。这一路线有个统称: RLVR(RL with Verifiable Rewards)——reward 来自验证器、而非人类口味的 RL。

另外从本章开头就把预期摆正:现有证据表明,这类 RL 大部分时候做的是 把基座模型在 pass@8 已经具备的能力"打磨"到 pass@1 上显现出来, 而不是从零创造新能力。第 9 节我们会带着测量工具回到这件事。

3. 公式(Equation)

3.1 组相对 advantage(优势)——全部心脏就这一行

A^i=rimean(r1,,rG)std(r1,,rG)\hat A_i = \frac{r_i - \operatorname{mean}(r_1,\dots,r_G)}{\operatorname{std}(r_1,\dots,r_G)}
  • GG = 从同一个 prompt 采样的回答数量(本章为 8)
  • rir_i = 第 ii 个回答的 reward
  • ii 个回答的每一个 token 都用同一个 A^i\hat A_i,整句共享—— 这与 PPO 不同:PPO 靠价值网络和 GAE 追求逐 token 的精细 advantage

用人话读一遍:"对同一道题,这个回答比我自己其他几次尝试更好还是更差。" 不跨题比较,不预测未来,只有组内的自我竞争。

这个短公式有一个极其重要的推论:如果全组拿到相同的 reward (全对或全错),所有 A^i\hat A_i 都是零,那个 batch 什么也教不了。 把这句话记牢——它会同时成为本章的头号陷阱和最重要的指标。

3.2 完整版 GRPO objective

JGRPO(θ)=E[1Gi=1G1oit=1oi{min ⁣(ρi,tA^i, clip(ρi,t,1ϵ,1+ϵ)A^i)βDKL[πθπref]}]\mathcal{J}_{\text{GRPO}}(\theta) = \mathbb{E}\left[\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,\ \operatorname{clip}(\rho_{i,t},\,1-\epsilon,\,1+\epsilon)\,\hat A_i\big) - \beta\,\mathbb{D}_{\text{KL}}\big[\pi_\theta \,\|\, \pi_{\text{ref}}\big]\Big\}\right]

其中 ρi,t=πθ(oi,tq,oi,<t)πθold(oi,tq,oi,<t)\rho_{i,t} = \dfrac{\pi_\theta(o_{i,t} \mid q, o_{i,<t})}{\pi_{\theta_{\text{old}}}(o_{i,t} \mid q, o_{i,<t})} 是 token 相对采样时 policy 的概率比。

逐块读,因为每一块都在本系列里出现过:

  • min(, clip())\min(\cdot,\ \operatorname{clip}(\cdot)) = 第 3 章的 PPO clip 原封不动,没有任何新东西—— 防止从采样 rollout 的位置迈出太远
  • 1oi\frac{1}{|o_i|} = 按 token 取平均,防止长回答影响力超标(想想第 4 章的 length bias)
  • βDKL\beta\,\mathbb{D}_{\text{KL}} = 还是那根牵引绳,拴在与第 3、4 章同一个 πref\pi_{\text{ref}}

真正该读的是不在公式里的东西:没有 V(s)V(s),没有 GAE,没有 critic loss。 整行只用两个模型(πθ\pi_\thetaπref\pi_{\text{ref}})加上验证器给出的 reward 数字。

3.3 KL 项不是直接算的——认识 k3 estimator

真正的 KL divergence 要对每个位置的整个 vocabulary 求和,既昂贵又没必要。 GRPO 从已采样出的 token 上估计它,用的 estimator 外号叫 k3

D^k3=πref(oi,t)πθ(oi,t)logπref(oi,t)πθ(oi,t)1\hat{\mathbb{D}}_{k3} = \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

学生永远会问(也应该问)的问题:为什么不直接用 log(πθ/πref)\log(\pi_\theta/\pi_{\text{ref}}), 它的期望值不就是 KL 吗?

回答:那个朴素版(叫 k1)确实 unbiased,但单个 sample 可以是负数—— 约 40% 的 sample 给出负值,尽管 KL 按定义不可能为负——而且 variance 非常高。 在真实 batch 的规模下,估计值会晃到 penalty 一会儿推一会儿拉。

k3 同时修好两个毛病。令 x=πref/πθx = \pi_{\text{ref}}/\pi_\theta,然后注意两个事实:

  1. 不等式 x1logxx - 1 \geq \log x 恒成立,所以 k3 =(x1)logx0= (x-1) - \log x \geq 0每个 sample 都非负
  2. Eπθ[x]=πθπrefπθ=1\mathbb{E}_{\pi_\theta}[x] = \sum \pi_\theta \cdot \frac{\pi_{\text{ref}}}{\pi_\theta} = 1,所以 (x1)(x-1) 这一项期望为零—— 它是一个 control variate,抵消 logx-\log x 的噪声而不动期望值

结果是一个同样 unbiased、variance 却低一个档次、且永不为负的 estimator。 图 5.3 会让你亲眼看到这个差别。

3.4 进阶注记:除以 std 并不像看上去那么纯洁(Dr.GRPO)

公式 3.1 里除以 std(r1..rG)\operatorname{std}(r_1..r_G) 悄悄带进了一种 bias: reward 几乎全相同的组(std 小,比如 8 个里对 7 个)的 advantage 会被巨大的系数放大, 而真正意见分裂的组(std 大——恰恰信息量最大)反而被相对压低。 净效果是梯度偏向那些模型几乎已经自我一致的题目。 Dr.GRPO(Liu 等人,2025)提出删掉除以 std,只保留减 mean—— 后者依然是完全正确的 baseline。第 4 节的小工具里有开关,两种都可以试。

3.5 unbiased 的 pass@k——第 9 节要用的工具

对每道题采样 nn 次、答对 cc 次,想知道"如果给 kk 次配额,至少对一次的概率":

pass@k^=1(nck)(nk)\widehat{\text{pass@}k} = 1 - \frac{\binom{n-c}{k}}{\binom{n}{k}}

后面那个分式是从 nn 个里抽 kk 个、抽到的全是错误回答的概率。 人们常用错的公式是 1(1c/n)k1-(1-c/n)^k,它在 nn 小时系统性地往自己脸上贴金 (这正是 Chen 等人 2021 年 HumanEval 论文要单开一个 appendix 讲它的原因)。 记住这个公式——它就是裁决 GRPO 到底在"创造"新能力还是在"打磨"旧能力的量尺。

完整内容在课程中

这篇文章大约是本章的前 30%。其余部分——环境准备、数据准备、核心代码、实测结果与总结——都在免费的 LLM Finetuning 课程中,使用 Google 登录即可阅读。

在课程中阅读完整章节 →