# Group Relative Policy Optimization (GRPO) 最后更新: 05/31/2025. 在强化学习中,PPO 等经典算法依赖于“评论家”(critic) 模型来估计动作的价值,从而指导学习过程。然而,训练这个评论家模型可能需要大量资源。 GRPO 通过消除对独立评论家模型的需求来简化这一过程。其工作原理如下: - 分组采样:对于一个给定的问题,模型会生成多个可能的解决方案,形成一个输出“组”。 - 奖励分配:根据每个解决方案的正确性或质量对其进行评估并分配奖励。 - 基线计算:该组的平均奖励作为基线。 - 策略更新:模型通过将每个解决方案的奖励与组基线进行比较来更新其参数,从而强化优于平均水平的解决方案,并抑制差于平均水平的解决方案。 这种方法通过避免训练独立的价值估计模型来减少计算开销,使学习过程更有效。有关更多详细信息,请参阅原始论文 [DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models](https://arxiv.org/pdf/2402.03300) ## 关键组件 - 无价值函数(无评论家):与 PPO 不同,GRPO 不训练独立的价值网络(评论家)。 - 分组采样(Grouped Rollouts):GRPO 不为每个输入评估一次采样,而是为每个提示从当前策略生成多个完成(响应)。这组完成称为一个组。 - 相对奖励:在每个组内,根据完成情况进行评分(例如,根据正确性),并对奖励进行标准化处理,使其相对于该组而言。 ## 配置 请注意,所有包含 `micro_batch_size` 的配置都用于配置每次前向或后向传递的最大采样或 token 数量,以避免 GPU 显存溢出(OOM),其值不应改变算法/收敛行为。 尽管许多配置以 `ppo_` 前缀开头,但它们可以跨 Verl 中的不同 RL 算法使用,因为 GRPO 的训练循环与 PPO(无评论家)类似。 ![image](https://github.com/user-attachments/assets/16aebad1-0da6-4eb3-806d-54a74e712c2d) - `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](https://arxiv.org/pdf/2503.20783) 论文指出 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 训练日志和命令:[链接](https://github.com/eric-haibin-lin/verl-data/blob/experiments/gsm8k/qwen2-7b-fsdp2.log) ```bash bash examples/grpo_trainer/run_qwen3-8b.sh ``` 有关更多参考性能,请参阅 https://verl.readthedocs.io/en/latest/algo/baseline.html