rt
重要性采样比率
当前策略对这个 token 的概率 ÷ 采样时旧策略的概率。
rt(θ) = πθ(ot | q, o<t) / πθold(ot | q, o<t)。r=1 表示策略没变。clip 的刻度就画在这条比率轴上:允许偏离 1 的幅度是 ε。
Hover 看完整定义
RL POST-TRAINING · DAPO · ENTROPY COLLAPSE
把裁剪上界从 0.2 抬到 0.28——一个数背后的结构性不对称
用 GRPO 复现 DeepSeek-R1 时,naive 实现会在训练中熵快速坍缩:同一道题采出的一组回答越来越像,advantage 趋零,梯度信号自我灭绝。DAPO 的第一味药 Clip-Higher 只改动一个数。本报告拆解这条失效链:PPO-Clip 的比率裁剪在概率轴上天然不对称,被上界反复按住的恰恰是承载探索的低概率 token。
本报告为博客正文的配套交互版 · 正文:/posts/dapo-clip-higher-entropy-collapse/(线上 njx-njx.github.io)
证据分级:论文一手 > 书/代码一手 > 二手讲解(回对过原文)> 推算/定性示意 [已标注] · 图内数字可点击下钻
§0 · 关键结论
差距不是慢慢拉开的。训练中 actor 模型的熵快速下降,同一道题采出来的一组回答越来越像,最后几乎一模一样——采样失去多样性,组内奖励趋同,GRPO 的 advantage 全部趋近于零,梯度信号自我灭绝。训练还在跑,但已经学不到东西了。
2025 年初,很多团队都在做同一件事:用 GRPO 复现 DeepSeek-R1 的训练。DAPO 论文(arXiv:2503.14476)报告了他们自己的起点——用 Qwen2.5-32B base model 跑 naive GRPO,AIME 2024 只拿到 30 分,而 DeepSeek 的 R1-Zero-Qwen-32B 是 47 分。论文把这种死法叫作 entropy collapse(熵坍缩)。
DAPO 给出的第一味药叫 Clip-Higher:把 PPO-Clip 的裁剪上界 ε 从默认的 0.2 抬到 0.28,下界保持 0.2 不动。改动只有一个数。为什么这一个数能拦住坍缩?答案藏在 PPO-Clip 一个很少被摊开讲的结构性质里:裁剪以"比率"为刻度,但学习效果发生在"概率"轴上。
下面这张图是全篇的形状预告:naive GRPO 的熵一路塌向地板,应用 Clip-Higher 后熵曲线回升、AIME 准确率同步上升。
整篇报告都绕着一个"熵"字转,先把它定义死。这里的熵就是信息论里那个熵,作用对象是模型每生成一个 token 时输出的、覆盖整个词表的概率分布:
H = −Σx∈词表 p(x)·log p(x)
分布越平(很多 token 概率差不多),熵越高,模型"拿不定主意";分布越尖(一个 token 占 0.99,其余瓜分 0.01),熵越低,模型"很确定"。DAPO 论文监控的"actor 模型的熵",就是 rollout 生成过程中这些逐步分布熵的平均值。下面用 3 个 token 的玩具词表把账算一遍——熵就是"采样多样性"的数学度量。
为什么熵是 RL 训练的命门:GRPO 的全部训练信号来自组内奖励方差,而方差来自采样多样性。熵高,同一道题采 16 条回答各不相同,有对有错,advantage 非零;熵坍缩,16 条趋同,奖励全同,advantage 全零。
两个边界,别理解过头。一,熵不是越高越好——熵过高对应 gibberish、重复词等失控模式,论文只说熵要维持在"合适区间",没给区间怎么定(§7 未决问题 ①)。二,别把熵和采样温度混为一谈:熵是分布的内在形状,温度是你怎么从分布里取;rollout 时用 temperature 1.0 这类参数才把熵兑现成多样性。Clip-Higher 影响的是前者——防止训练本身把分布越压越尖。
§1 · 机制拆解
PPO/GRPO 的目标函数,逐 token 看是下面这行式子。min 的行为取决于 advantage 的符号——这是理解一切的钥匙。
J(θ) = E [ min( rt(θ)·Ât , clip( rt(θ), 1−ε, 1+ε )·Ât ) ]
重要性采样比率
当前策略对这个 token 的概率 ÷ 采样时旧策略的概率。
rt(θ) = πθ(ot | q, o<t) / πθold(ot | q, o<t)。r=1 表示策略没变。clip 的刻度就画在这条比率轴上:允许偏离 1 的幅度是 ε。
Hover 看完整定义
ADVANTAGE · 组内归一化
这个 token 比平均水平好多少;符号决定 min 选中哪一支。
GRPO 里它是组内归一化算出来的:Â = (R − mean{R}) / std{R}。同一道题采一组回答,奖励在组内去均值、除标准差。这决定了后面坍缩闭环的致命性:组内奖励一旦趋同,std→0,所有 advantage 趋零。
Hover 看完整定义
裁剪范围 · 默认 0.2
比率允许偏离 1 的幅度,绝大多数实现的默认值是 0.2。
这个默认值来自 2017 年 PPO 原论文的 Atari 和机器人控制实验——一个连续控制场景的历史遗留,被原样搬进了长 CoT 语言模型 RL。Clip-Higher 做的事,就是把这个隐式默认值拆成面向推理任务的显式旋钮。
Hover 看完整定义
PPO:靠一个学出来的价值函数(critic),用 GAE 逐 token 估计:
Ât = Σl (γλ)l δt+l, δt = rt + γV(st+1) − V(st)
critic 准,advantage 方差就低;critic 歪,整个训练跟着歪。GRPO:不要 critic,对同一道题采 G 条回答,拿组内奖励做归一化——本质是用组内均值当 baseline,这是 REINFORCE 的方差缩减技巧,只不过基线不用学,直接拿同组样本算。
GRPO 这条路有三个直接后果,后面都会用到:
 > 0(好 token,要强化):当 r > 1+ε,clipped 支被选中,目标函数变成常数,梯度为零——每步最多把一个 token 的概率抬到采样时的 1+ε 倍。 < 0(坏 token,要压制):对称地,每步最多压到采样时的 1−ε 倍。下面这张图把两段平台画了出来,拖动滑杆可以看到 Clip-Higher 抬上界时平台怎么移动。
