熵坍缩以及奖励坍缩问题机制分析及解决措施

张开发
2026/5/31 1:33:40 15 分钟阅读
熵坍缩以及奖励坍缩问题机制分析及解决措施
熵坍缩按照论文[1]里面对于熵的定义上面公式中 以及 分别表示policy model一般可以直接简单理解为我们需要优化的模型以及数据集对于熵值高低往往也就意味着模型输出的“不确定性”高熵意味着模型可以尝试多种可能性熵则意味着模型倾向于选择那些确定性的动作。在论文中[1:1]在实验中经常会发现在训练的初期Policy Entropy会迅速下降到接近0如下图左侧图深蓝色线所示模型变得过于确定不再尝试新路径这会导致模型的效果达到瓶颈上升停滞。毕竟强化学习之所以能够生效全都依赖于模型的输出具有多样性每次的输出和reward都是不一样的假如模型的输出每次都是一样的那么强化学习就失去了意义因此就会出现后期的准确率基本保持不变的情况也就是所谓的熵坍缩entropy collapse机制分析对于之所以会发生熵坍缩问题先说结论单步熵变化 ≈−⋅[(|),(,)]而该协方差在实践中结构性恒正。因为SFT之后模型默认输出高概率tokenreward model 倾向给当前高概率的输出打高分最后导致恒正。对于上述问题之所以发生在论文里面对于连续两步中熵的变化为上面公式中 ,1−, 表示的是两步之间的输出差异在梯度优化过程中 ,1−,−∇() 其中 () 表示优化目标对应损失函数 表示学习率对于该等式可以证明得到 ,1−,−(|)(,)那么将该式代入最上面等式中就可以得到(1∣)−(∣)≈−⋅Cov∼(⋅∣)(log⁡(|),(,))对于上述公式中也就是证明了动作概率与对应的优势值之间相关性如果正相关那么就会导致最后熵值的不断下降。当 Cov 0 时 → ΔH 0 → 熵下降policy 变得更确定当 Cov 0 时 → ΔH 0 → 熵上升增加探索性Cov 0 → 熵基本不变理想但极少出现的中性状态Cov[log π(a|s), A(s,a)] 0 的含义当前 policy 认为高概率概率的动作log π 较大在当前训练 batch 中也倾向于获得更高的优势估计 A正相关。反之低概率动作即使偶尔拿到高 A其对协方差的贡献也很微弱因为采样权重 π(a) 本身极小。而在训练过程中协方差几乎恒正因为SFT 后模型“默认”倾向输出高概率 token → 这些 token 在 reward 眼中也“默认”较优 → 正相关 → 每步更新都系统性地压缩分布 → 熵单向坍缩。左图熵变化和协方差之间变化也就证明了协方差增加导致熵下降右图按 prompt 难度分组的协方差分布Easy prompt准确率高协方差大Hard prompt准确率低协方差小甚至为负这说明对容易任务策略强化了已有倾向熵下降对困难任务模型更不确定熵保持或上升解决措施DAPO按照论文[2]中介绍方法在GRPO中对于 一般默认就是0.2而DAPO中直接设置两个超参数 以及 ℎℎ 论文里面选择是0.2以及0.28之所以使用该方法可以一定程度缓解问题是因为增大上边界让低概率的tokens能够不被“压制”鼓励其输出但是增大下边界可能导致采样空间的崩溃。之所以增大上边界影响分析如下在最上面分析熵坍缩原因中因为模型更加“偏爱”输出高概率token导致坍缩问题那么在DAPO中直接鼓励模型去输出低概率token去弱化相关性增加上边界可以鼓励模型去输出低概率值。直观解释比如说在模型输出过程中 (|) 在输出若干个token之后比如说输出两个词好对应模型高概率值假设0.9、呀对应低概率值假设0.1在裁剪过程中低概率的token上限就是1.2那么对应就是1.2x0.10.012那么在后续不断优化过程中比如说10步得到结果就是 0.1×1.250.249 如果增加上边界那么对应 0.1×1.851.889之间差距还是明显随着后续步数迭代这些低概率token就会有“表现”机会。实际代码操作中以GRPO训练为例只需要在参数中指定GRPOConfig(epsilon_low0.1, epsilon_high0.3)动态温度调度按照论文[3]里描述在输出token中平均熵最高的词元通常起到“分叉”的作用从而决定推理方向而平均熵最低的词元则倾向于沿着既定路径执行推理步骤。高熵Token分岔点forking tokens 主要是逻辑连接词however, thus, because、假设词suppose, assume, given、修正词wait, unless。它们在推理路径上充当决策点。比如模型在说however时它可能在犹豫是继续当前思路还是转向反方观点。在说这些词的时候推理就可以有多个不同的发展方向所以模型在生成它们时很不确定因此这些token是High Entropy的。低熵Token主要是词缀如ing, ed、代码片段、数学表达式的固定部分如括号、等号。这些表述是机械性的、高度可预测的。因此解决熵坍缩问题里面就可以直接对于高熵token用较高的temperature去进行采样鼓励模型去输出这些高熵token除此之外在论文里面还做了一个额外实验只在高熵选择20%的高熵tokentoken上计算policy gradient对于低熵的token梯度直接丢弃最后得到优化效果发现丢弃token效果比使用全部token的效果要好。实际代码操作中以GRPO训练为例只需要在参数中指定GRPOConfig(top_entropy_quantile0.2)即可2/8法则实现丢弃部分token。参数具体解释top_entropy_quantile浮点数可选默认为 1.0来自超越 80/20 规则的 ρ 参数。在策略损失项中只保留每个序列位置上的代币概率分布熵的 top-ρ 量化值从而改善结果。范围 [0.0-1.0]。0.0的值会屏蔽除最高熵标记外的所有标记1.0 会保留所有标记。如果与 mask_truncated_completionsTrue 一起使用则只考虑来自非截断序列的标记。奖励坍缩奖励坍缩reward collapse比如说在GRPO优化过程中在多奖励设置下GRPO的group-wise normalization组内归一化会把不同奖励组合压缩成几乎相同的advantage优势值导致训练信号分辨率大幅下降。简单来说当多个奖励信号被组合后它们的相对差异被抹平了模型无法有效区分哪些行为是真正更好的。这就像把不同颜色的颜料混合在一起最终只剩下一种模糊的灰色导致训练信号丢失。比如说对于prompt产生的4组回答我需要分别取评估回答格式是否正确、回答内容是否正确得到A11B10C01D00按照GRPO中计算有优势值方法−mean(1,...,)std(1,...,) 在对BC计算优势值发现两部分优势值是相等的但是实际上B回答正确格式错误而C格式正确回答错误最后优势值只会告诉模型两部分相同在奖励曲线上一般是先去上升后续出现断崖下降。解决措施GDPO在论文[4]里面先对每个奖励分量独立组内标准化得到每个分量的 normalized scalar然后加权求和这些 normalized 值 → 最终 ^GDPO比如说在下面例子中比如说在上面计算中在GRPO例子AD优势幅度完全对称只是正负相反模型很难学到“正确性比格式更重要”的信号。在GRPO权重21中A 和 D 的差距被极大放大2.683 vs -2.683幅度翻倍。模型能更强烈地学习到“优先追求高正确性即使牺牲一些格式”而 GRPO 中这个倾向非常弱。# line 1254 in NVlabs/GDPO/trl-GDPO/trl-0.18.0-gdpo/trl/trainer/grpo_trainer.py# Gather the reward per function: this part is crucial, because the rewards are normalized per group and the# completions may be distributed across processesrewards_per_func gather(rewards_per_func)rewards (rewards_per_func * self.reward_weights.to(device).unsqueeze(0)).nansum(dim1)# Compute grouped-wise rewardsmean_grouped_rewards rewards.view(-1, self.num_generations).mean(dim1)std_grouped_rewards rewards.view(-1, self.num_generations).std(dim1)is_std_zero torch.isclose(std_grouped_rewards, torch.zeros_like(std_grouped_rewards))# Normalize the rewards to compute the advantagesmean_grouped_rewards mean_grouped_rewards.repeat_interleave(self.num_generations, dim0)std_grouped_rewards std_grouped_rewards.repeat_interleave(self.num_generations, dim0)advantages rewards - mean_grouped_rewardsif self.scale_rewards:advantages advantages / (std_grouped_rewards 1e-4)

更多文章