GRPO(Group Relative Policy Optimization)是DeepSeek提出的无价值网络强化学习算法,通过组内相对奖励估计优势,显存降低40%-50%,已成为LLM强化学习主流方案。

核心定义

GRPO是无价值网络的在线策略梯度算法:对同一prompt采样G个候选输出,通过组内奖励Z-score标准化计算优势,替代PPO中价值网络。

核心创新:用「同组内自我对比」替代「外部专家打分」,解决PPO双模型资源开销。

GRPO vs PPO对比

维度PPOGRPO
价值网络需训练等规模Critic完全摒弃
显存占用极高(7B需80GB+)低(降低40%-50%)
优势估计TD误差/GAE组内Z-score标准化
训练流程复杂(回放池、多模型同步)极简(四步闭环)
超参数敏感性极高较低
训练稳定性中等(价值崩塌风险)

算法流程

  1. 组采样:对prompt ,从采样个候选输出
  2. 奖励计算:计算每个输出奖励
  3. 相对优势估计
  4. 策略更新:基于裁剪目标和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概率