PPO 的信任区域一视同仁,可句子根本不是"一视同仁"长出来的
一个困扰了我很久的直觉:强化学习里我们给每个 token 套一个统一的"别跑太远"的约束,可问题是——自回归生成里,第 3 个 token 跑偏和第 3000 个 token 跑偏,后果完全不是一个量级。这篇论文终于把这件事讲透了,还给了一个我觉得"对,就该这么干"的解法。
🎯 核心摘要
RLVR(可验证奖励的强化学习)现在已经是提升大模型推理能力的标配了。但所有 PPO 系的信任区域机制——不管是经典的 clip,还是后来基于散度的 mask——都有一个共同的"懒惰假设":对序列里的每一个 token,用同一把尺子去量它有没有跑偏。
这篇来自腾讯混元的论文(CPPO)抓住的就是这个假设的两个裂缝。第一,自回归生成是有方向性的,早期 token 的偏差会沿着后续生成不断复利放大,统一阈值等于"早期管太松、后期管太死"。第二,孤立地看单个 token 的散度,完全无视了前缀已经漂了多远——前缀都快飘到外太空了,你还给它跟开头一样的探索额度,这不合理。
CPPO 的解法是两个耦合的机制:位置加权阈值(越靠前管得越严,越靠后越放松)和累积前缀预算(动态记账,前面漂多了后面就收紧)。效果上,在 Qwen3 全系列(1.7B 到 30B-A3B)上 AIME 平均分都拿了第一,最大一档在 30B-A3B-Base 上比次优方法高了 5.56 个点,而且在别的方法训崩的地方它还稳得住。
一句话评价:这不是又一个调参 trick,背后有一套从有限时域策略改进界推出来的理论,把"token 该被约束多少"和"它在序列里的位置 + 历史漂移"绑在了一起。我觉得是今年 RL 训练这块值得细读的工作之一。
arXiv:https://arxiv.org/abs/2606.10968 | 项目主页:https://hunyuan-cppo.github.io
📖 先说说我为什么觉得这个问题真实存在
调过 RL 训练的人应该都有体会:PPO 的 clip 也好,GRPO 的 ratio 约束也好,本质都是在说一句话——"新策略别离采样策略太远"。具体到实现,就是对每个 token 算一个似然比 \(\rho_t\),超过某个阈值就 clip 掉或者 mask 掉,不让它贡献梯度。
这套机制有个很隐蔽的前提:每个 token 是独立看待的。 第 t 个 token 跑偏多少,就只看它自己那一下,跟它在句子里排第几、跟前面已经偏了多少,统统无关。
但你想想看,语言模型是自回归生成的。第 t 步的状态 \(s_t = (x, y_{<t})\) 是由前缀定义的。开头一个 token 偏了,它会改变后面所有 token 的条件分布,这个偏差是会沿着序列复利的。一个在第 5 个位置的偏差,和一个在第 2000 个位置的偏差,对最终整句话分布的扰动完全不在一个量级。
说实话,我第一次意识到这件事,是在调一个长 CoT 的模型时——同样的 KL 约束,训练后期生成质量莫名其妙地崩,但 reward 还在涨。当时归因为"reward hacking",现在回头看,很可能是统一阈值在后期把该有的探索给掐死了,同时又没在早期把该管的偏差管住。
这篇论文把我那个模糊的直觉拆成了两个清清楚楚的缺陷。
缺陷一:均匀阈值无视自回归不对称性。 早期 token 是"关键分支点",影响持续最久;后期 token 下游影响最小。可统一阈值对它们一视同仁,结果就是早期偏差管不住(under-regulate),后期探索又被勒太紧(over-constrain)。
缺陷二:孤立评估 token 散度,无视累积前缀漂移。 在第 t 步,如果前面的 token 已经一点一点把前缀带偏了,模型实际上是在一个高度 off-policy 的状态下生成。这时候当前 token 再偏一点,携带的是"复合风险"。但均匀阈值才不管你前缀漂了多远,照样给你跟开头一样的额度。
这两个缺陷,归根到底是一个词:position-agnostic(位置无关)。
🧠 理论地基:先把"偏差到底怎么传播"算清楚
这篇论文我最欣赏的地方,是它没有上来就拍脑袋设计机制,而是先老老实实推了一个有限时域的性能差异恒等式。
定义 token 级似然比和它的连乘:
然后有这么一个恒等式(论文 Lemma 2):
左边是新旧策略的真实性能差,右边第一项 \(L'_{\mu}(\pi)\) 是我们实际在优化的替代目标,第二项 \(\Delta(\mu,\pi)\) 是残差——也就是"替代目标和真实目标之间的偏差"。关键就在这个残差的结构:
注意那个 \((1-\rho_{t+1:T})\) 项——它是从 t+1 到序列结尾的所有 token 似然比的连乘。这就是数学上"早期偏差会被后续整个 suffix 放大"的来源。
顺着这个恒等式往下推,作者得到了残差的一个上界(Equation 4):
这里 \(u_t\) 大致对应位置 t 的 token 偏差,而误差传播系数 \(\lambda_t\) 随剩余时域 \((T-t)\) 线性增长。
这就是关键。
同样大小的 token 偏差 \(u_t\),放在越靠前的位置(\(T-t\) 越大),对残差的贡献就越大。理论第一次明确告诉你:早期 token 该被更严地约束,因为它的影响要拖很久;后期 token 可以松一松。 而这恰恰是均匀阈值做不到的。
🏗️ CPPO 的两个机制:把理论翻译成 mask 规则
理解了上面的地基,CPPO 的设计就顺理成章了。先看这张总览图,它把 PPO、DPPO、CPPO 三种 token 级 mask 规则的差异并排放在一起,一目了然。

图1:三种方法的 token 级 mask 规则对比。统一的目标函数都是 \(\mathcal{L}=\mathbb{E}[\sum_t M_t\rho_t\hat{A}_t]\),区别全在那个指示器 \(I_t\) 上。PPO 看的是似然比本身 \(|\rho_t-1|\leq\epsilon\);DPPO 换成了 token 级散度的均匀阈值 \(D_t\leq\delta\);而 CPPO 的 \(I_t\) 多了两块——左边 \(w_t D_t\leq\delta\) 是位置加权,右边那个分式 \(\frac{\sum_{j\le t}w_j D_j}{\sum_{j\le t}w_j}\leq\delta_b\) 是累积前缀预算。两个条件要同时满足,token 才被保留。
机制一:位置加权阈值
既然理论说早期该严、后期该松,那就给阈值乘一个随位置线性递减的权重。权重调度(Equation 9):
开头 \(w_1=1\),结尾 \(w_T=w_{\min}\)。等价地看,这相当于给每个位置一个位置相关的 token 级阈值 \(D_t\leq\delta/w_t\)——开头是 \(\delta\),到结尾放松到 \(\delta/w_{\min}\)。
一句话通俗解释:越靠句子开头,越不准乱跑;越靠结尾,越允许你放开探索。 这跟理论里 \(\lambda_t\) 随 \((T-t)\) 增长完全对应上了。论文还证明了这个线性调度满足 Theorem 1 的单调性条件(\((T-t)/w_t\) 关于 t 非增),不是随便设的。
机制二:累积前缀预算
光有位置权重还不够,它没解决"前缀已经漂了多远"这个问题。第二个机制是动态记账。
定义前缀加权散度的累积量:
然后给当前 token 的有效阈值(Equation 8):
这个 min 的意思是:当前 token 能用的额度,是"固定阈值 \(\delta\)"和"前缀预算还剩多少"两者取小。前缀如果之前一直很克制(\(S_{t-1}\) 小),预算就宽裕,当前 token 可以正常用 \(\delta\);可一旦前缀已经累积偏了不少(\(S_{t-1}\) 逼近甚至超过 \(\delta_b W_{t-1}\)),第二项就会把有效阈值压下来,当前 token 就被收紧。
这张图把这个动态过程画得特别清楚,我看完才真正理解两个机制是怎么协同的:

图3:累积前缀约束示意。底部灰条是模拟的加权偏差 \(w_t D_t\)。蓝色那根高条是被 token 级阈值 \(\delta\)(蓝线)直接挡掉的 token——它单点偏差太大。橙色那根是更隐蔽的情况:它没超过 token 级阈值,但因为前面前缀已经漂了不少,绿色的"有效阈值"被前缀预算压低了,于是它被前缀约束挡掉。注意绿线(有效阈值)在前期贴着 \(\delta\) 走,一旦前缀漂移累积起来就掉下去——这就是"前面漂多了,后面就该收紧"的可视化。
把两个机制合起来,完整的 CPPO mask(Equation 10)是:
第一个条件 \(\hat{A}_t(\rho_t-1)\leq 0\) 是 PPO 的老传统——如果更新方向是"降低坏动作概率/提升好动作概率",那放行;否则才看信任区域条件 \(I_t\)。优势 \(\hat{A}_t\) 用的是 GRPO 的组相对优势。
这套设计的理论回报
费这么大劲,理论上换来什么?Theorem 1 给出 CPPO 的策略改进界:
跟均匀阈值的残差常数比一比(Corollary 6/7):均匀阈值情况下比值是 \(\delta_b/\delta\),只要 \(\delta_b<\delta\) CPPO 的界就更紧;位置相关实现下比值是 \(\delta_b/(\delta w_{\min})\),只要 \(\delta_b<\delta w_{\min}\) 就更紧。更紧的界意味着替代目标和真实目标贴得更近,优化方向更可信。 这是它比 DPPO 稳的理论根源。
🧪 实验:从 1.7B 到 30B-A3B,AIME 全线第一
实验设置先交代清楚,免得被"刷榜"误导。训练数据是 DAPO-Math-17k(约 17k 条可验证的数学推理 prompt),框架基于 verl 的 GRPO/DAPO rollout 栈。评估覆盖 Qwen3 的四个配置:1.7B-Base、1.7B(post-trained)、8B-Base、30B-A3B-Base。验证指标是 AIME24/25/26 上的 Avg@16,主分数取三者非加权平均。
这里我得先说一句客观的:这篇论文主实验只用了 AIME,没有 MATH、GPQA 这些。 AIME 是高难度数学竞赛题,用它当主战场是合理的(RLVR 本来就最适合可验证的数学题),但只有一个 benchmark 家族,泛化性的话语权会弱一些,这点要心里有数。
主实验(Table 1,数值为 AIME24/25/26 Avg@16,越高越好):
| 方法 | 1.7B | 1.7B-Base | 8B-Base | 30B-A3B-Base |
|---|---|---|---|---|
| GRPO | 27.91 | 8.89 | 23.96 | 38.19 |
| MinPRO | 27.71 | 11.04 | 29.72 | 48.12 |
| CISPO | 28.82 | 11.87 | 29.58 | collapse(崩溃) |
| DPPO | 28.19 | 10.90 | 28.89 | 49.23 |
| TRM-Max | 25.21 | 9.72 | 26.73 | 20.27 |
| TRM-Avg | 26.87 | 11.70 | 27.98 | 48.96 |
| CPPO(本文) | 31.88 | 12.78 | 31.11 | 54.79 |
四个配置全部第一。相对次优方法的绝对提升分别是 3.06、0.91、1.39、5.56 个点。
我特别想拎出来讲 30B-A3B-Base 这一列。
这是唯一一个用 16k rollout 长度、16 个 rollout 的配置——序列越长,"剩余时域放大效应"就越明显,正好是 CPPO 理论上最该发威的场景。结果也对得上:CPPO 拿到 54.79,比次优的 DPPO(49.23)高了整整 5.56 个点。更说明问题的是稳定性——CISPO 在这一档直接训崩(collapse),TRM-Max 退化到 20.27(比 GRPO 还差一大截),而 CPPO 稳稳地训完并拿到最高分。
如果只跟 DPPO 比(这是受控最严格的对比,因为 DPPO 和 CPPO 共享 Top-K reduced-TV 散度和同样的 per-model 阈值尺度,唯一区别就是 DPPO 用均匀阈值、CPPO 用加权 + 前缀约束),四个配置的提升是 3.69、1.88、2.22、5.56 个点。这个对比我觉得最有说服力——把其他变量都控住,纯看"位置感知 + 前缀预算"这两个机制带来的增量。
下面这张三个 Base 模型的训练曲线,也能看出 CPPO 不只是终点分高,整个训练过程也更平稳:

图4:Qwen3-1.7B-Base、8B-Base、30B-A3B-Base 三个配置上的验证 AIME24/25/26 Avg@16 训练曲线。CPPO 不仅收敛到更高的分数,曲线也更平滑、波动更小,尤其在 30B-A3B-Base 上其他方法出现明显震荡或崩溃时,它依然稳定爬升。
🔬 消融:两个机制到底谁在出力?
消融做得挺扎实,分别在 Qwen3-1.7B 和 1.7B-Base 上跑,baseline 是配置严格对齐的 DPPO。

图5:Qwen3-1.7B 上的三组消融。左:单机制消融,去掉位置权重(\(w_t\equiv 1\) 只留前缀约束)和去掉前缀预算(只留 \(w_t D_t\leq\delta\))两个变体都比 DPPO 好,但都不如完整 CPPO;中:位置权重排序,把同一组阈值随机打乱重分配到各位置(shuffled)后性能下降,证明增益来自自回归的位置顺序而非阈值的异质性本身;右:硬 mask vs 软门控,软变体(按 SAPO 方式在边界附近衰减梯度)与硬 mask 表现相当,于是默认用硬 mask。
这组消融我觉得最有价值的是中间那个 shuffled 实验。它回答了一个尖锐的质疑:你的增益到底是来自"早严后松"这个有方向的调度,还是仅仅因为阈值不再均匀(有了异质性)? 答案很干净——把同样的阈值集合随机打乱到各个位置,效果就掉下来了。所以重点不是"阈值不一样",而是"阈值得按自回归的方向来排"。这一刀切得很准,直接堵住了"异质性本身就够了"的反驳。

图6:Qwen3-1.7B-Base 上的三组鲁棒性消融。左:超参敏感性,围绕默认 \((\delta_b, w_{\min})=(0.02, 0.8)\) 扫描,邻近设置都接近默认且高于 DPPO,说明增益不依赖某个精调的工作点;中:KL vs TV 散度,换成 KL 度量(用 TRM 阈值 \(\delta=0.1, \delta_b=0.002\))依然优于 DPPO,而对照的 TRM Max/Avg 只能追平 DPPO,反证增益来自前缀预算而不是阈值本身;右:Binary vs Top-K 近似,把 Top-K 换成 Binary-TV 分区,两者验证分数相近且都优于 DPPO,说明对散度近似的粒度也鲁棒。
这组的潜台词是:CPPO 的增益不是某个散度度量、某个近似粒度、某个魔法超参带来的偶然,换 KL、换 Binary 近似、扫超参,前缀预算这条主线始终在出力。这种"消到底"的态度,比单纯堆几个高分数让我更信。
💡 我的判断
先说亮点。
理论和方法咬得很紧,不是先有 trick 再补理论。 从有限时域性能差异恒等式出发,残差里那个 \((1-\rho_{t+1:T})\) 自然导出"早期偏差被 suffix 放大",再推出 \(\lambda_t\propto(T-t)\),最后落地成位置加权阈值——整条链路是通的。这种"理论先行"的工作在 RL for LLM 这个略显浮躁的领域里,挺难得。
问题抓得真实。 position-agnostic 这个痛点不是论文造出来的伪命题。任何调过长序列 RL 的人都隐约感觉到"统一约束不太对劲",但很少有人把它形式化成"自回归不对称 + 累积前缀漂移"两个可操作的维度。光是把问题讲清楚,这篇论文就已经值回票价。
30B-A3B 那个 5.56 个点 + 别人训崩它不崩,是真能打的证据。 序列越长它优势越大,这跟理论预测方向一致,不是孤立的高分。
再说我的保留意见。
主实验只有 AIME 一个 benchmark 家族。 虽然论文附录提到 per-benchmark 分解,但主战场单一,泛化性结论要打个折。数学推理上 work,不代表代码、通用推理上也是同样幅度。我会想看到 MATH、GPQA 甚至代码任务上的结果再下定论。
两个机制引入了新超参 \(w_{\min}\) 和 \(\delta_b\)。 论文说对超参鲁棒(消融也支持这点),但 Base 模型的 \(\delta_b\) 用了自适应策略(取每序列散度的 top-10% 分位数并钳制在某区间),这套自适应逻辑本身就是额外的工程复杂度。落地时这块要留意。
工程启发:如果你也在做长 CoT 或长序列的 RLVR,发现训练后期不稳、或者 reward 涨但质量降,CPPO 这个"位置感知 + 前缀记账"的思路值得试。哪怕不用完整版,单独加一个随位置递减的阈值权重(机制一),实现成本极低,从消融看单机制就已经稳定优于均匀阈值的 DPPO 了。这是个性价比很高的切入点。
📝 一句话收尾
PPO 的信任区域一视同仁,可句子从来不是一视同仁长出来的——开头的字定方向,结尾的字做收束。CPPO 做的事,说到底就是让"约束的松紧"跟着"token 在序列里的位置和它背后已经漂了多远"一起走。这个方向我觉得会越来越重要,尤其是在序列越来越长的今天。
论文:https://arxiv.org/abs/2606.10968
觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我