LLM | VeRL 相关文档汇总


目录


PPO 示例脚本的 readme

examples/ppo_trainer/README.md

近端策略优化(Proximal Policy Optimization,PPO)是一类用于强化学习的策略梯度方法,由 OpenAI 于 2017 年提出。PPO 在简单性、稳定性和性能之间取得了平衡,使其成为现代 RL 应用(包括大规模语言模型微调)中最广泛使用的算法之一。

像 REINFORCE 或 Vanilla Policy Gradient 这样的传统策略梯度方法存在以下问题:

  • 高方差和样本效率低下。
  • 因策略更新过大导致的不稳定性。

PPO 使用一种裁剪后的替代目标函数来解决这个问题,该函数避免了过大的更新,同时不需要二阶导数。

关于 PPO 的更多技术细节,我们建议阅读 OpenAI spinning up 教程 的介绍以及论文 Proximal Policy Optimization Algorithms

1 关键组件

  • Actor-Critic 架构:PPO 需要 actor 模型(策略)和 critic 模型(价值函数)。这与 GRPO 和 RLOO 等其他不需要 critic 模型的算法不同。
  • 广义优势估计 (GAE):PPO 使用 GAE 来计算优势值,这有助于在保持低偏差的同时减少策略梯度估计的方差。
  • 裁剪后的替代目标:PPO 的核心是通过裁剪后的替代目标函数实现的,该函数限制了策略更新。

2 配置

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

大多数 critic 配置与 actor 的配置类似。注意下图中省略了 critic 模型。

image
  • data.train_batch_size:用于生成一组采样轨迹/rollout 的提示的全局批次大小。响应/轨迹的数量是 data.train_batch_size * actor_rollout.ref.rollout.n
  • actor_rollout_ref.actor.ppo_mini_batch_size:采样得到的轨迹集被分割成多个大小为 ppo_mini_batch_size 的小批量,用于 PPO actor 的更新。ppo_mini_batch_size 是所有工作节点上的全局大小。
  • critic.ppo_mini_batch_size:采样得到的轨迹集被分割成多个大小为 ppo_mini_batch_size 的小批量,用于 PPO critic 的更新。ppo_mini_batch_size 是所有工作节点上的全局大小。
  • actor_rollout_ref.actor.clip_ratio:PPO 的裁剪范围。默认为 0.2。
  • actor_rollout_ref.actor.ppo_epochs:在一组采样轨迹上对 actor 进行 PPO 更新的轮数。
  • critic.ppo_epochs:在一组采样轨迹上对 critic 进行 PPO 更新的轮数。默认为 actor_rollout_ref.actor.ppo_epochs
  • algorithm.gamma:折扣因子。
  • algorithm.lam:在 GAE 估计器中用于权衡偏差和方差的 lambda 项。
  • algorithm.adv_estimator:支持 gaegrporeinforce_plus_plusreinforce_plus_plus_baselinerloorloo_vectorized(似乎 PPO 算法应该使用 gae)。

3 高级扩展

3.1 KL 散度控制

防止策略与参考策略偏离太远的选项。提供了两种机制:KL 奖励惩罚和 KL 损失。更多技术细节,请参阅 Training language models to follow instructions with human feedback

