λLLM Wiki

Group Relative Policy Optimization

分组相对策略优化(Group Relative Policy Optimization, GRPO) 是 DeepSeekMath 在 2024 年提出的一种 PPO 变体。它的核心改动只有一个:不再训练独立的 value model,而是对同一个 prompt 采样一组(group) 输出,用组内 reward 的均值与标准差作为 baseline 计算每条输出的 advantage。这一改动在 LLM 场景下同时带来了显存节省(约 2 倍)、实现简化和训练稳定性提升,后来被 DeepSeek-R1 用于推理模型的 Zero-RL 训练,成为 推理模型 RL(Reasoning RL) 的事实标准算法之一。

核心洞见

PPO 在 LLM 上训练时存在一个结构性困难:只有整条 response 末尾才有非零 reward,中间 token 的 reward 全为 0。但 PPO 依赖 critic (见 value-model) 为每个中间 token 估计价值 V(st)V(s_t),这是一个极难学的量——要从稀疏末端信号中学会”给定一个不完整前缀,最终 reward 的条件期望”。结果是 critic 的估计方差大、训练不稳定、消耗显存又与 policy 相当。

GRPO 绕过这个问题的办法是不让 critic 去估计 value,而是直接对同一个 prompt 采样 GG 条 response,用这 GG末端 reward 的经验分布做 baseline。这是一个纯 Monte Carlo 的方案:只要 GG 足够大(DeepSeekMath 取 64),组内均值就是对该 prompt 期望 reward 的无偏估计,用它做 baseline 既减方差又不引入 critic 的估计偏差。

目标函数

与 PPO 并列:

JPPO(θ)=E[1ot=1omin ⁣(rt(θ)A^t, clip(rt(θ),1ϵ,1+ϵ)A^t)]\mathcal{J}_{PPO}(\theta) = \mathbb{E}\bigg[\frac{1}{|o|}\sum_{t=1}^{|o|}\min\!\Big(r_t(\theta)\hat{A}_t,\ \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)\hat{A}_t\Big)\bigg]

JGRPO(θ)=Eq,{oi}i=1G[1Gi=1G1oit=1oi{min ⁣(ri,t(θ)A^i,t, clip(ri,t(θ),1ϵ,1+ϵ)A^i,t)βDKL[πθπref]}]\mathcal{J}_{GRPO}(\theta) = \mathbb{E}_{q,\{o_i\}_{i=1}^G}\bigg[\frac{1}{G}\sum_{i=1}^G \frac{1}{|o_i|}\sum_{t=1}^{|o_i|}\Big\{\min\!\big(r_{i,t}(\theta)\hat{A}_{i,t},\ \text{clip}(r_{i,t}(\theta), 1-\epsilon, 1+\epsilon)\hat{A}_{i,t}\big) - \beta\, \mathbb{D}_\text{KL}[\pi_\theta\|\pi_\text{ref}]\Big\}\bigg]

两个目标结构几乎一样,差别只在两处

  1. 外层多了一重对 group 的平均:对同一 prompt qq 采样 GG 条输出 {o1,,oG}\{o_1, \dots, o_G\},每条独立计算 clipped policy loss,最后 group 内平均。
  2. KL 项直接写在 loss 里:PPO 通常把 KL 以 rtrtβKLtr_t \leftarrow r_t - \beta\, \text{KL}_t 的形式减在 reward 里,GRPO 则作为 loss 的一个独立惩罚项出现。两种写法并不完全等价——GRPO 的做法让 advantage 计算更干净,见下节讨论。

Advantage 计算

GRPO 有两个变体,差别在 reward 的粒度。

Outcome Supervision(标准版)

给定组内 reward 向量 r=(r1,,rG)\mathbf{r} = (r_1, \dots, r_G),对每条 response 做组内 z-score 标准化

r~i=rimean(r)std(r)\tilde{r}_i = \frac{r_i - \text{mean}(\mathbf{r})}{\text{std}(\mathbf{r})}

整条 response 的所有 token 共享同一个 advantage:

A^i,t=r~i,t[1,oi]\hat{A}_{i,t} = \tilde{r}_i,\quad \forall t \in [1, |o_i|]

这是最常见的用法,与 可验证奖励(RLVR)(见 reward-model) 配合时就是 DeepSeek-R1 的训练方式。

Process Supervision

如果有步骤级 reward(例如 PRM),记第 ii 条 response 的第 jj 步结尾 token 位置为 index(j)\text{index}(j),对应 reward 为 riindex(j)r_i^{\text{index}(j)}。先把所有样本的所有步骤 reward 一起做标准化,然后每个 token 的 advantage 是它之后所有步骤标准化 reward 的累和:

A^i,t=index(j)tr~iindex(j)\hat{A}_{i,t} = \sum_{\text{index}(j)\ge t}\tilde{r}_i^{\text{index}(j)}

此时同一条 response 内不同 token 的 advantage 不再相同,更接近 PPO 的 per-token 估计。

KL 估计器

GRPO 使用 Schulman 提出的 k3 estimator(unbiased 且恒非负):

DKL[πθπref]=πref(oi,tq,oi,<t)πθ(oi,tq,oi,<t)logπref(oi,tq,oi,<t)πθ(oi,tq,oi,<t)1\mathbb{D}_\text{KL}[\pi_\theta\|\pi_\text{ref}] = \frac{\pi_\text{ref}(o_{i,t}|q, o_{i,<t})}{\pi_\theta(o_{i,t}|q, o_{i,<t})} - \log\frac{\pi_\text{ref}(o_{i,t}|q, o_{i,<t})}{\pi_\theta(o_{i,t}|q, o_{i,<t})} - 1

