[AI]DeepSeek-R1的GRPO算法
GRPO(Group Relative Policy Optimization)是 DeepSeek 在训练DeepSeek-R1推理模型时提出并推广的策略优化算法。它本质上是对 PPO 的极简手术:砍掉 Critic 网络,用组内采样的相对奖励来估计优势函数,从而将 RLHF 的显存占用和实现复杂度降低一个数量级。
一、背景:PPO 的“四模型之痛”
在标准 RLHF-PPO 中,你需要同时维护4 个模型:
- Actor(策略网络,正在训练)
- Critic(价值网络,估计状态价值)
- Reward Model(奖励模型,打分)
- Reference Model(参考模型,防止偏离)
痛点:
- 显存爆炸:4 个大模型同时驻留 GPU,70B 参数模型训练需要数百 GB 显存
- Critic 训练困难:语言生成的状态空间几乎无限,Critic 要准确估计“每个 token 位置的未来累积奖励”极其困难,训练不稳定
- 实现复杂:Actor-Critic 架构、GAE 计算、重要性采样修正,工程调试成本高
GRPO 的洞见:对于生成任务,与其费劲训练一个 Critic 去预测未来价值,不如对同一个问题采样多个答案,用它们之间的相对好坏来定义“优势”。
二、核心原理:组内相对奖励
GRPO 的核心就三步:
1. 组采样(Group Sampling)
对于同一个问题(prompt)qqq,从旧策略πθold\pi_{\theta_{old}}πθold采样GGG个不同的输出:
{o1,o2,…,oG}∼πθold(⋅∣q)\{o_1, o_2, \dots, o_G\} \sim \pi_{\theta_{old}}(\cdot|q){o1,o2,…,oG}∼πθold(⋅∣q)
GGG通常取4~16。
2. 奖励打分(Reward)
用奖励模型(或规则)给每个输出打分:
R={r1,r2,…,rG}R = \{r_1, r_2, \dots, r_G\}R={r1,r2,…,rG}
3. 相对优势计算(Relative Advantage)
这是 GRPO 的灵魂。不依赖 Critic,直接用组内统计量定义优势:
A^i=ri−mean(R)std(R)=ri−1G∑j=1Grj1G∑j=1G(rj−mean(R))2\hat{A}_i = \frac{r_i - \text{mean}(R)}{\text{std}(R)} = \frac{r_i - \frac{1}{G}\sum_{j=1}^G r_j}{\sqrt{\frac{1}{G}\sum_{j=1}^G (r_j - \text{mean}(R))^2}}A^i=std(R)ri−mean(R)=G1∑j=1G(rj−mean(R))2ri−G1∑j=1Grj
直觉:
- 比组内平均水平好的输出 → 优势为正 → 策略增加其概率
- 比组内平均水平差的输出 → 优势为负 → 策略降低其概率
- 好坏程度由组内标准差归一化,自动适应不同问题的奖励尺度
三、数学公式:完整目标函数
GRPO 的策略更新目标与 PPO 几乎一致,只是把A^i\hat{A}_iA^i的来源从 Critic 换成了组内相对奖励:
JGRPO(θ)=Eq∼P(Q),{oi}i=1G∼πθold(⋅∣q)[1G∑i=1G(min(ri(θ)A^i, clip(ri(θ),1−ϵ,1+ϵ)A^i)⏟PPO-Clip 策略损失−β⋅DKL(πθ(⋅∣q)∥πref(⋅∣q))⏟KL 惩罚)]J_{GRPO}(\theta) = \mathbb{E}_{q \sim P(Q), \{o_i\}_{i=1}^G \sim \pi_{\theta_{old}}(\cdot|q)} \left[ \frac{1}{G} \sum_{i=1}^G \left( \underbrace{\min\left( r_i(\theta)\hat{A}_i, \; \text{clip}(r_i(\theta), 1-\epsilon, 1+\epsilon)\hat{A}_i \right)}_{\text{PPO-Clip 策略损失}} - \underbrace{\beta \cdot D_{KL}(\pi_\theta(\cdot|q) \| \pi_{ref}(\cdot|q))}_{\text{KL 惩罚}} \right) \right]JGRPO(θ)=Eq∼P(Q),{oi}i=1G∼πθold(⋅∣q)G1i=1∑GPPO-Clip策略损失min(ri(θ)A^i,clip(ri(θ),1−ϵ,1+ϵ)A^i)−KL惩罚β⋅DKL(πθ(⋅∣q)∥πref(⋅∣q))
其中:
- ri(θ)=πθ(oi∣q)πθold(oi∣q)r_i(\theta) = \frac{\pi_\theta(o_i|q)}{\pi_{\theta_{old}}(o_i|q)}ri(θ)=πθold(oi∣q)πθ(oi∣q):新旧策略的概率比
- ϵ\epsilonϵ:Clip 阈值(通常 0.2)
- β\betaβ:KL 惩罚系数(防止 Actor 偏离参考模型太远)
- πref\pi_{ref}πref:冻结的参考模型(通常是 SFT 后的模型)
四、算法流程(伪代码)
# 初始化:Actor (可训练), Reference (冻结), Reward Model (冻结)# 无需 Critic!foriterationinrange(num_iterations):# 1. 收集数据foreach question qinbatch:# 从旧策略采样 G 个答案outputs=[actor.generate(q)for_inrange(G)]rewards=[reward_model(q,o)foroinoutputs]# 计算组内相对优势mean_r=mean(rewards)std_r=std(rewards)+1e-8# 防止除零advantages=[(r-mean_r)/std_rforrinrewards]store(q,outputs,old_probs,rewards,advantages)# 2. 策略更新(多 epoch,类似 PPO)forepochinrange(K_epochs):foreach stored group(q,outputs,old_probs,advantages):new_probs=actor.get_probs(q,outputs)ratios=new_probs/old_probs# PPO-Clipsurr1=ratios*advantages surr2=clip(ratios,1-eps,1+eps)*advantages policy_loss=-min(surr1,surr2).mean()# KL 惩罚(与参考模型)ref_probs=reference.get_probs(q,outputs)kl_loss=kl_divergence(new_probs,ref_probs).mean()total_loss=policy_loss+beta*kl_loss total_loss.backward()optimizer.step()五、GRPO vs PPO 核心对比
| 维度 | PPO | GRPO |
|---|---|---|
| 模型数量 | 4 个(Actor + Critic + Reward + Reference) | 3 个(Actor + Reward + Reference),无 Critic |
| 显存占用 | 高(Critic 与 Actor 同规模) | 低 25-30% |
| 优势估计 | Critic + GAE | 组内相对奖励 |
| 实现复杂度 | 高(需训练 Critic、调 GAE 超参) | 低(省掉整个 Critic 训练流水线) |
| 适用任务 | 通用(对话、写作等开放式任务) | 确定性奖励任务(数学、代码、逻辑推理) |
| 样本效率 | 依赖 Critic 质量 | 依赖组内采样多样性 |
| 稳定性 | Critic 崩溃则整体崩溃 | 无 Critic 崩溃风险,但 std=0 时无法更新 |
六、在 DeepSeek-R1 中的实战
DeepSeek-R1 使用 GRPO 进行强化学习训练,其奖励设计极具针对性:
1. 奖励函数(完全规则化,无需神经 Reward Model)
| 奖励类型 | 说明 | 示例 |
|---|---|---|
| 准确性奖励 | 答案是否正确 | 数学题最终答案匹配 = +1,否则 0 |
| 格式奖励 | 是否按要求格式输出思考过程 | 包含<think>...</think>和<answer>...</answer>标签 = +0.5 |
| 语言一致性 | 防止中英文混用 | 全中文或全英文 = +0.1 |
关键:R1 的奖励是确定性的、可编程的,不需要像 ChatGPT 那样训练一个复杂的神经 Reward Model 来判断“这段话好不好”。
2. 为什么 GRPO 特别适合 R1?
- 数学/代码任务:答案对错是二元的(0 或 1)。如果用 Critic 预测价值,它必须学会“这个推导步骤值 0.3 分,那个步骤值 0.7 分”,极其困难。而 GRPO 直接看组内谁答对了谁没答对,简单有效。
- 长思维链(CoT):R1 生成长达数千 token 的推理过程。Critic 要评估“第 500 个 token 之后的未来回报”几乎不可能。GRPO 只看最终结果,规避了过程评估难题。
七、优势与局限性
优势
- 显存友好:去掉 Critic 后,同等规模模型训练显存降低20-30%,使 70B 模型的 RL 训练从“集群专属”变为“单节点可行”
- 实现极简:代码量比 PPO 减少约40%,调试维度大幅减少
- 避免 Critic 崩溃:语言生成的价值估计本身就不稳定,GRPO 直接绕过这个难题
- 奖励尺度自适应:组内归一化自动处理不同问题的难度差异(简单题全对时 std=0 除外)
局限性
- 组内多样性依赖:如果GGG个输出高度相似(如模型已收敛),std 趋近于 0,优势全为 0,训练停滞
- 开放式任务表现一般:对于创意写作、开放式对话等奖励稀疏/主观的任务,组内相对奖励不如 PPO 稳定
- 推理成本:每次更新需要采样GGG个完整序列,前向推理量是 PPO 的GGG倍(但省掉了 Critic 的前向+反向)
- std=0 陷阱:如果组内所有答案都正确(或都错误),标准差为 0,此时 advantage 无定义,需平滑处理(如加 epsilon 或跳过更新)
八、一句话总结
GRPO 的本质是“用统计学替代预测学”:既然训练一个 Critic 去预测语言生成的未来价值那么难,不如对同一个问题采样一组答案,用它们之间的相对排名来告诉模型“这次你答得比同班同学好还是差”。这种“无 Critic 的 PPO”在数学、代码等确定性奖励任务上,以更低的显存和更简单的实现,达到了与 PPO 相当甚至更好的效果。
