论文精读

精读:ZCPO——把参考 KL 从损失支搬进组内系数

GRPO 把参考策略 KL 做成一条与奖励并行的损失支,奖励支被裁剪或抵消后 KL 仍在更新;ZCPO 把 KL 换成组内相对漂移的零和系数修正,Qwen2.5-32B 上 AIME24 47.3→56.8、AIME25 37.1→48.5。本专栏逐项对账后发现:β=4 时,k≤2 的组里多数类响应的 |a_i| 只有 0.067–0.143,βK_i 超过 0.036 nats/token 就能翻掉奖励符号,而峰值比 β‖K‖_∞ 全文没有实测值、也没有「只留 −βK_i」的对照臂;ZCPO 响应均值 1695 token 对 vanilla 的 774/611,唯独没报 β=0.001 与 β=0 的长度;F1 的任务级对照只回收 AIME25 那 +13.8 里的 +4.6

论文: When KL Regularization Misfires in Group Policy Optimization
作者: Fei Ding
arXiv: 2610.12161
RLVR GRPO KL 正则 组相对策略优化 后训练 训练动力学 系数校准

1 论文概览

一句话总结:GRPO 系方法把参考策略 KL 做成一条与奖励并行的损失支挂在 token 上;ZCPO 的判断是这条边接错了位置——KL 应该以「组内相对漂移」的形态进到组相对的奖励系数里,而不是作为一条独立的梯度支单独累加。

核心问题:过去一年的经验事实是,把参考 KL 拿掉反而更好。PAPO 在 GRPO 上移除参考 KL,Qwen2.5-VL-3B / 7B 的 avg@8 从 47.92% / 58.78% 抬到 50.18% / 61.30%;Open-Reasoner-Zero 的文本推理消融里,不加 KL 的 PPO 也胜过把 KL 加进损失或加进奖励的变体。DAPO、GMPO 干脆不写这一项。作者把这个现象当成一个设计问题来问:参考策略的信息该从哪条边进组相对优化。

主要贡献

  1. 在「独立 KL 损失」这一设定下枚举 KL 与奖励相互作用的七种错配(F1–F7),其中 F1–F3 有一条 lemma:奖励梯度在裁剪、聚合抵消、奖励全同这三种情形下归零后,KL 项的梯度不为零,更新照旧发生。
  2. 把 KL 从损失项搬进系数:Ci=Ai/sq−βKiC_i = A_i / s_q - \beta K_i,其中 KiK_i 是长度归一化条件 KL 的组内中心化量。KL 不再是「往参考策略拉」的力,而是「组内谁漂移得更远」的比较量。
  3. 给出零和二次校准问题的闭式唯一解(式 2 的拉格朗日条件),并给出共移不变性:给一组的每个 D~i\widetilde D_i 加同一个常数,KiK_i 与 CiC_i 不动。
  4. 用全词表条件 KL κi,t=KL(πθ(⋅∣hi,t)∥πref(⋅∣hi,t))\kappa_{i,t}=\mathrm{KL}(\pi_\theta(\cdot|h_{i,t})\|\pi_{\rm ref}(\cdot|h_{i,t})) 替换 k1 采样对数比,消掉给定前缀下的 token 采样噪声(F7)。
  5. 数学推理主实验 Qwen2.5-32B:AIME24 从 47.3 到 56.8、AIME25 从 37.1 到 48.5(对照为不含 KL 的 DAPO,avg@32、3 seed 均值);另有 Qwen3-4B-Thinking 长上下文 6 列与 GLM-4-9B-0414 的单列复现。

2 方法详解

基线写法。同一 prompt 采样 G≥2G\ge 2 条响应,组归一化 advantage A^i=(Ri−Rˉ)/(σq+εadv)\hat A_i=(R_i-\bar R)/(\sigma_q+\varepsilon_{\rm adv}),token 概率比 ri,t=πθ/πoldr_{i,t}=\pi_\theta/\pi_{\rm old}。独立 KL 版本的 token 损失是 −Sbase(ri,t;A^i)+β ℓi,tKL-S_{\rm base}(r_{i,t};\hat A_i)+\beta\,\ell^{\rm KL}_{i,t},梯度分成两支:

∇θℓi,t=−A^iri,tgi,tmbase(ri,t,A^i)⏟reward term+β∇θℓi,tKL⏟KL term\nabla_\theta\ell_{i,t}=\underbrace{-\hat A_i r_{i,t} g_{i,t} m_{\rm base}(r_{i,t},\hat A_i)}_{\text{reward term}}+\underbrace{\beta\nabla_\theta\ell^{\rm KL}_{i,t}}_{\text{KL term}}

两支只在 mbasem_{\rm base} 这一处共享门控,而 mbasem_{\rm base} 由 base 算法的裁剪规则决定。奖励支被关掉时,KL 支不受影响。这就是 F1–F3 的共同来源:

When β>0\beta>0 and ∇θℓi,tKL≠0\nabla_\theta\ell^{\rm KL}_{i,t}\neq 0, the KL term is nonzero. Thus, an independent KL gradient may remain after the reward gradient vanishes, including in the following three cases. —— §3, Lemma (F1–F3)

ZCPO 的构造。四步走:先把每个位置的条件 KL 求和成序列量 Di=∑tκi,tD_i=\sum_t\kappa_{i,t};再按长度归一化 D~i=Di/Ti\widetilde D_i=D_i/T_i,这一步消掉长响应的累积放大(F4、F5);接着组内中心化 Ki=D~i−1G∑jD~jK_i=\widetilde D_i-\frac1G\sum_j\widetilde D_j,消掉整组共享的漂移基线(F6);最后与最大绝对 advantage 归一化后的奖励系数合成 Ci=Ai/sq−βKiC_i=A_i/s_q-\beta K_i,sq=max⁡i∣Ai∣s_q=\max_i|A_i|。整组 CiC_i 之和恒为零。

CiC_i 带 stop-gradient 送进 base surrogate 替换奖励系数,梯度只走 ri,tr_{i,t}。组级门 Bq=1{G≥2}1{sq>0}B_q=\mathbf 1\{G\ge 2\}\mathbf 1\{s_q>0\} 直接跳过奖励全同的组(F3)。主实验里每个 rollout 只算一次系数,随后 16 次 mini-batch 更新沿用(附录 H)。

关键创新点

  • 位置迁移:KL 的作用点从「一条并行的梯度支」换成「奖励系数里的一个零和修正」。方向不变的部分(整组一起远离参考)不再产生任何力,只有组内相对差异留下。
  • 两次消尺度:长度归一化去掉「越长罚越多」,中心化去掉「整组一起漂移」。附录 G.1 把后者写成代数性质:

    Adding the same constant to every D~i\widetilde D_i in a group leaves KiK_i and CiC_i unchanged, so the coefficients are unaffected by a shared within-group KL baseline (F6). —— §4

  • 条件 KL 替代采样估计:k1 用采样到的 log⁡\log 比估计序列 KL,同一前缀下不同响应的估计差全部来自采样;κ\kappa 是对全词表闭式求和,给定前缀后这部分噪声为零。代价是要做 fp32 输出层重投影加全词表归约,作者报的增量是 0.5% GPU 时间。
  • 最大绝对归一化顺带做了隐式课程:sqs_q 把每组最强的奖励信号钉成单位量,某个因子一旦在组内变成共有(xi=x⋆x_i=x_\star),它的奖励贡献就整体抵消,残差因子 ziz_i 的相对权重自动升上来,不需要额外的课程调度器。

与基线方法的区别

维度独立 KL 损失(GRPO / DAPO + KL)ZCPO
KL 的作用点与奖励并行的损失支,有自己的梯度奖励系数里的零和修正项
量纲乘在 KL 损失上,β\beta 是梯度权重乘在归一化奖励系数上,β\beta 是无量纲系数权重
随长度的行为逐 token 累加,长响应罚得多(F4)先除以 TiT_i 再中心化
是否零和否,整组可以一起被拉回是,∑iCi=0\sum_i C_i=0
奖励方向弱奖励信号可被 KL 反向(附录 G 构造)共有漂移不入系数,绝对方向保留
采样噪声k1 含条件采样噪声(F7)κ\kappa 为闭式,条件噪声为零
额外成本需要 πref\pi_{\rm ref} 前向同样需要 πref\pi_{\rm ref},加 fp32 重投影 +0.5%

两者的 β\beta 不是同一个东西,这一点后面算账时要反复用到。

3 实验结果