x=log(πref/πθ)x = \log(\pi_\text{ref}/\pi_\theta),这个估计量就是 exx1e^x - x - 1,由 ex1+xe^x \ge 1 + x 保证总是非负,方差也比朴素 log(πθ/πref)\log(\pi_\theta/\pi_\text{ref}) 的 MC 估计低。选择 k3 而非 k1/k2 的推导见 GRPO 非负 KL 估计器推导

为什么 KL 放在 loss 里而不是 reward 里

PPO 的 “KL in reward” 写法相当于令 rt=rtβlogπθ(oto<t)πref(oto<t)r_t' = r_t - \beta \log\frac{\pi_\theta(o_t|o_{<t})}{\pi_\text{ref}(o_t|o_{<t})},然后用修正后的 reward 计算 GAE。这会让 advantage 本身带上 KL 项,若 group 内某条 response 的 KL 偏离特别大,会污染组内标准化——该条 response 的 advantage 会被 KL 偏离而非真实 reward 主导。

GRPO 把 KL 单独写在 loss 的一项里,意味着:

  • advantage 只反映真实 reward 的组内相对排名;
  • KL 惩罚通过梯度的另一条路径施加,不进入 advantage 的计算;
  • 配合 k3 估计器后,KL 项的数值总是非负,也避免了 reward 里出现负 KL 的诡异情况。

工程收益

维度PPOGRPO
训练时同时在显存中的模型4:policy + critic + reward + reference2:policy + reference(reward 可 offline)
Critic 训练步需要不需要
Advantage 计算GAE + critic组内 z-score
每 prompt 采样数1 也行必须 GG 条(典型 32 – 128)
KL 位置reward 里loss 里
典型实现复杂度

显存节省的直接来源是扔掉了与 policy 同规模的 critic。对 7B 模型来说,仅 critic 权重就需要约 14GB(fp16),如果考虑 Adam 状态则更多。

数值示例

考虑算术题 q=q = “Calculate 2+2×62 + 2 \times 6“,正确答案 14。GRPO 对同一 qq 采样 G=8G = 8 条 response,其中 4 条正确(reward=1)、4 条错误(reward=0):

指标
Group meanmean(r)=0.5\text{mean}(\mathbf{r}) = 0.5
Group stdstd(r)0.53\text{std}(\mathbf{r}) \approx 0.53
正确 response 的 advantage(10.5)/0.53+0.94(1 - 0.5)/0.53 \approx +0.94
错误 response 的 advantage(00.5)/0.530.94(0 - 0.5)/0.53 \approx -0.94

然后正确的 4 条被正向强化,错误的 4 条被负向抑制,clip 机制防止单次更新过大。若所有 8 条都对(或都错),std 为 0,需要加一个小常数 ε\varepsilon 做稳定,此时该 prompt 贡献的梯度近似为 0——这类”零方差”样本不提供学习信号,是 GRPO 训练早期常见的问题。

典型超参数

超参数DeepSeekMath 取值说明
GG(group size)64越大 advantage 越稳,显存越贵
ϵ\epsilon(clip)0.2沿用 PPO
β\beta(KL 系数)0.04KL 惩罚强度
μ\mu(每批更新次数)1取 1 时 πθ=πold\pi_\theta = \pi_\text{old},ratio ≡ 1,clip 实际不生效
Batch size102416 prompt × 64 group

μ=1\mu = 1 时 GRPO 退化为”REINFORCE with group baseline + KL 正则”,很多 open-source 实现正是这样用的。只有在 μ>1\mu > 1(同批重复更新)时 clip 才真正起作用。

与 DeepSeek-R1 / RLVR 的关系

有一个常见误解:GRPO = 不用 reward model。但严格来说:

  • GRPO 本身只去掉 critic。DeepSeekMath 原论文仍然使用学习型 reward model 给每条 response 打分,然后在组内做 z-score。
  • DeepSeek-R1 进一步把 reward model 也去掉,完全用 可验证奖励(RLVR)(数学答案对错 + 格式检查)代替。这是两个独立的设计选择。
  • “GRPO + RLVR” 的组合流行度很高,以至于人们常把这个组合误当成 GRPO 本身。

更多讨论见 reward-model 的 RLVR 节与 zero-rl-for-reasoning-models

实践 gotcha

  • group size 不能太小:baseline 完全来自组内统计,G<8G < 8 时 advantage 方差会爆炸。
  • 全对或全错 prompt 的梯度消失:std 为 0,advantage 全 0,该样本对学习无贡献。部分实现会直接丢弃这类样本,DAPO 等后续工作对此做了专门处理。
  • KL 估计器选错会挂:用朴素 logπθlogπref\log\pi_\theta - \log\pi_\text{ref} 可能产生负 KL,导致训练崩溃。务必用 k3 估计器。
  • 与 PPO 的 KL 不等价:若有人尝试把 GRPO “改回” KL-in-reward 形式,会发现 advantage 的物理含义变了。两种写法并不互相兼容。
  • off-policy 漂移:多轮 rollout 与训练异步时,πθold\pi_{\theta_\text{old}} 与当前 πθ\pi_\theta 的差异会随时间累积,与 异策略 场景下的分布偏差问题类似。在 multi-turn-rl 等复杂设置下更明显。

参考资料

Comments