Group Relative Policy Optimization (GRPO)
上次更新:05/31/2025。
在强化学习中,像 PPO 这样的经典算法依赖于一个“评论家”(critic) 模型来估算动作的价值,从而引导学习过程。然而,训练这个评论家模型可能会耗费大量资源。
GRPO 通过消除对单独评论家模型的需求来简化这一过程。它的工作原理如下:
分组采样:对于给定的问题,模型会生成多个可能的解决方案,形成一个“组”输出。
奖励分配:每个解决方案都会根据其正确性或质量进行评估,并分配相应的奖励。
基准计算:组的平均奖励作为基准。
策略更新:模型通过比较每个解决方案的奖励与组基准来更新其参数,强化高于平均水平的解决方案,并抑制低于平均水平的解决方案。
这种方法通过避免训练单独的价值估算模型来降低计算开销,使学习过程更加高效。更多详情,请参考原始论文DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models
关键组件
无价值函数(无评论家):与 PPO 不同,GRPO 不训练单独的价值网络(评论家)
分组采样(分组 rollout):GRPO 不会像 PPO 那样为每个输入只评估一个 rollout,而是为每个提示从当前策略生成多个补全(响应)。这些补全的集合被称为一个组。
相对奖励:在每个组内,补全会被打分(例如基于正确性),并相对于组进行奖励归一化(标准化)。
配置
请注意,所有包含 micro_batch_size 的配置用于为每个前向或反向传递配置最大样本或 token 计数,以避免 GPU OOM(内存不足),其值不应改变算法/收敛行为。
尽管许多配置以 ppo_ 前缀开头,但它们在 verl 的不同 RL 算法中通用,因为 GRPO 训练循环类似于 PPO(但没有评论家)。
actor_rollout.ref.rollout.n:为每个提示采样 n 次。默认为 1。对于 GRPO,请将其设置为大于 1 的值以进行分组采样。data.train_batch_size:用于生成一组采样轨迹/rollout 的提示全局批次大小。响应/轨迹的数量为data.train_batch_size * actor_rollout.ref.rollout.nactor_rollout_ref.actor.ppo_mini_batch_size:采样轨迹集被拆分为多个小批次,每个小批次 batch_size=ppo_mini_batch_size,用于 PPO actor 更新。ppo_mini_batch_size 是跨所有 worker 的全局大小。注意:在 GRPO 中,actor 更新使用优化器直接处理(来自advantage计算),而不是像 PPO 那样重新采样或从 buffer 加载。actor_rollout_ref.actor.ppo_epochs:对一组采样轨迹进行 GRPO 更新(针对 actor)的 epoch 数量。actor_rollout_ref.actor.clip_ratio:GRPO 的裁剪范围。默认为 0.2。algorithm.adv_estimator:默认是 gae。请将其设置为 grpo(GRPO 使用组相对优势而不是 GAE)。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(链式思考)场景中可能不稳定。verl 中提供的所有 GRPO 示例脚本使用默认配置 “token-mean” 作为损失聚合方式。
GRPO 不是在奖励中添加 KL 惩罚,而是通过直接将训练策略与参考策略之间的 KL 散度添加到损失中来进行正则化:
actor_rollout_ref.actor.use_kl_loss:是否在 actor 中使用 kl 损失。当使用时,我们不会在奖励函数中应用 KL。默认为 False。请为 GRPO 将其设置为 True。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+’)将应用直通估计(straight through)来雇用 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.loss_scale_factor:(可选)设置为常量整数(例如最大响应长度),以确保训练过程中归一化一致。如果未设置,则使用当前批次的响应长度。actor_rollout_ref.actor.use_kl_loss:请为 DrGRPO 将其设置为 False。algorithm.norm_adv_by_std_in_grpo:False,这会关闭标准差归一化。
参考示例
Qwen2.5 GRPO 训练日志和命令:link
bash examples/grpo_trainer/run_qwen3-8b.sh
更多参考性能,请参见 https://verl.readthedocs.io/en/latest/algo/baseline.html