verl 中的熵机制(Entropy Mechanism):Clip-Cov 与 KL-Cov 策略解决 RL 熵坍缩实战指南
【免费下载链接】verlverl/HybridFlow: A Flexible and Efficient RL Post-Training Framework项目地址: https://gitcode.com/GitHub_Trending/ve/verl
本指南基于 docs/algo/entropy.md 中收录的《The Entropy Mechanism of Reinforcement Learning for Reasoning Language Models》(arXiv:2505.22617)配方的核心内容,结合 verl 仓库中策略损失(policy loss)的实际实现,系统讲解 RL 训练中熵坍缩(entropy collapse)的成因、Clip-Cov 与 KL-Cov 两种缓解机制的数学原理与源码实现,并给出在 verl 中以配置文件启用这两种损失模式的完整实战方案。读完本文,你将理解"性能受熵耗竭制约"这一核心结论,并掌握如何在 GRPO/PPO 训练脚本中一键切换到clip_cov或kl_cov损失模式。
一、背景:大规模 RL 训练中的熵坍缩问题
在大语言模型(LLM)的强化学习(RL)后训练中,研究者观察到一种普遍现象:随着训练推进,策略(policy)的熵(entropy)会急剧下降,模型对已见过的解题路径迅速变得"过度自信",导致训练性能提前饱和。这一现象被称为熵坍缩(entropy collapse)。
该配方文档指出,熵坍缩并非偶然现象,而是与性能之间存在可量化的经验关系:
$$R = -a\exp(H) + b$$
其中 $H$ 为策略熵,$R$ 为性能指标,$a>0$、$b$ 为常数。该式表明:性能被熵的耗竭所"卡脖子"——当策略熵趋近于零时,无论继续训练多久,性能提升空间都极其有限。换言之,想要持续提升 RL 训练效果,就必须在训练过程中保持足够的策略熵,让模型持续保有探索空间。
二、理论分析:熵的变化由"协方差"驱动
仅停留在"熵会下降"的现象层面是不够的,该配方文档进一步给出了理论解释:
熵的变化由动作概率更新与 logit 更新的协方差(covariance)驱动,而这一协方差与 Policy Gradient 方法中的优势(advantage)直接相关。
直觉上可以这样理解:
- 对于高概率且高优势的动作(模型已经比较确定的正确路径),参数更新会进一步推高其概率,从而压缩分布、降低熵;
- 对于低概率但高优势的动作(罕见但正确的路径),更新会提升其概率,从而分散分布、升高熵。
理论推导表明,熵的变化率正比于"优势与概率更新之间的协方差项"。而实证观察显示,这一协方差项在真实训练中始终保持正值,因此策略熵呈现单调下降的趋势——这正是熵坍缩的底层原因。
基于这一分析,配方提出了两种简单而有效的缓解策略:Clip-Cov与KL-Cov,二者都通过限制高协方差 token 的更新来阻止熵的过快坍缩,从而在保持探索能力的同时提升最终性能。
三、Clip-Cov 与 KL-Cov:两种熵保护机制
3.1 Clip-Cov:直接裁剪高协方差 token 的策略梯度
Clip-Cov 的做法是:在计算 PPO 策略梯度时,识别出协方差最大的那一小部分 token,并将它们的策略梯度置零(即裁剪掉),从而消除这些 token 对熵的破坏性压缩。
具体而言,其协方差定义在源码 verl/trainer/ppo/core_algos.py 中实现为:
cov_all = (advantages - verl_F.masked_mean(advantages, response_mask)) * ( log_prob - verl_F.masked_mean(log_prob.detach(), response_mask) )即每个 token 的协方差 =(该 token 优势 − 批内平均优势)×(该 token 当前 log 概率 − 批内平均 log 概率,后者 detach 不参与梯度)。随后实现通过以下步骤完成裁剪(对应 core_algos.py):
- 将 padding 位置与标准 PPO 裁剪已经生效的位置的协方差置为
-inf; - 仅保留协方差落在区间
(clip_cov_lb, clip_cov_ub)内的候选 token; - 按
clip_cov_ratio(默认 0.0002,即 0.02%)计算需裁剪的 token 数量clip_num = max(int(clip_cov_ratio * response_mask.sum()), 1); - 从候选集中随机采样
clip_num个 token,将其损失系数corr置 0,即完全屏蔽其策略梯度。
该损失最后以pg_losses = torch.maximum(pg_losses1, pg_losses2) * corr的形式聚合,并输出actor/pg_clipfrac(被裁剪 token 占比)与actor/ppo_kl两个监控指标。
3.2 KL-Cov:对高协方差 token 施加 KL 惩罚
KL-Cov 的思路不同:它不是直接置零梯度,而是对协方差最大的那一小部分 token 施加额外的 KL 惩罚项,抑制其过大幅度的概率更新。
从源码 verl/trainer/ppo/core_algos.py 可以看到,其损失结构为:
pg_losses1 = -advantages * ratio # 标准 PPO 项 pg_losses_kl = -advantages * ratio + ppo_kl_coef * abs_kl # 附加 KL 惩罚项随后:
- 收集所有有效 token 的优势与 log 概率,计算协方差列表
(adv - adv.mean()) * (logp - logp.mean()); - 通过
torch.topk选取协方差最大的max(1, int(len(cov_lst_all) * kl_cov_ratio))个 token; - 将这些 token 的损失从
pg_losses1替换为pg_losses_kl,从而用ppo_kl_coef * |log_prob - old_log_prob|惩罚其过大的概率偏移。
由于 KL 惩罚只作用于极少数高协方差 token(默认比例 0.02%),它对整体优化方向影响极小,却能精准抑制熵坍缩的主要"元凶"。
3.3 两种机制的共同点与差异
| 维度 | Clip-Cov | KL-Cov |
|---|---|---|
| 目标 token | 协方差位于(clip_cov_lb, clip_cov_ub)区间内的随机采样 token | 协方差 top-k 的 token |
| 作用方式 | 策略梯度置零(完全屏蔽更新) | 附加 KL 惩罚(软性抑制更新) |
| 控制比例参数 | clip_cov_ratio(默认 0.0002) | kl_cov_ratio(默认 0.0002) |
| 额外参数 | clip_cov_lb=1.0、clip_cov_ub=5.0 | ppo_kl_coef=0.1 |
| 论文结论 | 全面优于基线,AIME25 上提升显著 | 平均分最高,AIME24/AMC 提升最明显 |
两种方法都能有效防止熵坍缩并提升性能,论文在 7B 与 32B 两个规模上均验证了其有效性(详见第五节评估结果)。
四、在 verl 中启用熵保护机制:配置与实战
4.1 配置项与默认值
verl 已将上述两种损失模式完整集成进配置文件。在 verl/trainer/config/actor/actor.yaml 中,policy_loss段定义了相关参数:
policy_loss: _target_: verl.workers.config.PolicyLossConfig # Loss function mode: vanilla / clip-cov / kl-cov / gpg,来自 https://arxiv.org/abs/2505.22617 loss_mode: "vanilla" # Ratio of tokens to be clipped for clip-cov loss clip_cov_ratio: 0.0002 # Lower bound for clip-cov loss clip_cov_lb: 1.0 # Upper bound for clip-cov loss clip_cov_ub: 5.0 # Ratio of tokens to be applied kl penalty for kl-cov loss kl_cov_ratio: 0.0002 # KL divergence penalty coefficient ppo_kl_coef: 0.1对应的数据类型定义位于 verl/workers/config/actor.py 的PolicyLossConfigdataclass,各参数含义如下:
loss_mode:策略损失模式,可选值包括vanilla、gpg、clip_cov、kl_cov、geo_mean、dro、cispo、bypass_mode等,其中clip_cov与kl_cov即本文所述熵保护机制;clip_cov_ratio:Clip-Cov 中被裁剪 token 占有效 token 的比例,默认 0.0002(0.02%),需大于 0;clip_cov_lb/clip_cov_ub:Clip-Cov 协方差裁剪的上下界,默认 1.0 / 5.0,只有协方差落在此区间内的 token 才参与裁剪候选;kl_cov_ratio:KL-Cov 中被施加 KL 惩罚的 top-k token 比例,默认 0.0002;ppo_kl_coef:KL 惩罚系数,默认 0.1(在kl_cov损失函数中作为abs_kl项的权重)。
需要注意的是,PolicyLossConfig同时包含rollout_correction子配置,支持与 rollout correction(rollout 校正)机制组合使用。
4.2 命令行启用方式
与 verl 的其他超参数一样,这些配置既可以在 yaml 中修改,也可以在启动命令中通过点分路径直接覆盖,例如:
python3 -m verl.trainer.main_ppo \ algorithm.adv_estimator=grpo \ actor_rollout_ref.actor.policy_loss.loss_mode=kl_cov \ actor_rollout_ref.actor.policy_loss.kl_cov_ratio=0.0002 \ ...切换为 Clip-Cov 只需将loss_mode改为clip_cov并相应调整clip_cov_ratio/clip_cov_lb/clip_cov_ub。
4.3 训练脚本示例
原文档中给出的启动方式(Qwen2.5-7B 单机与 Qwen2.5-32B 多机)为运行recipe/dapo/目录下的7b_kl_cov.sh与32b_kl_cov.sh脚本。当前仓库中,与 DAPO(含 KL-Cov 变体)配套的完整可运行脚本分布在 verl/experimental/fully_async_policy/shell/ 与 verl/experimental/one_step_off_policy/shell/ 目录下,例如dapo_7b_math_fsdp2_16_16.sh、dapo_7b_math_megatron_4_12.sh等,可作为搭建 KL-Cov 训练任务的直接参照。这些脚本的典型结构为:
cd verl conda activate your_env python3 -m verl.trainer.main_ppo \ algorithm.adv_estimator=grpo \ data.train_files=... \ data.val_files=... \ data.train_batch_size=... \ actor_rollout_ref.model.path=Qwen/Qwen2.5-7B \ actor_rollout_ref.actor.optim.lr=1e-6 \ actor_rollout_ref.actor.policy_loss.loss_mode=kl_cov \ actor_rollout_ref.actor.policy_loss.kl_cov_ratio=0.0002 \ actor_rollout_ref.actor.entropy_coeff=0 \ actor_rollout_ref.actor.use_kl_loss=true \ actor_rollout_ref.actor.kl_loss_coef=0.001 \ ...需要特别说明的配套配置项:
entropy_coeff=0:熵正则系数。在 actor.yaml 中默认为 0,并配有calculate_entropy开关。由于 Clip-Cov / KL-Cov 通过"保护熵"而非"奖励熵"来维持探索,通常不需要额外熵奖励;DAPO 系列脚本均显式设置entropy_coeff=0;use_kl_loss/kl_loss_coef:GRPO 风格训练中常配合 KL 散度损失(而非 KL reward 惩罚)使用;calculate_entropy:当需要监控策略熵曲线(如论文中展示的熵随训练变化图)时,可将其置为true。在 verl/trainer/ppo/ray_trainer.py 中可以看到,是否计算熵由actor.calculate_entropy or (actor.entropy_coeff != 0.0)决定,计算得到的熵会通过actor/entropy指标输出,用于观察熵保护机制的实际效果。
4.4 损失函数注册机制
verl 的策略损失采用注册表(registry)模式,新增损失只需在 verl/trainer/ppo/core_algos.py 中通过@register_policy_loss("loss_name")装饰器注册,并在训练时通过get_policy_loss_fn(loss_mode)按名称取用。clip_cov与kl_cov分别注册于该文件的 L1743 与 L1848。从PolicyLossConfig的注释可见,该注册表目前还支持dppo_tv、dppo_kl、gspo、sapo、gpg、geo_mean、dro、cispo等多种策略损失,研究者可直接仿照clip_cov/kl_cov的实现注册自定义熵保护损失。
五、评估结果:在数学推理基准上的提升
原文档报告了在 Qwen2.5-7B 与 Qwen2.5-32B 两个规模、GRPO 基线及其变体上的评估结果(训练数据基于 DAPO-MATH):
| 方法 | AIME24 | AIME25 | AMC | MATH-500 | OMNI-MATH | OlympiadBench | Minerva | Avg. |
|---|---|---|---|---|---|---|---|---|
| Qwen2.5-7B | ||||||||
| GRPO | 21.2 | 9.6 | 58.7 | 78.8 | 27.9 | 40.7 | 36.7 | 38.6 |
| w. Clip-higher | 18.1 | 11.5 | 56.6 | 79.2 | 29.8 | 43.3 | 40.4 | 38.8 |
| w.CLIP-Cov | 22.1 | 15.8 | 58.2 | 80.4 | 30.5 | 44.1 | 41.1 | 40.4 |
| w.KL-Cov | 22.6 | 12.9 | 61.4 | 80.8 | 29.1 | 42.6 | 38.2 | 40.6 |
| Qwen2.5-32B | ||||||||
| GRPO | 21.8 | 16.2 | 69.7 | 84.2 | 35.2 | 43.6 | 45.5 | 45.8 |
| w. Clip-higher | 35.6 | 22.3 | 69.5 | 77.2 | 35.1 | 42.5 | 43.0 | 47.2 |
| w.CLIP-Cov | 32.3 | 22.7 | 67.2 | 87.0 | 42.0 | 57.2 | 46.0 | 50.3 |
| w.KL-Cov | 36.8 | 30.8 | 74.5 | 84.6 | 39.1 | 49.0 | 46.3 | 52.2 |
关键结论:
- 全面超越基线:与 GRPO 相比,两种方法在 7B 模型上平均提升 2.0%,在 32B 模型上平均提升 6.4%;
- 规模越大收益越明显:在更具挑战性的 AIME24 与 AIME25 上,32B 模型分别取得 15.0% 与 14.6% 的相对提升;
- 熵水平显著更高:当基线熵进入平台期而无法再被"消耗"时,KL-Cov 方法仍能维持超过 10 倍于基线的熵水平,同时策略模型的响应长度稳步增长、测试集性能持续超越基线——这表明模型在训练中能够更自由地探索,从而学到更好的策略。
六、总结与使用建议
熵坍缩是大规模 LLM RL 训练中制约性能的瓶颈。verl 已完整内置了论文提出的 Clip-Cov 与 KL-Cov 两种熵保护机制,使用成本极低:
- 快速启用:在训练命令中设置
actor_rollout_ref.actor.policy_loss.loss_mode=kl_cov(或clip_cov),按需微调kl_cov_ratio/clip_cov_ratio等比例参数即可,无需改动任何代码; - 组合使用:熵保护机制可与 GRPO 优势估计、KL 散度损失(
use_kl_loss)等现有能力自由组合,且支持异步训练框架(fully_async_policy / one_step_off_policy)下的 DAPO 训练脚本; - 监控验证:开启
calculate_entropy后通过actor/entropy指标观察熵曲线,确认熵保护是否生效; - 自定义扩展:如需实验新的熵保护策略,可参考 core_algos.py 中
compute_policy_loss_clip_cov/compute_policy_loss_kl_cov的实现模式,通过注册表机制接入训练框架。
引用
如需引用该论文,可使用以下 BibTeX(原文见 docs/algo/entropy.md):
@article{cui2025entropy, title={The Entropy Mechanism of Reinforcement Learning for Reasoning Language Models}, author={Cui, Ganqu and Zhang, Yuchen and Chen, Jiacheng and Yuan, Lifan and Wang, Zhi and Zuo, Yuxin and Li, Haozhan and Fan, Yuchen and Chen, Huayu and Chen, Weize and others}, journal={arXiv preprint arXiv:2505.22617}, year={2025} }【免费下载链接】verlverl/HybridFlow: A Flexible and Efficient RL Post-Training Framework项目地址: https://gitcode.com/GitHub_Trending/ve/verl
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考