精读:CARM——把响应级掩码的判据从净位移换成双向漂移
只加一个绝对值,把序列级 off-policy 掩码的汇总分数从「带符号对数比的平均」换成「对数比绝对值的平均」,并给出频率—严重度联合预算。本专栏逐项对账后发现:代码侧 headline 里 68% 的增量来自唯一一列,而 checkpoint 正是按那一列挑的;两条方法的阈值网格只在两点重叠,headline 是各自取最好再比;失配由「一个 rollout 批切 128 次更新」的配置造出来,全文没有扫这个旋钮
1 论文概览
一句话总结:把「整条响应要不要参与这次更新」的判据,从「token 概率比的几何平均离 1 多远」换成「token 对数比绝对值的平均有多大」——只加了一个绝对值,就把一个会被正负抵消的净位移量,换成了一个双向漂移量。
核心问题:工业级 RL 后训练里,采样引擎与训练引擎不同、mini-batch 内策略连更新多次、actor 与 learner 之间有延迟,于是被优化的 与真正采样出这条响应的 早就不是同一个分布。PPO/GRPO 的 token 级裁剪只改变「单个 token 怎么贡献梯度」,并不回答「整条响应该不该参与」。序列级掩码回答后者:先给每条响应算一个汇总失配分数,再按阈值决定留或丢。真正的分歧在这个汇总分数怎么算。主流做法(DeepSeek-V3.2 的 off-policy sequence mask,本文称 GeoMean)取长度归一化几何平均,等价于把带符号的 token 对数比先平均再取绝对值。本文指出这一步会抵消:
“Its signed log-ratios can cancel across positions, concealing substantial bidirectional policy drift.” —— 摘要
一个 token 比是 10、下一个是 0.1,几何平均恰好是 1,而每个位置的实际概率都变了一个数量级。
主要贡献:
- 把「抵消」写成命题(Proposition 1):对任意 与 ,存在一条偶数长响应,其中每一个 token 比都在带 之外,而 。构造就是让比值在 与 之间交替。这不否定轨迹似然比 本身的正确性,否定的是「拿带符号聚合量做阈值」这件事。
- CARM 统计量:,先取绝对值再平均,等价于每个 token 贡献 ,上下对称、不可抵消。
- Proposition 2 的接受集包含关系:由三角不等式, 恒成立,故同阈值下 CARM 接受集是 GeoMean 接受集的子集——同阈值下 CARM 只会更严。
- Proposition 3 的频率—严重度联合预算:若 ,则 ,把「阈值」翻译成「有多少比例的 token 越界、越得多远」。
- 两个任务的实测:Qwen3.5-4B / 9B 上数学(DAPO Math 训练,AIME 2024/2025/2026 + BeyondAIME),Qwen3.5-9B 上代码(TACO 训练,TACO test / LiveCodeBench-v6 / HumanEval+ / MBPP+ 评测),对 Null、IcePop、TRM、GeoMean 四条基线。
2 方法详解
掩码挂在代理损失之外
设 。token 级代理损失仍是标准的不对称 PPO/GRPO:
响应级掩码 把它整体门控掉,损失按保留下来的 token 数归一化:
关键在于 是 stopgrad 的二值门:被拒的响应在这一步里不产生任何策略梯度,但采样它已经花掉的算力不会退回来。掩码与 token 级前向共用同一次当前策略的前向传播,阈值比较在优化器更新之前完成。
一行之差换了什么量
GeoMean:
CARM:
两者测的不是同一件事:前者是平均位移的模,后者是位移模的平均。对 reciprocal 变化( 与 )两者都对称,区别只在符号相反的漂移是否相消。论文给的实测例子(附录 C,一条 8,619 token 的真实响应):,,相差 9.79 倍:
“signed aggregation cancels 89.78% of the absolute log-ratio mass.” —— 附录 C
最大单 token 只占绝对对数比质量的 0.43%,说明这不是一两个极端 token 撑起来的,而是整条响应上的双向漂移。在 1,024 条未过滤响应上重放(、):两者都接受 160 条、都拒绝 668 条、GeoMean 单独接受 195 条、CARM 单独接受 1 条。19% 的响应被 GeoMean 放行、被 CARM 拦下——这个比例不小。
阈值到底保证了什么:代入 实算
Proposition 3 的证明不复杂:把 按越界与未越界拆开,越界项写成 或 ,丢掉非负的带内贡献,就得到 。取 后即 。
这一步的实质是马尔可夫不等式: 蕴含 , 那一项只是把超出边界的余量保留下来(证明的 Step 9 也给出丢掉它的纯频率版本)。推导是初等的,价值在于把阈值翻译成 token 级语言。
把论文自己的 operating point 代进去,看这个保证有多宽:
| 设定 | 带 的 上界 | 时的 上界 | 时的 上界 | |
|---|---|---|---|---|
| (4B 用档) | 0.0198 | 8.88% | 20.8% | 40.6% |
| (9B 最优档) | 0.0247 | 11.07% | 25.9% | 50.6% |
| (最松档) | 0.0392 | 17.58% | 41.1% | 80.4% |
在跑出最好数字的那一档,CARM 保证的是「最多 11% 的 token 落在 PPO 裁剪带之外、最多 26% 的 token 概率变化超过 10%」。而 PPO 裁剪本身已经让带外 token 的梯度归零——这个保证约束的那批 token,恰恰是被裁剪机制静默处理的那批。论文自己留了一句很诚实的话:
“This is a deterministic bound on the sampled-token ratios, not on the full conditional-policy KL divergence.” —— §3.4
所以「理论保证」这四个字的分量要打折:它给的是频率上界,不是更新幅度上界,且按马尔可夫不等式的性质,只在最坏情况下才紧。
与基线的区别
| 方法 | 作用层 | 判据 | 阈值语义 |
|---|---|---|---|
| PPO/GRPO 裁剪 | token | clip 到 | 单 token 贡献封顶,不决定整条去留 |
| IcePop | token | token 比区间 | 逐 token 过滤,比 PPO 带宽得多 |
| TRM | 序列(最坏位置) | 即拒 | 长程信任域,看单点最坏值 |
| GeoMean | 序列(聚合) | $\big | \frac1T\sum_t\log r_t\big |
| CARM | 序列(聚合) | $\frac1T\sum_t | \log r_t |
CARM 与 TRM 的分野值得记:TRM 只看最坏的一个 token(取 ),CARM 看平均;前者对单 token 尖峰敏感、对普遍小漂移迟钝,后者反过来。
3 实验结果
主表
数学(mean@16,%):
| 模型 | 方法 | AIME24 | AIME25 | AIME26 | BeyondAIME | 四集平均 |
|---|---|---|---|---|---|---|
| 4B | Null | 49.38 | 48.33 | 54.79 | 22.25 | 43.69 |
| 4B | IcePop | 47.08 | 40.83 | 40.42 | 19.31 | 36.91 |
| 4B | TRM | 66.67 | 55.21 | 65.00 | 32.31 | 54.80 |
| 4B | GeoMean | 72.50 | 64.38 | 70.62 | 38.88 | 61.59 |
| 4B | CARM | 77.08 | 64.38 | 69.79 | 42.56 | 63.45 |
| 9B | Null | 76.67 | 66.88 | 67.71 | 45.25 | 64.13 |
| 9B | IcePop | 70.42 | 59.58 | 66.67 | 34.94 | 57.90 |
| 9B | TRM | 78.33 | 67.08 | 76.46 | 45.81 | 66.92 |
| 9B | GeoMean | 80.42 | 66.67 | 75.00 | 47.06 | 67.29 |
| 9B | CARM | 82.08 | 71.04 | 79.38 | 49.19 | 70.42 |
摘要里的「up to 3.13」出自 9B 四集平均(70.42 − 67.29),4B 只有 +1.86。三年 AIME 平均上,4B 是 69.17 → 70.42(+1.25),9B 是 74.03 → 77.50(+3.47)。
代码(Qwen3.5-9B,pass@1,%):
| 方法 | TACO(1000) | LCB-v6(1054) | HumanEval+(164) | MBPP+(378) | 平均 |
|---|---|---|---|---|---|
| Null | 34.50 | 38.46 | 85.57 | 75.22 | 58.44 |
| IcePop | 45.87 | 43.36 | 92.68 | 79.81 | 65.43 |
| TRM | 36.60 | 44.97 | 87.80 | 76.72 | 61.52 |
| GeoMean | 46.03 | 44.50 | 92.28 | 78.31 | 65.28 |
| CARM | 46.70 | 51.20 | 94.11 | 81.22 | 68.31 |
逐列重算:headline 由一列撑住
摘要写「average pass@1 across four code benchmarks by 2.88 points over the strongest evaluated baseline」,最强基线按宏平均取 IcePop。但逐列取最强基线时,TACO 与 LCB 的最强是 GeoMean,HumanEval+ 与 MBPP+ 的最强是 IcePop,四个差是 +0.67 / +6.70 / +1.43 / +1.41,平均 +2.55,比 2.88 少 0.33。
按两样本比例检验算 z(分母取差值标准误,不是单个方法的标准差):
| 列 | 题数 | CARM − 该列最强基线 | z |
|---|---|---|---|
| TACO | 1000 | +0.67 | 0.30 |
| LiveCodeBench-v6 | 1054 | +6.70 | 3.09 |
| HumanEval+ | 164 | +1.43 | 0.52 |
| MBPP+ | 378 | +1.41 | 0.49 |
四列里只有一列越过 2,其余三列都不到 0.6。四个差值的和是 10.21,LCB 一列占 6.70,即 66%。而附录 D.3 写明,代码实验的 checkpoint 是按「LiveCodeBench-v6 validation pass@1 最高」挑的——挑模型的指标,正是贡献了 68% 增量的那一列。数学侧同理:迭代按三年 AIME 均值挑,而 AIME 就是数学 headline 的来源。
数学侧的 z 更粗:AIME 每年只有 30 题。若把 16 次采样当独立样本(最宽松口径),9B 四列 z 落在 0.66 / 1.33 / 1.09 / 1.21;若按「题」为独立单位(,最严格口径),单方法标准误就有 7.4pp,差值标准误 10.5pp,全部 z 低于 0.4。真实值在两者之间,取决于聚类内的相关系数。
阈值扫描:best-on-own-grid 与共享阈值
表 4 是全文最该读的一张表(三年 AIME 均值):
| 模型 | GeoMean 网格 | CARM 网格 |
|---|---|---|
| 4B | 1.0025: 69.03 / 1.005: 69.17 / 1.01: 66.74 / 1.02: 52.57 / 1.03: 52.43 | 1.02: 70.42 / 1.025: 69.24 / 1.03: 67.99 / 1.04: 66.81 |
| 9B | 1.0025: 71.67 / 1.005: 74.03 / 1.01: 69.65 / 1.02: 71.67 / 1.03: 69.86 | 1.02: 72.99 / 1.025: 77.50 / 1.03: 73.82 / 1.04: 74.17 |
两条网格只在 1.02、1.03 处重叠。按共享阈值比:9B 在 是 72.99 对 71.67(+1.32),在 是 73.82 对 69.86(+3.96);headline 的 +3.47 来自 CARM@1.025 对 GeoMean@1.005——两条方法各自在自己网格上取最好,再比最好。这是常见做法,读 headline 时要知道它是 best-on-own-grid。
这张表还给出两个更硬的事实:
- GeoMean 在 4B 上有悬崖: 从 1.005 松到 1.02,成绩从 69.17 掉到 52.57,只比 Null 的 50.83 高 1.74。同一段区间里 CARM 从 70.42 平滑降到 66.81。CARM 的网格极差 3.61,GeoMean 的网格极差 16.74。稳健性而不是最高分,才是 CARM 最实的卖点。
- 这个悬崖只在 4B 出现:9B 上 GeoMean 松到 1.02 / 1.03 仍有 71.67 / 69.86,没有崩。于是出现一个错位——抵消病态表现得最惨的模型(4B)恰恰是 CARM 余量最小的模型(+1.25),CARM 余量最大的模型(9B,+3.47)却是 GeoMean 根本没崩的模型。
消融与诊断
- 过滤率(§5.1):4B 上 GeoMean 平均掩码 55.65%、CARM 54.52%;9B 上 52.75%、52.32%。CARM 少过滤 0.43–1.13 个百分点、分数反而更高,于是「赢在过滤更多」被排除。两个数字的口径要分清:3.3 节那次 1,024 条重放里 CARM 拒了 84.3%、GeoMean 拒了 65.3%,差 19 个百分点——那是在未加门控的批次上,漂移本来就大;训练期加了门控之后漂移被压住,两队过滤率才收敛到 1 个百分点以内。
- 阈值预算差 4 倍:,CARM 的日志预算是 GeoMean 的近 4 倍,两队过滤率却几乎相同。这说明 的分布在量级上就比 大 4 倍左右(图 3 的配对差均值 0.0319 也印证)。CARM 不是「同一把尺子收紧了」,而是换了一把刻度不同的尺子,恰好与「这条响应有没有害」更相关。
- 优势条件(§5.2):标准掩码 75.63 对「只掩码负优势响应」60.28(9B,三年 AIME),差 15.35。这一条直接对着 DeepSeek-V3.2 只掩码负优势的部署规则。问题是 75.63 不在表 4 的任何一格上(表 4 的 9B CARM 是 72.99 / 77.50 / 73.82 / 74.17),消融的控制臂复现不出任何一个已报告的 operating point。
- 采样一致性(§5.3):best@16 与 worst@16 上 CARM 比 GeoMean 高 2.74 与 2.78。但 、 都是 分布的确定性函数, 时两者都退化为 mean@16;worst@16 是 ,几乎只由接近全对的那批题决定。这两条曲线是与 mean@16 同源的再表达,不算独立证据。
- 基线里有一条塌了:IcePop 在 4B 上三年 AIME 是 42.78,比 Null 的 50.83 低 8.05;9B 上 65.56,比 Null 的 70.42 低 4.86。一条已发表的 off-policy 方法在本设置里净亏,说明这套配置的失配形态相当特殊。
4 个人分析
亮点
- 诊断本身比方法更有价值。 Proposition 1 只用两行就说明白了一件工业界一直在含糊处理的事:几何平均掩码的阈值不能解释为「token 级偏离有多大」。这一条与模型、与任务无关,凡是用了带符号聚合掩码的训练栈都该回头查一遍。
- 改动成本几乎为零。 不需要额外模型、不需要额外前向(掩码与 token 代理共用同一次前向),只是把
abs()挪到求和里面。这种「一行换统计量」的设计最容易落地。 - 阈值有了解释而不是玄学。 频率—严重度预算把 与「多少比例的 token 越界、越多远」接上,工程上调阈值时终于有一个说得清的刻度。
- 稳健性证据是真的。 表 4 里 GeoMean 在 4B 上两个网格点崩到 52 分,CARM 四个点全在 66.81 以上。对要上线跑几百步的系统,网格极差 3.61 对 16.74 比最高分重要得多。
- 消融对准了真实的部署规则。 §5.2 直接对 DeepSeek-V3.2 的「只掩码负优势」做对照,还给出 15.35 的差值——正优势的陈旧响应同样要查,这条对工程配置的提示很具体。
局限性
- 失配是被配置造出来的,论文没有扫这个旋钮。 表 3 给的是 128 prompts × 8 responses = 1,024 条响应一个迭代,而 PPO mini-batch size = 8——一次 rollout 批要切出 128 个 mini-batch,也就是 128 次优化器更新。在这个配置下,一个批次内部的策略漂移本来就极大,所以任何序列级掩码都能拿到巨大收益(4B 上 Null 50.83 → GeoMean 69.17,+18.3)。全文没有 mini-batch 数量的消融,也没有一个近似 on-policy 的臂。在接近 on-policy 的配置里,掩码一半响应大概率只是白扔数据。
- headline 由一列撑住,且那一列就是选模型的那一列。 代码四个基准里三列 z 低于 0.6,LCB-v6 单独 z = 3.09 并贡献 68% 的增量,而 checkpoint 正按 LCB-v6 挑。数学侧同理(按三年 AIME 挑、按 AIME 报)。选择噪声与真实效应叠在同一个数字上,复现时要打折。
- 同阈值保证与实测阈值不是一回事。 Proposition 2 的包含关系只在共享阈值下成立,而实验用的是 对 /1.025——后者的日志预算是前者的 4 倍。所以「CARM 更严」这个由定理支撑的直觉,在实测 operating point 上并不成立(CARM 反而少过滤 0.43–1.13pp)。
- 缺一个「同过滤率随机掩码」臂。 §5.1 用 TRM 论证「过滤更多不等于更好」,可 TRM 在统计量与过滤率两个维度上都与 CARM 不同。要分离「挑对了哪些响应」与「扔掉了多少响应」,需要一条按 CARM 的掩码率随机丢弃的对照。没有它,「CARM 的增益来自判据质量」只能算一半论证。
- 门控与 GRPO 组基线的交互没有交代。 在式 (2) 里是预先算好的序列级优势。掩码扔掉约一半响应之后,保留子集的优势不再零和——只要掩码与奖励相关(§5.2 证明它相关,正负优势掩码差 15.35),更新方向就多出一个系统性漂移项。附录 B 只说「按训练实现的损失归一化方式门控」,没说优势是在全组上算还是在保留子集上重算,也没报被掩码响应与保留响应的奖励构成。这是本文最该补却没补的一张表。
- 成本侧完全空白。 掩码掉 52–55% 的已生成响应,而生成占 RL 墙钟的大头:每单位有用梯度的成本大约翻倍。实验部分 grep
wall-clock、GPU-hour、throughput零命中。论文用「update redundancy」把它讲成优点(少做更新反而更准),但省下的是更新侧,花掉的是生成侧。 - 基线 IcePop 全线劣于 Null,基线集的可靠性存疑。 一条已发表方法在两个模型上分别比「不加任何掩码」低 8.05 与 4.86,要么是本设置失配形态特殊(见第 1 条),要么是复现配置不对。无论哪种,这组基线的绝对水平都不宜外推。
- 消融的控制臂复现不出主表。 §5.2 的 75.63 不在表 4 的任意一个 9B CARM 格上(最接近的 74.17 出自 )。消融与主表不在同一 operating point,对照结论的效力要打折。
对大模型领域的影响
响应级准入这条线,此前被 token 级裁剪的阴影盖住了:大家默认「只要 clip 住,失配就伤不到我」。CARM 把「整条响应是否合格」与「合格响应里每个 token 怎么贡献」彻底切成两层,前者用一个与方向无关的漂移量判定。这条切分成立之后,序列级掩码就不再只是 DeepSeek 那种工程缝合,而是一个有独立统计量、有阈值语义、可单独调的模块。
更实际的影响落在异步与大规模 rollout 的训练栈上。只要采样与训练解耦(一次采样多次更新、多 epoch 复用、跨节点延迟),失配就是常态而不是异常,响应级准入会变成与 PPO clip 并列的必配项。CARM 提供的具体增量是:判据要用双向漂移量而不是净位移量。
本文的证据也划出了适用边界:收益是在「一个 rollout 批切 128 次更新」这种极端失配下测出来的,代码侧只有一个模型尺寸,数学侧只有两个尺寸,且最大值出现在噪声最大的那一列。把 CARM 接入自己的训练栈之前,先量一下自己批内漂移的量级——如果 的 55 分位远小于 0.02,掩码基本不会触发,加了等于没加。
5 实践启示
可以借鉴的技术
- 先量分布,再定阈值。 把 与 在自己的 rollout 批上打出来(一张配对散点图加两个分位数),按目标过滤率反解 。论文的 4 倍预算差说明两把尺子刻度不同,照抄 没有意义。
- 把「掩码率」当成一等训练指标上报。 本文最有说服力的图是过滤率随训练步的变化(附录图 9)。掩码率突然升高意味着策略漂移变大(学习率过高、批内更新次数过多、引擎数值不一致),是一个比损失曲线更早的告警信号。
- 正优势响应也要查,别照抄「只掩码负优势」。 §5.2 的 15.35 分差是这条的直接证据。正优势的陈旧响应会把一个已经在漂移的方向再推一把。
- 阈值按「频率—严重度」而不是按「分数」调。 报 时一并报 上界(相对自己的裁剪带)与实测越界比例,团队沟通成本会低很多。注意这个上界是马尔可夫式的,实测值通常远低于它。
- 稳健性优先于最高分。 选阈值时按网格极差选,不要按单点最高分选。GeoMean 在 4B 上从 69.17 掉到 52.43 这件事,比 CARM 的 +1.25 更值得记住。
潜在应用场景
- 异步 RL 后训练栈:一次采样多次更新、多 epoch 复用、跨节点 actor–learner 延迟,凡是有批内漂移的地方都是 CARM 的直接适用区。
- 引擎数值不一致的诊断:rollout 引擎与训练后端 kernel 不同导致的静默失配,用 的分位数比用 KL 更容易定位,因为它只看采样到的 token。
- 长响应任务:数学与代码的响应动辄上万 token,几何平均对长度的归一化会让长响应的抵消更严重,8,619 token 那条响应就是例子。
- 采样预算受限时的取舍:掩码等价于用约 2 倍生成成本换一次更干净的更新。生成贵、更新便宜的系统适合;反过来,先减少批内更新次数(调大 mini-batch)更划算——本文没有做这个对照,值得自己测。
- 与其他 off-policy 控制的组合:CARM 与 token 级裁剪、重要性比收缩(本专栏 GMC-GRPO 那一路)作用在不同层,理论上可叠加,但组合后的总掩码率与有效样本量需要重新配平。
相关精读
- 本篇把本专栏连续三十期的主线又挪了一格:此前二十九期回答的是「挑哪些 token、挑哪些轨迹、信用按哪套口径记账、信号被消费时旧了多少、数据分布离基座多远」,这一期问的是整条响应有没有资格参与这次更新——判据不进代理损失,只做一个二值门。
- 精读:把 off-policy 专家数据 MCMC 投影成 on-policy 数据
- 精读:GMC-GRPO——把重要性比从逐条裁剪换成整组收缩
- 精读:SCAPO——用「扰动下不动」给 token 记一笔负账
- 精读:ARCUS——prompt 的选择也有一条弧
- 精读:把中间那一步的信号从模型里搬进环境——用沙箱回滚跑出免费过程奖励
- 精读:把特权信息从损失搬到采样器——多轮 agent 里自蒸馏为什么会崩
- 精读:OC-GRPO 与离上下文重要性校正
- 精读:不跑 RL,先把新奖励的结果预测出来
- 精读:给 token 级信用一个唯一解,然后把它求和掉
- 精读:把后训练配方本身当成果,再逐阶段对账
- 精读:STAR-E——按惊讶度给 token 重加权 advantage
- 精读:按梯度可估性给 token 分配蒸馏监督
- 精读:TrimSFT——按 logit 间隔剪掉 SFT 里的低信息 token
- 精读:ESFT 与端点 SFT 对中段推理链的裁剪
- 精读:把中间状态的价值估计整体消掉
- 精读:ActObs——把被 mask 掉的那 45% 观察 token 重新纳入损失
- 精读:SP³O——一条响应里只给三个位置价值监督
- 精读:教师引导的课程 RLVR——把解不出的题变成可解的题
- 精读:DataFlex-RL 与均匀采样的替代策略
- 精读:NGU 与 RL 里的马太效应
- 精读:按排序可分辨性做 RLVR 数据联合工程
- 精读:模型与外壳共演化时的同策略校正
- 精读:OPD-then-RL——顺序摆信号胜过同 step 混信号
- 精读:One-Shot OPD 与状态覆盖吸收率
- 精读:Compile by Training——把 LLM 降级为构建期依赖
- 精读:Terminal-Universe——轨迹反向造环境
- 精读:OPSA——无教师的同策略自适应
- 精读:SPADE——把优化对象从轨迹上移到生成器
- 精读:DART-SD——标注单元从轨迹换成状态图