主要指标。Qwen2.5-32B、DAPO 底座、G=16G=16、512 prompt/rollout、16 次 mini-batch 更新,AIME24 与 AIME25 均报 avg@32、3 seed 均值。checkpoint 按累计 GPU 时间对齐选取:

配置AIME24AIME25
DAPO 无 KL (β=0\beta=0)47.337.1
DAPO + 标准 KL, β=0.001\beta=0.00144.534.7
DAPO + 标准 KL, β=0.04\beta=0.0431.218.9
ZCPO56.848.5
RPG50.742.5
GVPO52.641.1
GOPO48.539.9

对不含 KL 的 DAPO,ZCPO 是 +9.5 / +11.4;对带标准 KL 的 DAPO(β=0.001\beta=0.001)是 +12.3 / +13.8。按 30 题 × avg@32 的二项方差粗估配对标准误约 2.2–2.3 pp,两列的 zz 约 4.2 与 5.1(未扣题目间相关,也未计入 3 seed 平均,属粗量级)。

与 SOTA 的对比。ZCPO 对 GVPO 是 +4.2 / +7.4,对 RPG 是 +6.1 / +6.0,对 GOPO 是 +8.3 / +8.6。AIME24 那一列对 GVPO 的 zz 只有 1.9,落在噪声区间;AIME25 是 3.3。

长上下文 6 列(Qwen3-4B-Thinking-2507,基座 / +GRPO 带标准 KL / +GRPO 无 KL / +ZCPO):

列DocMathLBV2FramesMRCRCorpusQALBV1-QA
基座60.739.464.937.549.264.2
+ 标准 KL61.641.764.849.353.864.3
+ 无 KL62.345.266.465.761.965.6
+ ZCPO63.848.268.266.069.666.4
ZCPO − 无 KL+1.5+3.0+1.8+0.3+7.7+0.8

去掉 KL 自己就是一笔大收益(MRCR 上 +16.4),ZCPO 在这之上的增量六列合计 15.1,其中 CorpusQA 一列占 7.7,即 51%。

消融实验关键发现

  • 去掉组内中心化掉得最狠:56.8 → 45.6、48.5 → 36.7,−11.2 / −11.8。去中心的版本数值上回到「标准 KL」那一档(对照 44.5 / 34.7,只高 1.1 / 2.0),与「共享漂移就是标准 KL 的惩罚」这一解释吻合。
  • 去掉长度归一化:−2.9 / −5.0;k1 替换条件 KL:−2.3 / −1.4;改回标准差归一化:−1.4 / −3.6。三项都远小于中心化那一项。
  • β\beta 扫描(AIME24,3 seed):β=0\beta=0 得 48.1,β=4\beta=4 得 56.8,β=20\beta=20 得 53.7。关掉 KL 校准项只值 +0.8(此项也是「最大绝对归一化」相对「标准差归一化」的全部收益),打开后 +8.7。附录 B 的 2×2 显示归一化与 KL 校准两项可加:标准差口径下 +8.1,最大绝对口径下 +8.7。
  • KL 梯度份额(诊断 run,step 11–100 的中位数):vanilla β=0.001\beta=0.001 为 0.4%,vanilla β=0.04\beta=0.04 为 5.8%,ZCPO β=4\beta=4 为 7.0%,ZCPO β=20\beta=20 为 30.2%。份额相近的那一对(5.8% 对 7.0%)任务分是 31.2 对 56.8。
  • F1 的任务级对照:在裁剪位置关掉 KL(F1-B)从 44.5 / 34.7 到 46.1 / 39.3;全 token 范数对照(F1-C)到 44.8 / 37.5。
  • GLM-4-9B-0414 单列:DAPO 无 KL 24.5 → ZCPO 36.2。

4 个人分析

亮点

第一,把「要不要加 KL」这个二值选择改写成「KL 从哪条边进来」。这个改写是有收益的:同一份参考策略信息,接在损失上是有害的(表 1 里 β=0.04\beta=0.04 掉到 31.2),接在系数上是 +9.5。第二,F1–F3 的 lemma 短、条件写得清楚,而且三条都是可以被实现直接验证的(mbase=0m_{\rm base}=0 处 KL 支是否为零)。第三,共移不变性这条代数性质把「正则」和「奖励」在组内彻底解耦:KL 不再评判一次偏离好不好,只比较谁偏得更远。第四,实验卫生做得比同规模工作扎实——checkpoint 按累计 GPU 时间对齐,且明确写了:

The main experiments are aligned by cumulative GPU compute time, and checkpoints corresponding to the same cumulative GPU compute time are selected for evaluation. Checkpoint selection is independent of the AIME24 and AIME25 evaluation results. —— Appendix A

这一条直接消掉了「取最佳 checkpoint」这个常见口径漏洞。

局限性

  1. βKi\beta K_i 与 aia_i 谁大,论文没有测。 二进制奖励下这条可以手算:kk 条正确时 sq=2max⁡(k,G−k)/Gs_q=2\max(k,G-k)/G,多数类响应的 ∣ai∣=min⁡(k,G−k)/max⁡(k,G−k)|a_i|=\min(k,G-k)/\max(k,G-k)。G=16G=16 时 k=1,2,4,8k=1,2,4,8 分别对应 0.067、0.143、0.333、1.000。β=4\beta=4 时,只要 ∣Ki∣|K_i| 超过 0.017 / 0.036 / 0.083 / 0.25,多数类响应的系数符号就由 KL 决定,不由奖励决定。论文自己的玩具构造给出 D~≈0.105\widetilde D\approx0.105 nats/token,组内中心化后的 KK 落在 0.01–0.04 完全在射程内。式里定义了峰值比 ρ∞,q=β∥K∥∞\rho_{\infty,q}=\beta\|K\|_\infty,全文没有给出任何实测值,也没有「只留 −βKi-\beta K_i、去掉 aia_i」的对照臂。于是「KL 校准奖励」与「KL 主导奖励」这两种读法,在 β=4\beta=4 这个 operating point 上只差一个未被测量的倍数。

  2. 长度通道没有隔离。 图 3(c) 给的是 step 100 的均值长度:vanilla β=0.04\beta=0.04 为 774、vanilla β=4\beta=4 为 611、ZCPO β=4\beta=4 为 1695。缺的正是最关键的两个数:β=0.001\beta=0.001 与 β=0\beta=0 的长度。ZCPO 的响应比同 β\beta 的 vanilla 长 2.8 倍,可我们无法判断它是把长度恢复到了无 KL 的水平,还是推到了更长的水平。正文也留了一句 “the normalized KiK_i remains correlated with TiT_i,indicating that length effects are not fully eliminated”。数学题的准确率对生成长度敏感,缺一条长度匹配对照(或固定 token 预算的评测),这 9.5 个点的成因就分不开。

  3. 机制归因的预算没有算平。 ZCPO 相对 β=0.001\beta=0.001 的 vanilla 是 +12.3 / +13.8,唯一有任务级对照的 F1-B 回收 +1.6 / +4.6,即 AIME24 的 13%、AIME25 的 33%。F2、F4、F5、F6、F7 都只有诊断图,没有任务级对照臂。附录 I 自己划了界:

    Other gradient, length, and drift diagnostics characterize training behavior and motivate testable mechanistic hypotheses about its effects on optimization. —— Appendix I

    七种错配里,五种停留在「待检验的机制假说」。

  4. 两条方法的 β\beta 网格零重叠。 vanilla 扫 {0,0.001,0.04}\{0, 0.001, 0.04\},ZCPO 扫 {0,4,20}\{0,4,20\},唯一的公共点是 0。在 β=0\beta=0 这一点上,ZCPO 只比无 KL 的 DAPO 高 0.8 个点,剩下的差异全部来自非公共点。这里有个反向的加分项:β=4\beta=4 是在 AIME24 上选出来的,而没参与选择的 AIME25 反而给了更大的增量(+11.4 对 +9.5,zz 5.1 对 4.2),选择噪声这条指控在这个案例里站不住。

  5. 长上下文六列里,一列占了增量和的一半。 CorpusQA +7.7,MRCR 只有 +0.3,去掉 CorpusQA 后六列均值从 +2.52 掉到 +1.48。这一组还没有 seed 与置信区间。

  6. F3 的门控消融在噪声里。 全方法对去门控版本是 +0.5 / +0.2 / +0.6 / −0.3 / +1.1 / +0.3,MRCR 反号,六列里五列的差不到 1.1 个点。还有一处措辞要留意:去门控的臂在 sq=0s_q=0 时把奖励系数置零,可 Ci=−βKiC_i=-\beta K_i 并不为零,这批组拿到的其实是纯漂移均衡更新。

  7. 系数与概率比不同步。 每个 rollout 算一次 CiC_i,之后 16 次 mini-batch 更新里 ri,tr_{i,t} 在变、CiC_i 不变,裁剪门由当前比值和固定系数共同判定,门的状态可以在中途翻转。再把第 1 条接上:一旦 CiC_i 的符号被 KL 翻过来,DAPO 的非对称裁剪(εlow=0.2\varepsilon_{\rm low}=0.2、εhigh=0.28\varepsilon_{\rm high}=0.28)就套到了错误的一侧。

  8. 两处协议细节。 附录 C 写 KL 份额在每步第一个 mini-batch 上测、且「所有奖励梯度门打开」,可 F1 统计的正是关门 token,正文没说它取自哪一步;表 5 的 30.2% 在正文里写成 30.1%。

  9. 主实验只有一个模型族。 数学是 Qwen2.5-32B 单尺度,长上下文是 Qwen3-4B-Thinking,跨模型只有 GLM-4-9B-0414 且只有 AIME24 一列、没有带 KL 的对照臂。