机制图读法:值是结果,梯度才是动作。clip 对每种符号的 advantage 都是单边的。看 Â>0 且 r<1−ε 的情形:min 选中的仍然是 r·Â(因为它更小),目标函数的值虽然小,但梯度是活的——dJ/dπ>0,优化器照样以全额斜率 Â 把这个好 token 的概率往回拉。值小不等于抑制。min 的作用是撤掉激励,从来不是施加反向激励。所以完整结构是:好 token 只封顶上涨激励(右侧平台),坏 token 只封顶压制激励(左侧平台),反方向的纠偏永远满梯度放行。
clip 不是一直在工作。RLHF Book 第 6 章特别提醒:只有当比率真的出界、且 min 恰好选中 clipped 支时,梯度才被掐断。裁剪分数(clip fraction)就是监控这件事的指标。记住这一点,§4 的两个前提会用上。
§2 · 结构性不对称
同样容忍 20% 的比率变化,高概率 token 拿到的是概率轴上接近 0.2 的空间,低概率 token 拿到的是 0.002——两种 token 的可动范围差了快一百倍。
做一道算术题。设 ε=0.2,Â>0,看两个 token:一个 πold=0.9 的 token,每步概率上界是 0.9×1.2=1.08——概率不可能超过 1,所以它实际上不受限,单步就能从 0.9 推到 0.99 以上。另一个 πold=0.01 的 token,每步上界是 0.01×1.2=0.012,绝对增量 0.002,几乎原地不动。
而 RL 里的"探索"恰恰由低概率 token 承载——那些当前策略不太倾向选、但可能通向新解法的 token。DAPO 的实测印证了这一点:训练中真正被上界裁住的 token,平均概率小于 0.2(论文图 3a)。换句话说,被裁剪机制反复按住头的,正是探索 token;exploitation token 几乎从不被约束。
"一轮"指一个"采样→更新"循环:采完样 πold 冻结成快照,之后在这批数据上跑多次梯度更新(DAPO 是 16 次,论文 §4.1),这期间 πθ 逐渐偏离快照,r 从 1 开始漂移;一旦 r 越过 1+ε,这个 token 的梯度就断了,本轮剩下的更新不再推它。所以上面"上界 0.012"的准确含义是激励消失点,不是硬钳制——步长迈大了概率可能一步冲过去,只是冲过去之后激励归零,没人继续推,也没人拉回来。
而预算是每轮刷新的:下一轮重新采样,πold 更新,r 重置为 1,又拿到一份 ×1.2 预算。所以低概率 token 的成长路线是乘法的:0.01 → 0.012 → 0.0144 → ⋯,比率上是指数增长,前半段绝对值却爬得非常慢;高概率 token 一两轮就顶到 1.0 饱和。压制方向对称但更狠:Â<0 时每轮最多砍到 ×0.8,五轮后只剩起点的 0.33——下行的乘法衰减比上行的乘法增长快得多。
裁剪以"比率"为刻度,但学习效果发生在"概率"轴上。
— 博客正文 · §对称裁剪,不对称的效果
语境对称 ε 在比率轴上是公平的一把尺,映射到概率轴后变成对高概率 token 松、对低概率 token 紧。 为何重要长 CoT 场景把这个偏差放大了:一条推理链几千个 token,关键转折点上的探索 token 每步只能挪 0.2%,还没等它长起来,分布其他部分已经进一步尖锐化了。
§3 · 失效链
把微观偏差放进 GRPO 的训练动力学里,就得到一条完整的失效链。它不是"一个监控指标不好看",而是训练在烧掉自己的燃料。
探索 token 概率长不起来,高概率 token 越长越高,分布变尖,熵下降;分布变尖意味着同一道题采一组(比如 16 条)回答越来越像;GRPO 的 advantage 是组内归一化算的,组内奖励趋同时 std→0,所有 advantage 趋近于零,梯度信号消失;模型失去改进方向,只能继续强化已经确定的模式——回到第一步。RLVR 场景里这个循环尤其致命:全部训练信号就是组内奖励的方差,奖励是规则的 0/1,没有奖励模型提供连续信号。多样性一旦枯竭,信号源就断了。
这也解释了 DAPO 四个技巧的顺序感:Clip-Higher 防坍缩,Dynamic Sampling(过滤掉全对或全错的 prompt)是在坍缩已经造成零梯度组时止血。一个治本,一个治标,论文把 Clip-Higher 放在第一节。
§4 · 处方与证据
它不是"把探索空间的门开大一点"这种模糊操作,而是一次精确的不对称手术:上涨方向松绑,下跌方向保持警惕。
clip( rt(θ), 1−εlow, 1+εhigh ), εlow=0.2, εhigh=0.28
上界从 1.2 抬到 1.28,低概率探索 token 的单步上涨空间从 +20% 变成 +28%,配合多步更新,积累效果可观。值得问的是:为什么不动下界?论文说得很直白——εlow 如果放宽(比如允许压到 0.6 倍),负 advantage 的梯度会以同样的比率逻辑把低概率 token 直接压到接近 0,采样空间里这些 token 等于被删掉了,坍缩只会来得更快。压制方向的裁剪反而要收紧,不能放松。
效果上,论文图 2 显示应用 Clip-Higher 后熵曲线明显回升、AIME 准确率同步上升。但要诚实地说:消融链上 Clip-Higher 单项只贡献了 +2 分,不是链上最大的(Overlong Filtering +6,最后加 Dynamic Sampling +8)。它的角色不在加分——它修的是"训练能不能继续 scale"的失速点。熵塌了,后面三个技巧全都无从发挥。
前提一:clip 只在 off-policy 时才激活。RLHF Book 第 6 章指出,语言模型的 RL 实践里很多算法每个 batch 只跑一步梯度更新——此时比率恒等于 1,clip 永远不触发,真正起正则作用的是 KL 惩罚。而 DAPO 每个 rollout 跑 16 个梯度步(mini-batch 512,论文 §4.1),策略在 batch 内多次更新,比率才会偏离 1,clip 才真的开始工作。所以 Clip-Higher 这个旋钮的价值,和训练的 off-policy 程度是耦合的:严格单步 on-policy 训练里这个旋钮根本不存在;反过来,异步 RL(rollout 和训练重叠、样本天然 off-policy)才是它发挥作用的土壤。
前提二:DAPO 同时去掉了 KL 项。先把 KL 惩罚本身说清楚。KL 散度衡量当前策略 πθ 和参考策略 πref(通常是冻结的 SFT/base 模型)差多远:
DKL(πθ ‖ πref) = Ex∼π_θ [ log πθ(x) − log πref(x) ]
经典 RLHF 把它作为惩罚项放进目标函数(−β·DKL),动机有二:一是防 reward hacking——奖励模型是有漏洞的代理,策略跑得够偏就能找到 RM 没见过、瞎打高分的输出,KL 把搜索拴在 RM 见过的分布范围内;二是保住初始模型的语言能力,防止格式崩坏。工程代价是显存里要常驻一个冻结参考模型,每个 token 算两边的前向。
DAPO 把它整个去掉了(β=0,参考模型不用加载),论文 §2.3 的理由:KL 惩罚的初衷是"对齐但不要偏离初始模型太远",而长 CoT 训练的目的恰恰是大幅偏离初始模型——base 模型本来不会写长思维链、不会自我反思,这些行为全靠 RL 重塑分布,拴着锚等于不让船开。还有一个没明说的配套条件:RLVR 的奖励是规则判定,没有 RM 可以 hack,KL 防 hacking 的那一半动机直接消失。注意去 KL 和抬上界方向一致——都在给探索松绑:KL 惩罚是逐 token 把分布往参考模型拉,去掉它,策略才敢往新区域走。论文没有明说两者是协同设计,这是作者的推断;但从"防坍缩"的目标看,它们确实是同一战壕的。
把两个前提合起来看,能看出 DAPO 的一次隐含换挡:经典配置里防漂移靠 KL,DAPO 去掉 KL 后只剩 clip——信任区域的角色从一个锚换到了另一个锚。锚拆了不是没有代价:训练失控时没有任何东西把模型拉回来,所以 DAPO 才那么依赖监控仪表盘(熵、长度、平均概率),也才需要 clip、动态采样这些替代性稳定器。
经典配置 · KL 惩罚
绝对锚
不许离初始模型太远。逐 token 把分布往冻结的参考模型拉;代价是参考模型常驻显存、每个 token 算两边前向。
DAPO · 只剩 clip
相对锚
每步不许离上一步太远,但允许持续走远。失控时没有东西把模型拉回来——靠监控仪表盘(熵、长度、平均概率)和替代稳定器(clip、动态采样)兜住。
§5 · 实现层对照
细节基本对齐。DAPO 的非对称裁剪已经是生产代码里的一等公民,但默认行为仍是经典 PPO。
| 实现 | 关键配置 | 与论文的关系 |
|---|---|---|
| rlhf-book DAPOLoss · 教学实现 |
clip_eps_lo=0.2 / clip_eps_hi=0.28 token-level 归一化 · 不加 KL |
与论文一致;损失求和后除以全 batch 有效 token 总数,而非 GRPO 原来的逐序列平均再平均 |
| verl core_algos.py · 生产实现 |
clip_ratio_low / clip_ratio_high 未设置时回落对称 clip_ratio |
非对称裁剪是一等公民,默认仍是经典 PPO;另有 dual-clip clip_ratio_c=3.0,防负 advantage 样本比率爆炸,解决的是另一个方向的问题 |
| 行业佐证 CISPO / VAPO |
CISPO 允许非对称裁剪界 VAPO 沿用 clip-higher |
这个 insight 已不是 DAPO 独有,而是长 CoT RL 的工程共识 |
甄别案例:二手材料务必回对原文。中文课程 hands-on-modern-rl 在讲 Clip-Higher 时,说"0.8 的下限意味着低概率动作最多被降到 0.008,几乎被彻底压制",把下界的压制作用和上界的上涨空间混在一起讲,容易让读者以为改的是下界。论文的实际机制恰恰相反:改的是上界;下界保持 0.2,正是因为再放宽会把低概率 token 压死。该课程自声明 AI 协助生成、尚未全面审稿——这次回对就抓到了一处。
§6 · 补遗
读这篇很容易把 RLVR 和 GRPO 连着念,其实它们是两根正交的轴:一个回答"奖励从哪来",一个回答"拿到奖励后怎么更新模型"。
| 回答的问题 | 属于哪一层 | 同层的其他选项 | |
|---|---|---|---|
| RLVR | 奖励从哪来? | 奖励来源 / 训练范式 | 人类偏好(RLHF 原点)、学出来的奖励模型、可验证规则奖励 |
| GRPO | 拿到奖励后怎么更新模型? | 策略优化算法 | REINFORCE、PPO、DAPO、GSPO |
两者可以自由组合:RLVR + PPO 完全可以(VAPO 就是 value 路线跑可验证奖励);RM + GRPO 也成立(GRPO 出自 DeepSeekMath 时并不绑定规则奖励,组内归一化对任何标量奖励都适用)。RLVR + GRPO 之所以成为主流配方,是互相成就:RLVR 的规则奖励便宜、客观、不怕 reward hacking,但它是稀疏的 0/1 信号;GRPO 的组内归一化恰好适合 0/1——同一道题采一组,对错比例天然形成 baseline,不需要再训一个 critic 去估计"这条推理值多少分"。反过来,PPO 的 critic 在稀疏 0/1 奖励加几千 token 长序列上很难训准。
放回失效链里,两者的分工也清楚:RLVR 决定信号源有多脆(0/1 奖励只有全对、全错、有对有错三种形态,前两种直接零梯度),GRPO 决定信号依赖什么(组内奖励方差,也就是采样多样性)。DAPO 的四个技巧全是在 GRPO 这个算法层打补丁,没动 RLVR 的奖励来源;另一个方向的改进——给 RLVR 造更多可验证任务、把奖励做细到过程级(PRM)——那是在奖励范式层动刀子,和算法层的补丁是正交的两条路。
§7 · 判断与未决问题
判断。Clip-Higher 的本质,是把"探索节奏"从一个历史遗留的隐式默认值(ε=0.2,来自 2017 年连续控制场景)变成面向长 CoT 推理的显式旋钮。0.28 没有理论推导,是经验值,但它背后的诊断框架——比率裁剪在概率轴上的不对称——是有普适解释力的。以后看到任何"训练好好的突然熵崩了",先查被 clip 按住的 token 的概率分布,应该成为标准动作。