Group Relative Policy Optimization (GRPO)

最后更新: 05/31/2025.

在强化学习中,PPO 等经典算法依赖于“评论家”(critic) 模型来估计动作的价值,从而指导学习过程。然而,训练这个评论家模型可能需要大量资源。

GRPO 通过消除对独立评论家模型的需求来简化这一过程。其工作原理如下:

  • 分组采样:对于一个给定的问题,模型会生成多个可能的解决方案,形成一个输出“组”。

  • 奖励分配:根据每个解决方案的正确性或质量对其进行评估并分配奖励。

  • 基线计算:该组的平均奖励作为基线。

  • 策略更新:模型通过将每个解决方案的奖励与组基线进行比较来更新其参数,从而强化优于平均水平的解决方案,并抑制差于平均水平的解决方案。

这种方法通过避免训练独立的价值估计模型来减少计算开销,使学习过程更有效。有关更多详细信息,请参阅原始论文 DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models

关键组件

  • 无价值函数(无评论家):与 PPO 不同,GRPO 不训练独立的价值网络(评论家)。

  • 分组采样(Grouped Rollouts):GRPO 不为每个输入评估一次采样,而是为每个提示从当前策略生成多个完成(响应)。这组完成称为一个组。

  • 相对奖励:在每个组内,根据完成情况进行评分(例如,根据正确性),并对奖励进行标准化处理,使其相对于该组而言。

配置

请注意,所有包含 micro_batch_size 的配置都用于配置每次前向或后向传递的最大采样或 token 数量,以避免 GPU 显存溢出(OOM),其值不应改变算法/收敛行为。

尽管许多配置以 ppo_ 前缀开头,但它们可以跨 Verl 中的不同 RL 算法使用,因为 GRPO 的训练循环与 PPO(无评论家)类似。

image

  • actor_rollout.ref.rollout.n:对于每个提示,采样 n 次。默认为 1。对于 GRPO,请将其设置为大于 1 的值以启用分组采样。

  • data.train_batch_size:用于生成一组采样轨迹/rollout 的提示的全局批次大小。响应/轨迹的数量为 data.train_batch_size * actor_rollout.ref.rollout.n

  • actor_rollout_ref.actor.ppo_mini_batch_size:采样的轨迹集被分成多个 mini-batch,批次大小为 ppo_mini_batch_size,用于 PPO Actor 更新。ppo_mini_batch_size 是所有 worker 的全局大小。

  • actor_rollout_ref.actor.ppo_epochs:在一组采样轨迹上进行 GRPO 更新的 epoch 数量(针对 Actor)。

  • actor_rollout_ref.actor.clip_ratio:GRPO 的裁剪范围。默认为 0.2。

  • algorithm.adv_estimator:默认为 gae。请将其设置为 grpo。

  • actor_rollout_ref.actor.loss_agg_mode:默认为“token-mean”。选项包括“token-mean”、“seq-mean-token-sum”、“seq-mean-token-mean”。原始 GRPO 论文采用的是样本级损失(seq-mean-token-mean),这在长 CoT(Chain-of-Thought)场景中可能不稳定。Verl 中提供的所有 GRPO 示例脚本都使用默认配置“token-mean”来进行损失聚合。

GRPO 不会在奖励中添加 KL 惩罚,而是通过将训练策略和参考策略之间的 KL 散度直接添加到损失中来进行正则化:

  • actor_rollout_ref.actor.use_kl_loss:在 Actor 中使用 KL 损失。使用时,我们不在奖励函数中应用 KL。默认为 False。请将其设置为 True 以启用 GRPO。

  • actor_rollout_ref.actor.kl_loss_coef:KL 损失的系数。默认为 0.001。

  • actor_rollout_ref.actor.kl_loss_type:支持 kl(k1)、abs、mse(k2)、low_var_kl(k3) 和 full。在末尾添加“+”(例如 ‘k1+’ 和 ‘k3+’)将直接应用 k2 以实现无偏梯度估计,而与 kl 值估计无关(有关更多详细信息,请参阅 https://github.com/volcengine/verl/pull/2953#issuecomment-3162113848)。如何计算 Actor 和参考策略之间的 KL 散度。请参阅这篇博文以获取详细分析:http://joschu.net/blog/kl-approx.html

高级扩展

DrGRPO

Understanding R1-Zero-Like Training: A Critical Perspective 论文指出 GRPO 中存在优化偏差,这会导致响应人为地变长,尤其是对于不正确的输出。这种低效源于 GRPO 使用基于组的奖励标准化来计算优势的方式。相反,DrGRPO 通过全局常数进行归一化来聚合 token 级损失,以消除长度偏差。

配置以下参数以启用 DrGRPO,其他所有参数与 GRPO 相同:

  • actor_rollout_ref.actor.loss_agg_mode:“seq-mean-token-sum-norm”,此设置会关闭 seq-dim 平均。

  • actor_rollout_ref.actor.use_kl_loss:对于 DrGRPO,请将其设置为 False。

  • algorithm.norm_adv_by_std_in_grpo:False,这将关闭标准差归一化。

参考示例

Qwen2.5 GRPO 训练日志和命令:链接

bash examples/grpo_trainer/run_qwen3-8b.sh

有关更多参考性能,请参阅 https://verl.readthedocs.io/en/latest/algo/baseline.html