对大模型领域的影响

这条路线站得住的话,受影响的面比「GRPO 的一个改法」大:任何以组相对为骨架的后训练目标(GRPO、DAPO、GMPO、各类 agentic RL)都要重新回答「参考模型的信息从哪条边进」。更实际的推论是,「去掉 KL 更好」这个经验结论不是 KL 无用,而是独立损失支这种接法无用——KL 在系数层是有用的,且能吃到比原来大三个数量级的权重(0.001 对 4)而不崩。附录 G 那个弱奖励翻转构造也有普适性:只要奖励信号比 KL 项弱,独立 KL 就能把负奖励的贡献翻成正的,这对密集但微弱的奖励 shaping 是个直接警告。

5 实践启示

可以借鉴的技术

  • 把正则项从损失层搬到系数层:任何「与奖励并行加一项」的正则,都可以试着改写成「在组内的奖励系数上加一个零和修正」。好处是共有成分自动消失,只剩下比较信息。
  • 长度归一化加组内中心化:这两步是消融里最值钱的(−11.2 / −11.8),实现成本极低,任何按序列累加的惩罚项都值得先做这两步。
  • 全词表条件 KL 替代采样对数比:κ\kappa 消掉条件采样噪声,代价只是 fp32 输出层重投影加全词表归约(报 0.5%)。bf16 下 κ\kappa 是二阶小量,这个 fp32 重算不能省。
  • 最大绝对 advantage 归一化:把每组最强信号钉成单位量,附带一个免费的隐式课程——因子变成共有后自动让位给残差因子。
  • checkpoint 按累计 GPU 时间对齐:本专栏在多篇里都栽在 checkpoint 口径上,这篇的做法可以直接抄。

落地前要补的三条对照

  1. 加一条「只留 −βKi-\beta K_i」的臂,把「校准」和「主导」分开;顺手把 β∥K∥∞\beta\|K\|_\infty 在训练过程中的曲线打出来。
  2. 补一条长度匹配对照:把无 KL 基线的生成长度拉到与 ZCPO 相当,或在同一 token 预算下评测,隔离长度通道。
  3. 把 F2、F4、F5、F6 各做一条任务级对照臂(F1 已经做了),让 +12.3 / +13.8 这笔账能按机制拆开。

潜在应用场景

  • 长上下文与多轮 agent:这类场景的奖励最晚到且最微弱,正是独立 KL 最容易翻向的地方(附录 G 的构造直接命中)。
  • 连续或密集奖励 shaping:奖励尺度小、优势被 σq\sigma_q 压平时,共移漂移会盖掉奖励方向,ZCPO 的中心化正好对上。
  • 奖励饱和后的残差挖掘:当主因子在组内变成共有,最大绝对归一化会自动把权重让给残差差异,省掉一个课程调度器。
  • 需要保留探索多样性的场景:β=4\beta=4 时 KL 项在系数层偏好「漂移更小的候选」,等价于组内抗漂移均衡,与熵坍缩那条线同源,值得拿熵曲线直接对照。

参考文献

Ding, F. (2026). When KL Regularization Misfires in Group Policy Optimization. arXiv:2610.12161 [cs.LG]. Alibaba Group.

相关精读