GRPO(Group Relative Policy Optimization)是DeepSeek提出的无价值网络强化学习算法,通过组内相对奖励估计优势,显存降低40%-50%,已成为LLM强化学习主流方案。
核心定义
GRPO是无价值网络的在线策略梯度算法:对同一prompt采样G个候选输出,通过组内奖励Z-score标准化计算优势,替代PPO中价值网络。
核心创新:用「同组内自我对比」替代「外部专家打分」,解决PPO双模型资源开销。
GRPO vs PPO对比
| 维度 | PPO | GRPO |
|---|
| 价值网络 | 需训练等规模Critic | 完全摒弃 |
| 显存占用 | 极高(7B需80GB+) | 低(降低40%-50%) |
| 优势估计 | TD误差/GAE | 组内Z-score标准化 |
| 训练流程 | 复杂(回放池、多模型同步) | 极简(四步闭环) |
| 超参数敏感性 | 极高 | 较低 |
| 训练稳定性 | 中等(价值崩塌风险) | 高 |
算法流程
- 组采样:对prompt $q$,从$\pi_{\theta_{old}}$采样$G$个候选输出
- 奖励计算:计算每个输出奖励$r_i$
- 相对优势估计:$\hat{A}_i = \frac{r_i - \mu_r}{\sigma_r + \epsilon}$
- 策略更新:基于裁剪目标和KL约束更新参数
数学推导
目标函数
$$J_{GRPO}(\theta) = \mathbb{E}{q\sim D} \left[ \frac{1}{G} \sum{i=1}^G \min\left( \rho_i \cdot \hat{A}i, \text{clip}(\rho_i, 1-\epsilon, 1+\epsilon) \cdot \hat{A}i \right) - \beta \cdot D{KL}(\pi\theta | \pi_{ref}) \right]$$
其中$\rho_i = \frac{\pi_\theta(o_i|q)}{\pi_{\theta_{old}}(o_i|q)}$。
token级损失
$$L_{GRPO}(\theta) = - \frac{1}{G} \sum_{i=1}^G \frac{1}{|o_i|} \sum_{t=1}^{|o_i|} \left[ \min\left( \rho_{i,t} \cdot \hat{A}i, \text{clip}(\rho{i,t}, 1-\epsilon, 1+\epsilon) \cdot \hat{A}i \right) - \beta \cdot \text{KL}{i,t} \right]$$
核心性质
| 性质 | 说明 |
|---|
| 收敛性 | 满足Lipschitz连续、奖励有界条件下收敛到局部最优 |
| 内存效率 | 仅需策略模型+参考模型,无需Critic |
| 训练稳定性 | 组内归一化消除奖励漂移,KL直接约束策略偏离 |
| 样本效率 | 一次采样多次利用,仅需PPO 30%样本量 |
适用场景
| 适用 | 不适用 |
|---|
| 可验证推理任务(数学、代码) | 长地平线连续控制 |
| 大模型对齐 | 单样本奖励无区分度 |
| 多目标优化 | 极低资源小模型微调 |
| 资源受限训练 | 离线强化学习 |
PyTorch实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| def grpo_loss(old_logps, new_logps, ref_logps, rewards, mask,
clip_eps=0.2, kl_beta=0.04):
# 组内相对优势
advantages = (rewards - rewards.mean()) / (rewards.std() + 1e-8)
advantages = advantages.unsqueeze(1)
# 重要性采样比率
ratio = torch.exp(new_logps - old_logps.detach())
# 裁剪目标
surr1 = ratio * advantages
surr2 = torch.clamp(ratio, 1 - clip_eps, 1 + clip_eps) * advantages
pg_loss = -torch.min(surr1, surr2)
# KL散度
kl = torch.exp(ref_logps - new_logps) - (ref_logps - new_logps) - 1
loss = (pg_loss + kl_beta * kl) * mask
return (loss.sum(dim=1) / mask.sum(dim=1).clamp(min=1)).mean()
|
超参数调优
| 参数 | 推荐值 | 说明 |
|---|
| 组大小$G$ | 4-8 | 数学推理用8,通用对齐用4 |
| KL系数$\beta$ | 0.02-0.1 | 确保KL不超过10 |
| 学习率 | 2e-7~1e-6(7B模型) | 优先调整 |
| 裁剪系数$\epsilon$ | 0.15-0.25 | 最后调整 |
改进变体
| 变体 | 改进点 |
|---|
| Dr.GRPO | 移除标准差归一化,消除长度偏差 |
| DAPO | 解耦裁剪机制,动态采样,解决熵坍缩 |
| TIC-GRPO | 轨迹级校正,无偏估计,收敛快30% |
| GDPO | 多奖励解耦归一化 |
| Flow-GRPO | 扩展到视觉生成 |
常见问题
| 问题 | 原因 | 解决方案 |
|---|
| KL爆炸 | $\beta$过小或学习率过高 | 增大$\beta$,降低学习率 |
| 熵坍缩 | $G$过小或$\epsilon$过紧 | 增大$G$,放宽$\epsilon$ |
| 奖励作弊 | 奖励函数缺陷 | 优化奖励函数,增大KL约束 |
| NaN损失 | 标准差为0或log概率溢出 | 添加稳定项,裁剪log概率 |
Comments