ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

verl 中的 OPO 算法:基于最优奖励基线的精确 On-Policy 强化学习实战指南

verl 中的 OPO 算法:基于最优奖励基线的精确 On-Policy 强化学习实战指南 verl 中的 OPO 算法基于最优奖励基线的精确 On-Policy 强化学习实战指南【免费下载链接】verlverl/HybridFlow: A Flexible and Efficient RL Post-Training Framework项目地址: https://gitcode.com/GitHub_Trending/ve/verlOPOOn-Policy RL with Optimal Reward Baseline是一种面向大模型 RL 后训练的强化学习算法通过精确的 On-Policy 采样与理论最优的长度加权奖励基线Length-Weighted Reward Baseline解决传统分组采样算法中策略漂移过大、熵坍缩导致的训练不稳定问题。本文以 verlHybridFlow框架中的 OPO 算法文档 为主体结合 advantage 计算源码 与 算法配置模块完整讲解 OPO 的原理、配置方法、运行示例以及向 RLOO、Reinforce 等算法的扩展路径帮助读者在 verl 中快速落地 OPO 训练。OPO 的核心思想两个关键组件OPO 解决的痛点非常明确在 RL 后训练中宽松的 On-Policy 约束与次优的奖励基线往往共同导致训练不稳定典型表现是大规模策略偏移policy shift与熵坍缩entropy collapse。为此OPO 引入两个关键组件精确 On-Policy 训练Exact On-Policy Training始终从当前策略生成响应绝不使用任何预生成数据或 Off-Policy 数据从源头消除策略失配policy mismatch带来的偏差。最优奖励基线Optimal Reward Baseline与 GRPO 等分组采样算法使用组内平均奖励作为基线不同OPO 使用组内长度加权奖励length-weighted reward作为基线来归一化奖励并且省略标准差归一化。正如 原文档 所述这两点组合使得 OPO 可以用仅最大化期望奖励这一单一目标来训练单一策略模型从而获得更小的策略偏移和更高的输出熵鼓励模型生成更多样、更少重复的响应。长度加权基线的最优性为什么长度加权奖励是理论最优基线直观理解较长响应天然拥有更多 token其累积奖励的期望值也会相应更大。若用简单平均奖励做基线长响应会被系统性低估、短响应被高估基线估计产生偏差。OPO 按长度加权计算组内基线让基线对响应长度带来的期望奖励差异做出校正使 advantage 估计更接近去除长度干扰后的真实相对优劣。这一设计在 verl 源码中有精确对应。查看 compute_opo_outcome_advantageresponse_length response_mask.sum(dim-1) scores token_level_rewards.sum(dim-1) id2score defaultdict(list) id2len defaultdict(list) id2bsl {} with torch.no_grad(): bsz scores.shape[0] for i in range(bsz): id2score[index[i]].append(scores[i]) id2len[index[i]].append(response_length[i]) for idx in id2score: if len(id2score[idx]) 1: id2bsl[idx] torch.tensor(0.0) elif len(id2score[idx]) 1: score_tensor torch.stack(id2score[idx]) len_tensor torch.stack(id2len[idx]) id2bsl[idx] (len_tensor * score_tensor).sum() / len_tensor.sum() else: raise ValueError(fno score in prompt index: {idx}) for i in range(bsz): scores[i] scores[i] - id2bsl[index[i]] scores scores.unsqueeze(-1) * response_mask return scores, scores关键公式对应源码第 683 行baseline(group) Σ(len_i × score_i) / Σ(len_i) advantage_i score_i − baseline(group)可以看到三个重要实现细节按 prompt 分组通过index数组将同属一个 prompt 的多条响应组采样结果聚合到同一个组每组计算一个独立基线。组内仅一条响应时基线置 0此时无法估计组内相对优劣直接以原始得分作为 advantage。不做标准差归一化源码中完全没有出现std除法或 whiten 操作——这正是 OPO 与 GRPO 的核心差异之一避免额外引入方差放缩。同时函数通过register_adv_est(AdvantageEstimator.OPO)装饰器注册源码第 639 行AdvantageEstimator.OPO opo定义在 core_algos.py 第 103 行这就是配置字符串adv_estimator: opo的来源。在 verl 中启用 OPO完整配置解析要启用 OPO只需将算法配置中的 advantage 估计器切换为opo并调整三个与训练目标相关的超参。以下是 原文档 给出的完整配置附上默认值与源码依据algorithm: adv_estimator: opo # Use OPO for optimal reward baseline data: train_batch_size: 1024 actor_rollout_ref: actor: ppo_mini_batch_size: 1024 # ppo_mini_batch_size should equal to train_batch_size to enable exact on-policy training entropy_coeff: 0 # disable entropy regularization use_kl_loss: False # disable kl regularization kl_loss_coef: 0各参数的作用与依据如下参数取值要求作用说明源码/配置位置algorithm.adv_estimatoropo切换 advantage 估计器为 OPO 的长度加权基线定义于 algorithm.py 第 629、657 行默认值为gaedata.train_batch_size按显存与吞吐设定示例 1024每轮训练采样的总样本数ppo_trainer.yamlactor_rollout_ref.actor.ppo_mini_batch_size必须等于train_batch_size保证一次完整采样对应一轮完整策略更新实现精确 On-Policy若 mini-batch 小于 train batch则同一批数据会被拆成多轮更新采样策略与更新策略之间出现错位默认值 256见 actor.yaml 第 18 行actor_rollout_ref.actor.entropy_coeff0关闭熵正则化。OPO 依靠最优基线自然维持输出多样性无需额外熵奖励默认值 0见 actor.yaml 第 93 行actor_rollout_ref.actor.use_kl_lossFalse关闭显式 KL 惩罚损失避免对策略更新过度约束默认值 false见 actor.yaml 第 103 行actor_rollout_ref.actor.kl_loss_coef0配合use_kl_loss: False将 KL 系数归零即使置 False也建议显式归零以防配置继承歧义默认值 0.001见 actor.yaml 第 112-113 行关于 On-Policy 一致性的进一步说明ppo_mini_batch_size train_batch_size是 OPO 能否生效的关键前提。在 verl 中train_batch_size决定一次 rollout 阶段采样的数据量而ppo_mini_batch_size决定一次梯度更新消费的数据量。二者相等意味着采集一批 → 完整更新一次策略 → 再用更新后的策略采集下一批策略自始至终保持采样时即当前版本从机制上杜绝 Off-Policy 数据混入。若二者不等例如默认 256 vs 1024同一批响应会被重复用于多轮更新产生隐式 Off-Policy 效应与 OPO 的设计前提相悖。另外注意use_kl_loss: False会关闭基于参考模型reference model的显式 KL 损失而algorithm.use_kl_in_reward若开启则会将 KL 作为奖励内部项计入。OPO 场景建议两者均关闭仅依赖长度加权基线这一单一目标。参考模型默认配置说明见 ppo_trainer.yaml 第 20 行。端到端运行示例将上述配置写入 YAML 后即可通过 verl 的标准训练入口启动 OPO 训练。以仓库中现有的单策略 RL 训练脚本为参照例如 examples/ppo_trainer/run_qwen3_8b_fsdp.sh 所演示的 FSDP 后端启动方式典型命令如下python3 -m verl.trainer.main_ppo \ algorithm.adv_estimatoropo \ data.train_filesyour_train.parquet \ data.val_filesyour_val.parquet \ data.train_batch_size1024 \ data.max_prompt_length1024 \ data.max_response_length2048 \ actor_rollout_ref.model.pathQwen/Qwen3-8B \ actor_rollout_ref.actor.ppo_mini_batch_size1024 \ actor_rollout_ref.actor.entropy_coeff0 \ actor_rollout_ref.actor.use_kl_lossFalse \ actor_rollout_ref.actor.kl_loss_coef0 \ actor_rollout_ref.rollout.namevllm \ trainer.experiment_nameopo_qwen3_8b \ trainer.n_gpus_per_node8命令说明通过 Hydra 风格的keyvalue覆盖方式注入 OPO 所需的全部参数等价于在 YAML 中显式声明。也可将 原文档配置 直接写入自定义 YAML再用verl.trainer.main_ppo加载两种方式等价。后端的差异化配置FSDP / Megatron / VeOmni可参考examples/下各 trainer 目录中的.sh脚本例如 examples/ppo_trainer/、examples/grpo_trainer/ 中针对不同模型规模与硬件的脚本组合。训练过程中可重点观察两类指标以验证 OPO 效果策略偏移相关指标KL、响应分布变化应显著小于传统均值基线算法输出熵response entropy应保持较高水平即模型输出更趋多样、重复率下降。高级扩展将 OPO 思想注入 RLOO 与 Reinforce原文档 明确说明OPO 可以扩展到 RLOO 与 Reinforce 等算法——只需在保持各自 advantage 函数的前提下开启精确 On-Policy 训练并引入长度加权基线改动量极小。在 verl 源码中这三种算法共享同一套组采样 基线归一化的代码骨架位于 verl/trainer/ppo/core_algos.py算法advantage 估计器字符串基线策略是否做 std 归一化源码位置OPOopo长度加权组奖励否core_algos.py#L639-L690RLOOrlooleave-one-out 组均值否core_algos.py#L587-L636Reinforce baselinereinforce_plus_plus_baseline组均值是masked whitencore_algos.py#L533-L584三者的差异仅在如何计算基线与是否归一化两处这也印证了原文档只需对 advantage 估计函数做最小修改的判断RLOO 的 leave-one-out 基线第 631-632 行是去除自身后其余样本均值的无偏估计Reinforce 使用组均值并额外执行verl_F.masked_whiten做 masked 白化第 582 行而 OPO 直接用长度加权均值作为基线且不做白化——从源码结构看这正是它在三者中目标最纯粹的原因advantage 完全由长度校正后的相对优劣决定没有任何附加正则项。因此若想在其他算法中复刻 OPO 的收益可以将其基线计算逻辑(len_tensor * score_tensor).sum() / len_tensor.sum()移植到对应算法的 advantage 函数中同时保持ppo_mini_batch_size train_batch_size、entropy_coeff 0、use_kl_loss False的精确 On-Policy 配置即可获得与 OPO 一致的训练稳定性提升。总结OPO 为 RL 后训练提供了一种少即是多的设计范式不增加额外正则项而是通过精确 On-Policy 采样与理论最优的长度加权奖励基线两个机制层面的改进同时缓解策略漂移与熵坍缩。在 verl 中启用 OPO 只需五处配置adv_estimator: opo、train_batch_size ppo_mini_batch_size、entropy_coeff: 0、use_kl_loss: False、kl_loss_coef: 0且其核心 advantage 逻辑在 core_algos.py 中仅有约 50 行实现便于阅读、验证与二次扩展。对于追求稳定、多样输出的单策略 RL 训练场景OPO 是一个值得优先尝试的基线方案其长度加权基线思想也可低成本地注入 RLOO、Reinforce 等算法作为通用改进手段使用。【免费下载链接】verlverl/HybridFlow: A Flexible and Efficient RL Post-Training Framework项目地址: https://gitcode.com/GitHub_Trending/ve/verl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进