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 ,从采样个候选输出
- 奖励计算:计算每个输出奖励
- 相对优势估计:
- 策略更新:基于裁剪目标和KL约束更新参数
数学推导
目标函数
其中。
token级损失
核心性质
| 性质 | 说明 |
|---|---|
| 收敛性 | 满足Lipschitz连续、奖励有界条件下收敛到局部最优 |
| 内存效率 | 仅需策略模型+参考模型,无需Critic |
| 训练稳定性 | 组内归一化消除奖励漂移,KL直接约束策略偏离 |
| 样本效率 | 一次采样多次利用,仅需PPO 30%样本量 |
适用场景
| 适用 | 不适用 |
|---|---|
| 可验证推理任务(数学、代码) | 长地平线连续控制 |
| 大模型对齐 | 单样本奖励无区分度 |
| 多目标优化 | 极低资源小模型微调 |
| 资源受限训练 | 离线强化学习 |
PyTorch实现
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()超参数调优
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 组大小 | 4-8 | 数学推理用8,通用对齐用4 |
| KL系数 | 0.02-0.1 | 确保KL不超过10 |
| 学习率 | 2e-7~1e-6(7B模型) | 优先调整 |
| 裁剪系数 | 0.15-0.25 | 最后调整 |
改进变体
| 变体 | 改进点 |
|---|---|
| Dr.GRPO | 移除标准差归一化,消除长度偏差 |
| DAPO | 解耦裁剪机制,动态采样,解决熵坍缩 |
| TIC-GRPO | 轨迹级校正,无偏估计,收敛快30% |
| GDPO | 多奖励解耦归一化 |
| Flow-GRPO | 扩展到视觉生成 |
常见问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| KL爆炸 | 过小或学习率过高 | 增大,降低学习率 |
| 熵坍缩 | 过小或过紧 | 增大,放宽 |
| 奖励作弊 | 奖励函数缺陷 | 优化奖励函数,增大KL约束 |
| NaN损失 | 标准差为0或log概率溢出 | 添加稳定项,裁剪log概率 |