使用 KL 损失进行 KL 散度控制的选项:

  • actor_rollout_ref.actor.use_kl_loss:是否在 actor 中使用 KL 损失。使用时,我们不会在奖励函数中应用 KL。默认为 False。
  • actor_rollout_ref.actor.kl_loss_coef:KL 损失的系数。默认为 0.001。
  • actor_rollout_ref.actor.kl_loss_type:支持 kl(k1)absmse(k2)low_var_kl(k3)full。在末尾添加 "+"(例如,'k1+' 和 'k3+')将应用直通技巧,无论 KL 值估计如何,都采用 k2 进行无偏梯度估计(更多细节请参阅:https://github.com/volcengine/verl/pull/2953#issuecomment-3162113848)。用于计算 actor 和参考策略之间 KL 散度的方法。有关详细分析,请参阅此博客文章:http://joschu.net/blog/kl-approx.html。

在奖励中使用 KL 惩罚的选项:

  • algorithm.use_kl_in_reward:是否启用奖励内部的 KL 惩罚。默认为 False。
  • algorithm.kl_penalty:支持 kl(k1)absmse(k2)low_var_kl(k3)full。这定义了计算 actor 和参考策略之间 KL 散度的方法。具体选项请参考 core_algos.py 中的 kl_penalty。有关详细分析,请参阅此博客文章:http://joschu.net/blog/kl-approx.html。
  • algorithm.kl_ctrl.kl_coef:奖励内部 KL 惩罚的(初始)系数。默认为 0.001。
  • algorithm.kl_ctrl.type:'fixed' 对应 FixedKLController,'adaptive' 对应 AdaptiveKLController。
  • algorithm.kl_ctrl.horizon:有关详细信息,请参阅 AdaptiveKLController 的源代码。
  • algorithm.kl_ctrl.target_kl:有关详细信息,请参阅 AdaptiveKLController 的源代码。

3.2 双重裁剪 PPO

双重裁剪 PPO 引入了一种方法,当优势小于零时,对策略比率应用一个下限,使得当比率乘以一个较大的数时,不超过指定的下限。

image
  • actor_rollout_ref.actor.clip_ratio_c:双重裁剪 PPO 的下限值,默认为 3.0。

4 参考示例

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

bash run_gemma.sh \
  trainer.n_gpus_per_node=1 \
  actor_rollout_ref.rollout.tensor_model_parallel_size=1 \
  trainer.logger=console \
  critic.model.path=Qwen/Qwen2.5-0.5B-Instruct \
  actor_rollout_ref.model.path=Qwen/Qwen2.5-0.5B-Instruct \
  data.train_batch_size=256 \
  actor_rollout_ref.actor.ppo_mini_batch_size=64 \
  actor_rollout_ref.actor.ppo_micro_batch_size=2 \
  critic.ppo_micro_batch_size=2

使用 verl v0.2 的参考性能:

模型 方法 分数 链接
Qwen/Qwen2.5-0.5B-Instruct 预训练模型 36.4 Qwen Blog
Qwen/Qwen2.5-0.5B-Instruct PPO 56.7 PPO 命令和日志

GRPO 示例脚本的 readme

examples/grpo_trainer/README.md

在强化学习中,像 PPO 这样的经典算法依赖于一个“评论家”模型来估计动作的价值,从而指导学习过程。然而,训练这个评论家模型可能非常耗费资源。

GRPO 通过消除对单独评论家模型的需求来简化这个过程。它的运作方式如下:

  • 组采样:对于给定的问题,模型生成多个可能的解决方案,形成一个输出“组”。
  • 奖励分配:每个解决方案根据其正确性或质量进行评估并分配一个奖励。
  • 基线计算:该组的平均奖励作为基线。
  • 策略更新:模型通过将每个解决方案的奖励与组基线进行比较来更新其参数,增强优于平均水平的解决方案,并抑制劣于平均水平的解决方案。

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

1 关键组件

  • 没有价值函数(没有 critic):与 PPO 不同,GRPO 不训练单独的价值网络(critic)。
  • 组采样 / Group Sampling(Grouped Rollouts):GRPO 不是为每个输入评估一次 rollout,而是为每个提示从当前策略生成多个 completions(响应)。这组 completions 被称为一个 group。
  • 相对奖励:在每个 group 内,对 completions 进行评分(例如,基于正确性),并根据组内情况对奖励进行相对归一化。

2 配置

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

尽管许多配置以 ppo_ 开头,但它们在 verl 中适用于不同的 RL 算法,因为 GRPO 的训练循环与 PPO 类似(只是没有 critic)。

  • actor_rollout.ref.rollout.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:采样得到的轨迹集被分割成多个大小为 ppo_mini_batch_size 的小批量,用于 PPO actor 的更新。ppo_mini_batch_size 是所有工作节点(worker)上的全局大小。
  • actor_rollout_ref.actor.ppo_epochs:在一组采样轨迹上对 actor 进行 GRPO 更新的轮数。
  • actor_rollout_ref.actor.clip_ratio:GRPO 的裁剪范围。默认为 0.2。
  • algorithm.adv_estimator:默认为 gae。对于 GRPO,请将其设置为 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),这在长思维链场景中可能不稳定。verl 中提供的所有 GRPO 示例脚本都使用默认配置 "token-mean" 进行损失聚合。

GRPO 不是将 KL 惩罚项加到奖励中,而是通过直接将训练策略与参考策略之间的 KL 散度加到损失中来进行正则化:(补充,PPO 一般不使用现显式的 KL 约束 / 惩罚,而是通过 clip 机制控制更新幅度不要过大)

  • 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)技巧,无论 KL 值估计如何,都采用 k2 进行无偏梯度估计(更多细节请参阅:https://github.com/volcengine/verl/pull/2953#issuecomment-3162113848 )。用于计算 actor 和参考策略之间 KL 散度的方法。有关详细分析,请参阅此博客文章:http://joschu.net/blog/kl-approx.html

3 高级扩展

3.1 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",这会关闭序列维度的平均。
  • actor_rollout_ref.actor.loss_scale_factor:(可选)设置为一个常数整数(例如,最大响应长度),以确保在整个训练过程中归一化一致。如果未设置,则使用当前批次的响应长度。
  • actor_rollout_ref.actor.use_kl_loss:对于 DrGRPO,请将其设置为 False。
  • algorithm.norm_adv_by_std_in_grpo:设置为 False,关闭标准差归一化。

4 参考示例

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

bash examples/grpo_trainer/run_qwen3-8b.sh

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



posted @ 2026-02-17 17:40  MoonOut  阅读(9)  评论(0)    收藏  举报