大模型强化学习中的训推不一致:DLC 阅读笔记

笔记日期: 2026-11-10(UTC)
笔记作者: Zhongzhu Zhou
阅读论文: On the Origin and Evolution of Training-Inference Mismatch in LLM Reinforcement Learning
论文作者: Yu Li、Yufa Zhou、Tian Lan
arXiv: 2610.40945v1
版本与日期: v1,2026-10-29

1. 我带着什么问题读这篇论文

假设训练端说:“这个 token 的概率是 0.12。”生成它的采样端却记了 0.08。直接拿两者相除,确实得到了重要性比率,却不知道该修哪个环节。可能两边用着同一版权重,只是引擎、精度和算子不同;也可能采样服务的权重落后几个训练步。前一种偏差在固定输入和固定采样版本下不会随着当前训练端移动,后一种则是训练自己造成的:本轮的更新改变下轮的比率,失真的梯度又可能放大下一次移动。

论文的切入点是让训练引擎用采样时的权重再做一次前向。训练端当前分布、训练端旧权重分布、采样端实际分布这三份条件概率都对齐到同一个前缀和动作。于是,比较旧权重两端时只换引擎,比较训练引擎两份结果时只换权重。中间那份分布既是诊断工具,也是 DLC 的分母。

我最关心的有三件事。第一,为什么「减去 score 的均值」能让量化场景稳定,却救不了冻结的采样器?第二,截断、裁剪与重新同步分别修掉哪部分偏差?第三,如果模型在旧前缀上的 KL 看起来没有异常,它自己生成的回答能不能已经崩掉?后文会发现,这三个问题分别对应均值、分布和采样覆盖范围,不能只盯同一个比率。

图 1:对齐同一 token 后比较三份概率

图 1:依据论文式 (2) 自绘。中间的参考分布用的是生成时权重和训练端算术,因而可以分别比较引擎差与版本差。

先说结论的尺度:在论文的冻结采样实验中,DLC 确实有很强的稳定性证据,尤其是 1.7B;它在该配置下每步更慢。论文给出的半数 ESS 阈值是一条可测试的规则,不是适用于任意任务和引擎的稳定性定理。我会把三个判断分开:估计器是否纠正目标偏差、策略是否持续学习、训练系统是否更省时间。

2. 前置知识:一批回答究竟来自什么分布

2.1 把生成过程拆成前缀和动作

用 xx 表示 prompt,ht=(x,y<t)h_t=(x,y_{<t}) 是生成第 tt 个 token 时已经看到的前缀。给定前缀,采样下一个 token 就是做一次动作。序列概率是条件概率的乘积,直到生成 EOS 或达到上限。训练时我们可以逐 token 取对数概率,但这不意味着这些 token 是独立样本:前面的选择决定后续状态是否出现。如果旧策略一直没走进某条解题路径,在已出现的 token 上做局部加权也不会补出那条路径。

Countdown 的每个 prompt 生成八个回答,验证给出 +1+1 或 −1-1。优势是回答奖励减去组均值,不再除以组内标准差。举例:三个回答答对,五个答错,组均值为 −0.25-0.25,两类优势为 1.251.25 和 −0.75-0.75。八个回答的优势加起来是零。可是把这些回答再按某一步是否出现一个有效中间式分组,包含它的前缀可能主要来自答对组,条件平均优势就为正。反过来,错误前缀的条件平均优势可能为负。再加上论文按 token 求平均,较长回答在总体里的权重也与按回答求平均不同。说「已经中心化」时,必须交代是在哪一层求均值。

2.2 score 是梯度,不是给回答打分

在固定前缀上,用 pvp_v 表示训练端概率,sv=∇θlog⁡pvs_v=\nabla_\theta\log p_v 是参数方向上的向量。它回答的是「怎样移动参数,会增加这个 token 的对数概率」。由于完整词表上的概率和为一,

Ep[s]=∑vpv∇θlog⁡pv=∑v∇θpv=∇θ1=0.\mathbb E_p[s]=\sum_v p_v\nabla_\theta\log p_v =\sum_v\nabla_\theta p_v =\nabla_\theta 1=0.

所以在 on-policy 数据上,把同一前缀所有动作的优势都加上一个常数 dd,梯度不变。如果概率是从 qq 采出来的,情况不同。把 qq 当成已经固定的数据分布,对 DKL(q∥pθ)D_{\mathrm{KL}}(q\Vert p_\theta) 求导,只剩下 −∑vqvsv-\sum_v q_vs_v。现在把条件优势 ava_v 和 score 的乘积展开:

Eq[as]=Eq[a]Eq[s]⏟drift+Cov⁡q(a,s),Eq[s]=−∇θDKL(q∥pθ).\mathbb E_q[a s]=\underbrace{\mathbb E_q[a]\mathbb E_q[s]}_{\text{drift}} +\operatorname{Cov}_q(a,s),\qquad \mathbb E_q[s]=-\nabla_\theta D_{\mathrm{KL}}(q\Vert p_\theta).

前项就是论文的漂移。做梯度上升时,正的平均优势会把当前分布往采样端拉;负的会推开。这个动作来自「前缀整体的优势」,与哪个候选 token 相对更好没有直接关系。减掉 Eq[s]\mathbb E_q[s] 能消除这项,但留下的是采样分布下的协方差,目标仍是训练分布下的协方差。

图 2:常数优势也会让异策略梯度非零

图 2:二项分布的说明性算例。训练端给动作一的概率为 0.4,采样端为 0.7。优势恒为一时,未中心化的 score 期望为 0.3,中心化后为零。

我喜欢用这个小例子检查两者的区别。设动作一优势为 11,动作零为 −1-1,参数是一维 logit,score 分别为 1−p1-p 和 −p-p。在训练分布下得到 2p(1−p)=0.482p(1-p)=0.48;按 qq 的均值把 score 减干净,得到 2q(1−q)=0.422q(1-q)=0.42。两种计算都不再对常数基线敏感,但梯度仍不同。理解了这个反例,就不容易把「漂移消失」误读为「无偏」。

2.3 重要性采样能修到哪一层

若 qv>0q_v>0 覆盖所有目标动作,固定前缀和优势函数后,qv(pv/qv)=pvq_v(p_v/q_v)=p_v,因此完整比率可把局部动作分布换回 pp。论文的基线会截断到 2。把 p/qp/q 减去截断后丢掉的部分,再取期望,有

Eq[min⁡(p/q,2)as]−Ep[as]=−Eq[(p/q−2)+as].\mathbb E_q[\min(p/q,2)a s]-\mathbb E_p[a s] =-\mathbb E_q[(p/q-2)_+ a s].

这项可以再次拆成常数优势漂移和随动作变化的部分。比率越大、该动作的优势和 score 越重要,截断对梯度的影响就越大。序列级别的比率可以连带修正前缀与续写,但需要支持集覆盖、正确记录采样概率以及足够有效样本。几十到几百项连乘后,少量极端回答就可能吃掉大部分权重。用有偏的局部修正,再让采样端适时追上训练端,是论文选择的路线。

2.4 工程前提:先保证三份日志说的是同一个事件

论文表 1 先排除三类不一致:一是按 top-p 抽样却上报原始 softmax,二是把文本交给训练端重新分词,三是奖励过滤或异步队列让某些回答更容易进入本批。第一类改了分母,第二类换了动作,第三类改了进入训练的数据分布。论文主实验用温度一、不截断、直接传 token ID,并控制批次构成。这个前提让数值差和版本差成为可解释的两项。

如果读者要做诊断,我建议把生成时的版本号、有效 token 掩码和位置随动作记录。不要用请求完成时的版本号替代;当一次回答中间发生换权重时,更不能只挂一个批次级编号。另把「被生成的概率」与「被训练接纳的规则」分开统计。后者如果取决于回答长度、完成时间或奖励,即便 log-prob 都记录正确,也不能直接套同一套分布替换。

3. 精确拆分与局部近似是两件事

写 r=pθoldr=p_{\theta_{\mathrm{old}}} 表示训练引擎在采样权重上的条件分布。在同一 ht,yth_t,y_t 上加减 log⁡rt\log r_t:

δt=log⁡pt−log⁡qt=(log⁡rt−log⁡qt)+(log⁡pt−log⁡rt)=et+ℓt,pt/qt=(rt/qt)(pt/rt)=exp⁡(et)ρt,ρt=exp⁡(ℓt).\begin{aligned} \delta_t&=\log p_t-\log q_t\\ &=(\log r_t-\log q_t)+(\log p_t-\log r_t)=e_t+\ell_t,\\ p_t/q_t&=(r_t/q_t)(p_t/r_t)=\exp(e_t)\rho_t,\quad \rho_t=\exp(\ell_t). \end{aligned}

第一行是精确恒等式。ete_t 是同版本的数值差,ℓt\ell_t 是同引擎的策略滞后。量化实验中数值差的平均量级约为每 token 0.02 nats;冻结采样器的序列偏移量级约每步增长 0.7 nats。后一个观察并不意味着任意序列都按这个速度增长。数值差「基本不变」的严格含义是:给定采样版本、引擎配置、前缀和动作,单独移动当前训练权重不会改变 ete_t。输入分布换了、批次布局变了或同步到新的快照,数值差仍可能变化。

第二步才引入近似。令 Δ=θ−θold\Delta=\theta-\theta_{\mathrm{old}},s0s_0 和 H0H_0 分别是旧权重处 log-prob 的梯度和 Hessian。逐个动作做泰勒展开:

ℓv=s0,v⊤Δ+12Δ⊤H0,vΔ+O(∥Δ∥3).\ell_v=s_{0,v}^\top\Delta+\tfrac12\Delta^\top H_{0,v}\Delta+O(\|\Delta\|^3).

当 q=rq=r 时,在旧分布下求平均,一阶项因为 score 均值为零而消失。再对概率归一化求二阶导,得到 Er[H0+s0s0⊤]=0\mathbb E_r[H_0+s_0s_0^\top]=0。定义 F0=Er[s0s0⊤]F_0=\mathbb E_r[s_0s_0^\top]。平均由 Hessian 项决定,方差的首项来自一阶项的平方:

Er[ℓ]=−DKL(r∥p)=−12Δ⊤F0Δ+O(∥Δ∥3),Var⁡r(ℓ)=Δ⊤F0Δ+O(∥Δ∥3).\begin{aligned} \mathbb E_r[\ell]&=-D_{\mathrm{KL}}(r\Vert p) =-\tfrac12\Delta^\top F_0\Delta+O(\|\Delta\|^3),\\ \operatorname{Var}_r(\ell)&=\Delta^\top F_0\Delta+O(\|\Delta\|^3). \end{aligned}

这解释了一个容易忽略的现象:平均 log-ratio 看起来还不大,个别动作的比率已经可以很离散。参数空间中的欧氏距离也只是代理;同样大小的位移,沿不同 Fisher 曲率方向,会有不同的策略影响。把 ℓ\ell 沿序列求和并在旧策略的响应上求平均,得到旧到新的负序列 KL。后面用于检查崩溃的统计量从新策略自己的响应出发,方向和覆盖范围都不同。

算法 1:采集可归因的三组概率

1. 给每个采样 token 绑定实际生成版本、位置和 token ID。
2. 保存该动作的 log q 和采样端头部集合 H 的 log q。
3. 训练引擎用生成版本回放同一前缀,得到 log r。
4. 训练引擎用当前权重计算 log p;在同一 token 上比较。
5. 保存 e、lag 及其和,同时按优势、位置和版本分组。
6. 在固定探针和新采样响应上分别统计,并保留极端比率。

这里的头部是采样端的 top-128,不要在训练端重新选一份 top-128 再按名次相减。共享检查点上的配对回放还能避免一种混淆:如果量化和冻结两组模型早已训练到不同分布,直接拿两组末态的平均差比较,观察到的变化既可能来自引擎,也可能来自它们选择了不同前缀。

4. 漂移减掉以后,偏差从哪里回来

4.1 把一条回答拆成前缀、当前动作和续写

沿用论文式 (4),用 μtπ\mu_t^\pi 表示策略 π\pi 产生的前缀分布,用 aπ(v)a^\pi(v) 表示选择动作 vv 后用 π\pi 续写得到的条件期望优势。记 F(μ,d,a)F(\mu,d,a) 为在 μ\mu 的前缀上,对动作分布 dd 的优势与 score 协方差求平均。精确中心化给出 F(μq,q,aq)F(\mu^q,q,a^q),目标是 F(μp,p,ap)F(\mu^p,p,a^p)。从前者走到后者,每次只换一件事:

bprefix=F(μq,q,aq)−F(μp,q,aq),bcontinuation=F(μp,q,aq)−F(μp,q,ap),btoken=F(μp,q,ap)−F(μp,p,ap),btail=Eμq[Eq[aq](sˉ−s^)].\begin{aligned} b_{\rm prefix}&=F(\mu^q,q,a^q)-F(\mu^p,q,a^q),\\ b_{\rm continuation}&=F(\mu^p,q,a^q)-F(\mu^p,q,a^p),\\ b_{\rm token}&=F(\mu^p,q,a^p)-F(\mu^p,p,a^p),\\ b_{\rm tail}&=\mathbb E_{\mu^q}[\mathbb E_q[a^q](\bar s-\hat s)]. \end{aligned}

前三行相加时,中间项恰好抵消。最后一项是头部近似误差:本来要减掉完整的 sˉ\bar s,实际只得到估计 s^\hat s。前缀项比较的是到达状态的频率,续写项比较的是同一动作之后的平均回报,动作项比较的是同一状态下选择动作的概率。即便有一个 oracle 能准确告知每个已采样动作的比率,也不能仅用当前动作的比率把前两项变为零。

图 3:剩余偏差的四个来源

图 3:依据论文式 (4) 自绘。前缀与续写要分别处理;头部近似则是额外的均值估计误差。

对前缀,把前面动作的比率连乘。设 St=∑j<tδjS_t=\sum_{j<t}\delta_j,前缀比率为 exp⁡(St)\exp(S_t)。把两份期望都改写到 μq\mu^q 下,差值的系数便是 1−exp⁡(St)1-\exp(S_t)。续写项的做法类似,只不过连乘从 j>tj>t 开始,并放进条件回报期望里。动作项用 qv=pve−δvq_v=p_ve^{-\delta_v},从协方差差值里加减 Ep[a]Eq[s]\mathbb E_p[a]\mathbb E_q[s]:

Cov⁡q(a,s)−Cov⁡p(a,s)=Ep[(e−δ−1)(a−Ep[a])s]−(Eq[a]−Ep[a])Eq[s].\begin{aligned} \operatorname{Cov}_q(a,s)-\operatorname{Cov}_p(a,s) ={}&\mathbb E_p[(e^{-\delta}-1)(a-\mathbb E_p[a])s]\\ &-(\mathbb E_q[a]-\mathbb E_p[a])\mathbb E_q[s]. \end{aligned}

δ\delta 小时,第二行是两项一阶差的乘积,可作二阶小量;第一行以 −δ-\delta 为首项。这个推导只说明局部线性化。即便每个 δj\delta_j 只有 0.02,若一百项同号,StS_t 已达 2,不能把指数随意换成线性项。论文用前缀项和动作项预测偏差方向,并未把续写项估出来。这是后面阅读表 10 时需要记住的遗漏。

4.2 一轮的滞后为什么会影响下一轮

在冻结区间,把 ℓt≃st⊤Δ\ell_t\simeq s_t^\top\Delta 代入动作项,把此前 score 的和乘 Δ\Delta 代入前缀项。两者都是关于 Δ\Delta 的线性映射。设 b≃−MΔb\simeq -M\Delta;普通中心化比完整 token 权重多出一个局部动作矩阵:

Mtoken=∑tE[(At−Aˉt)stst⊤].M_{\rm token}=\sum_t\mathbb E[(A_t-\bar A_t)s_t s_t^\top].

其中 Aˉt\bar A_t 是前缀条件均值,与按 prompt 求的组均值不是同一个量。取任一方向 uu,该矩阵的二次型是 ∑tE[(At−Aˉt)(st⊤u)2]\sum_t\mathbb E[(A_t-\bar A_t)(s_t^\top u)^2]。若低于前缀均值的动作在这个方向投影更大,二次型可能为负,偏差就可能沿该方向放大位移。两种估计器共有前缀部分;截断的重要性权重也会留下带优势的尾部误差,不能把它当作永远没有动作项。

Δk+1=Δk+η(gk+bk)≃(I−ηM)Δk+ηgk.\Delta_{k+1}=\Delta_k+\eta(g_k+b_k) \simeq (I-\eta M)\Delta_k+\eta g_k .

在 MM 的一个实负特征值方向上,偏差部分每步乘 1−ηλ>11-\eta\lambda>1。动作矩阵本身对称,但前缀部分不一定对称;局部二次型为负并不证明整个 MM 一定有负特征值。这里有用的是因果链:动作权重改变残余梯度,残余梯度扩大版本距离,更大的距离重新进入后续动作权重。量化差在固定输入和版本下不随这一步位移变化,没有同一条直接反馈路径。

图 4:冻结区间内三种局部动力学

图 4:依照论文式 (3) 和附录 H 的标量递推作图。曲线是解析算例,不是模型训练曲线。

4.3 二次项从哪一步出现

从同步点的 Δ0=0\Delta_0=0 出发,假定 MM 和平均梯度 gˉ\bar g 短时间内不变。第一步产生 ηgˉ\eta\bar g;第二步在前一步位移上再作用一次 I−ηMI-\eta M,得到 2ηgˉ−η2Mgˉ2\eta\bar g-\eta^2 M\bar g。依次递推:

E[Δk]=η∑j=0k−1(I−ηM)jgˉ≃ηkgˉ−η2k(k−1)2Mgˉ.\begin{aligned} \mathbb E[\Delta_k] &=\eta\sum_{j=0}^{k-1}(I-\eta M)^j\bar g\\ &\simeq \eta k\bar g-\eta^2\tfrac{k(k-1)}{2}M\bar g. \end{aligned}

k(k−1)/2k(k-1)/2 数的是早一步的位移对晚一步的影响次数。固定 ηk\eta k 而让步长变小时,二阶系数近似 (ηk)2/2(\eta k)^2/2。对范数用 ∥x+y∥≃∥x∥+x⊤y/∥x∥\|x+y\|\simeq\|x\|+x^\top y/\|x\|,中心化相对重要性权重的额外范数首项就是 −(ηk)2gˉ⊤Mtokengˉ/(2∥gˉ∥)-(\eta k)^2\bar g^\top M_{\rm token}\bar g/(2\|\bar g\|)。与之对照,如果偏差是与 Δ\Delta 无关的常向量,每步只加同样一截,累计是线性的。

论文图 3 用两个学习率联合拟合,二次项系数为 0.52,R2=0.987R^2=0.987,纯线性为 0.90。这个结果支持反馈解释,但不要把好看的拟合等同于预测准确。附录 G 在冻结采样的第 40 步把偏差范数高估到实测的 3399 倍;把线性比率换回指数后仍为 6.1 倍,余弦 0.09。第 20 步精确权重的余弦较高,为 0.28。这个重算仍用样本优势替代前缀中心化优势,且不包含续写项。机制解释和可量化预测之间还有距离。

5. ESS 看的是权重集中,均值看不到尾部

只考虑策略滞后且支持集相同,q=rq=r。由于 ∑vrv(pv/rv)=1\sum_v r_v(p_v/r_v)=1,展开 χ2(p∥r)=∑v(pv−rv)2/rv\chi^2(p\Vert r)=\sum_v(p_v-r_v)^2/r_v 的平方项后,有

Er[ρ2]=1+χ2(p∥r),f^Kish=(∑iρi)2N∑iρi2.\mathbb E_r[\rho^2]=1+\chi^2(p\Vert r),\qquad \widehat f_{\rm Kish}=\frac{(\sum_i\rho_i)^2}{N\sum_i\rho_i^2}.

后者趋向于一阶矩平方除以二阶矩;在一阶矩为一时才化为二阶矩的倒数。论文触发器直接用 1/Eq[ρ2]1/\mathbb E_q[\rho^2]。在量化和滞后并存时,qq 与 rr 不同,这个比率在 qq 下不保证均值为一。因此若一批日志上的比率全为 1.5,倒数矩给 0.444,Kish 却给 1;在完整、共同支持集的旧策略分布上不会有处处 1.5,这里是假设批次集中在一个区域。两项都值得记,不能把其差别当作计算噪声。即便用了 Kish,token 也来自相关的响应,指标衡量的是权重集中度,并不是独立轨迹数。

高斯假设下 ℓ∼N(μ,σ2)\ell\sim\mathcal N(\mu,\sigma^2),有 E[ezℓ]=exp⁡(zμ+z2σ2/2)\mathbb E[e^{z\ell}]=\exp(z\mu+z^2\sigma^2/2)。令 z=1z=1,均值约束给出 σ2=−2μ\sigma^2=-2\mu;令 z=2z=2,再代入上式:

log⁡E[ρ2]=2μ+2σ2=−2μ,fGaussian=e2μ.\log\mathbb E[\rho^2]=2\mu+2\sigma^2=-2\mu,\qquad f_{\rm Gaussian}=e^{2\mu}.

达到 0.5 时的均值为 −log⁡2/2≃−0.347-\log 2/2\simeq-0.347 nats。若把对数矩生成函数写作累积量级数,K(2)−4K(1)K(2)-4K(1) 里方差抵消,三阶、四阶项系数分别为 2/32/3 和 1/21/2。只要展开在所需点有意义,它就解释了为什么较重的正尾会压低相同均值下的 ESS。观察均值或左侧尾部并不足以预警。

图 5:高斯曲线与实际触发步数

图 5:按论文式 (32) 与图 4(b) 重绘。左边只给理论曲线和报告的交叉点,右边标出两种交叉步数,没有补造时序。

1.7B 的实测 ESS 在第 11 步过半数阈值,高斯值到第 14 步才过;实测时的平均滞后约 −0.15,代入高斯关系却还有 0.741。按阈值复算,额外的 log 二阶矩约 log⁡2−0.30=0.393\log 2-0.30=0.393。0.6B 在第 40 步则有 11% 的比率低于 0.5,高斯拟合给出 28%。这两个观测来自不同模型,也看的是不同尾部;不能拿小模型的左尾百分比去推断大模型的二阶矩。更不能把第 11 步拿去当通用同步间隔。

5.1 一个可枚举的尾部反例

只看一个前缀,旧策略对常见动作与罕见动作给出 (0.99,0.01)(0.99,0.01),当前策略给出 (0.88,0.12)(0.88,0.12)。不存在引擎差,于是 ρ\rho 分别为 8/98/9 和 12。旧策略平均后的比率仍为一,但二阶矩为 0.99(8/9)2+0.01(12)2=20/90.99(8/9)^2+0.01(12)^2=20/9,因此 ESS 比例只有 0.450.45。平均 log-ratio 却只有约 −0.0918-0.0918 nats,代入高斯式会给约 0.832。这个例子不需要拟合或采样,直接说明「平均滞后小」与「足够重叠」之间没有普遍等价关系。

再假设在这个前缀独立采 100 次。完全没看到罕见动作的概率为 0.99100≃0.3660.99^{100}\simeq0.366。在这些批次中,日志上的比率全等于 8/98/9,Kish 比例会是 1,倒数矩甚至会超过 1。抽到一个罕见动作后,倒数矩就回到接近真实的 0.45。不能用一批没抽到尾部的数据来证明比率尾部不存在。真实 LLM 的前缀随回答变化,同一 token 位置出现率不恒定,相关性还会进一步减少可用样本。比较不同模型时,不宜只截取几条看起来稳定的 ESS 曲线;最好给出样本量、分位数、最大几项对二阶矩的贡献,以及用整条响应重采样得到的波动范围。

这个例子也能区分裁剪与刷新。若罕见动作是正优势,DLC 会因为 12>1.212>1.2 暂时不让它贡献加权样本梯度;截断重要性采样则仍保留一个上限为 2 的权重。两种做法都未还原它的目标贡献。用当前权重重新生成时,该动作的抽样率从 1% 变成 12%,才从数据层改善覆盖。代价是此后采样到更多这类动作,也要让任务验证器重新给奖励;不能沿用旧样本的回报来替代。

6. DLC 怎样把三个动作放进同一步

6.1 先决定裁剪参考谁

用 p/qp/q 同时处理引擎差和版本差,但 FP8 引擎差也会让本来没有滞后的 token 被截断。用批次开始前的训练策略当 PPO 分母,则批内第一步的比率必为一,哪怕这个批次的回答早在多步之前生成。DLC 用 p/rp/r,让裁剪直接对准滞后。对某个训练位置,固定当前样本优势 AtA_t 的符号,对样本和头部的每个候选都应用同一个规则:

mv={1{ρv≤1+ε},At>0,1{1−ε≤ρv≤c},At<0.m_v= \begin{cases} \mathbf 1\{\rho_v\le 1+\varepsilon\}, & A_t>0,\\ \mathbf 1\{1-\varepsilon\le \rho_v\le c\}, & A_t<0 . \end{cases}

原文使用 ε=0.2\varepsilon=0.2、c=3c=3,At=0A_t=0 不产生更新。这里的 mvm_v 表示分段损失在哪一侧还有梯度。比如比率 1.35 在正优势下已超过上界,梯度为零;在负优势下还可以保留。与直接把所有比率压进同一个区间不同,PPO 这种处理保留了纠正不利方向的更新,限制的是继续把目标推向饱和区间。

6.2 用头部概率构造裁剪后 score 的均值

想减去的量是 C=∑vqvmvρvsvC=\sum_v q_vm_v\rho_vs_v。采样端没有为每个前缀上报整个词表,只上报自己的头部 HH。论文把尾部的形状借自参考分布 rr,再按真实尾质量归一:

κ=1−∑v∈Hqv1−∑v∈Hrv,q~v=κrv(v∉H).\kappa=\frac{1-\sum_{v\in H}q_v}{1-\sum_{v\in H}r_v}, \qquad \tilde q_v=\kappa r_v \quad(v\notin H).

估计时让尾部的裁剪不生效,尾部系数变成 κrv(pv/rv)=κpv\kappa r_v(p_v/r_v)=\kappa p_v。因为完整的 ∑vpvsv=0\sum_v p_vs_v=0,尾部那半个和等于负的头部和。于是

C≃∑v∈Hqvmvρvsv+κ∑v∉Hpvsv=∑v∈H(qvmvρv−κpv)sv,g^DLC=∑tAt(mtρtst−Ct).\begin{aligned} C&\simeq\sum_{v\in H}q_vm_v\rho_vs_v+\kappa\sum_{v\notin H}p_vs_v\\ &=\sum_{v\in H}(q_vm_v\rho_v-\kappa p_v)s_v,\\ \hat g_{\rm DLC}&=\sum_t A_t(m_t\rho_t s_t-C_t). \end{aligned}

式中的 CtC_t 是右侧的估计。按论文式 (6)、算法 1 和附录 L,AtA_t 乘的是整个括号。否则优势恒为零时还会有梯度,也无法用同一个常数抵消两项。头部技巧节省了采样日志;实际采到尾部 token 时,样本项仍使用它自己的滞后比率与裁剪。若真实尾部不与 rr 成比例,或强裁剪主要发生在尾部,估出来的均值就会有偏。固定 top-128 便于打包,按累计质量自适应会更接近控制尾误差的目标,但会增加变长日志和批处理开销。

6.3 怎样看出它只在一定范围内有效

当裁剪不生效时,qvρv=pve−evq_v\rho_v=p_ve^{-e_v}。在固定前缀、用精确均值并固定优势函数的条件下,减去 on-policy 梯度并加减 pp 下的优势均值,得到

btok,DLC=Ep[(e−e−1)(a−Ep[a])s]−(Eq[a]−Ep[a])Ep[e−es].\begin{aligned} b_{\rm tok,DLC}={}& \mathbb E_p[(e^{-e}-1)(a-\mathbb E_p[a])s]\\ &-(\mathbb E_q[a]-\mathbb E_p[a])\mathbb E_p[e^{-e}s]. \end{aligned}

第一行只在动作权重里留下数值差;第二行有滞后,但乘着 Ep[e−es]\mathbb E_p[e^{-e}s],后者在 e=0e=0 时为零。因此小误差展开里,滞后通过与数值差相乘才进入这个局部动作项。注意这个结论没有修复前缀和续写,也没有说数值差本身无害。大量 token 出界后,裁剪主动放弃一部分抵消,于是需要从采样侧缩短版本距离。

同版本时 ρ=1\rho=1 且不触发裁剪,DLC 化为 score 中心化;引擎完全对齐且裁剪未触发时,κ=1\kappa=1、C=0C=0,局部更新就是以采样版本为参考的 PPO 更新。若引擎对齐但裁剪生效,CC 未必为零。刷新只能让接下来生成的数据用新版本;它不能把已经入队的旧回答变成新策略产生的回答。

图 6:先更新,再按滞后比率决定是否换版本

图 6:依据论文算法 1 自绘。参考前向提供样本与头部的概率;重同步用裁剪前的滞后比率判断,影响下一批。

算法 2:一次 DLC 更新

1. 采样端记录生成版本、样本 log q 和头部 log q。
2. 计算每个 prompt 的组内优势。
3. 训练端回放生成版本,得到样本和头部的 log r。
4. 用当前权重得到 p,求 rho 与随优势符号改变的掩码。
5. 用头部和匹配的尾质量估计裁剪后 score 的均值。
6. 将该均值写成停止梯度的系数,加入 PPO 损失并更新。
7. 若滞后比率二阶矩的倒数小于 0.5,复制新权重。
8. 连续异步时逐 token 绑定版本,另记被延期和重采样的回答。

附录 L 的最小化损失是原 PPO 损失加 ∑tAt∑v∈Hsg⁡(qvmvρv−κpv)log⁡pv\sum_t A_t\sum_{v\in H}\operatorname{sg}(q_vm_v\rho_v-\kappa p_v)\log p_v,sg⁡\operatorname{sg} 表示停止梯度。新增项求导是 +∑tAtCt+\sum_t A_tC_t,转成梯度上升方向才是减去它。若系数不停止梯度,自动求导会穿过 ρ\rho 和 pp,产生论文估计器之外的项。论文损失将比率限制在 [e−20,e20][e^{-20},e^{20}];实际记录诊断矩时宜同时说明用的是哪份比率,并用对数域归约处理极端值。

6.4 算一遍头部近似什么时候会漏

固定一个四动作前缀,取采样、参考、当前概率为 q=(0.60,0.25,0.10,0.05)q=(0.60,0.25,0.10,0.05)、r=(0.55,0.25,0.12,0.08)r=(0.55,0.25,0.12,0.08)、p=(0.50,0.30,0.10,0.10)p=(0.50,0.30,0.10,0.10)。头部为前两项。只看第一个 logit 的 score 方向,四个 score 为 (0.5,−0.5,−0.5,−0.5)(0.5,-0.5,-0.5,-0.5)。设优势恒为正,沿用 0.2 的裁剪半径。比率依次为 10/11,1.2,5/6,1.2510/11,1.2,5/6,1.25;最后一项被裁掉,第二项恰好在边界,本算例保留它。真实均值包含前三项,约为 0.08106。

头部已知道前两项的精确贡献。估计器的尾质量比为 0.15/0.20=0.750.15/0.20=0.75,于是把尾部两个动作都按未裁剪处理,给出估计尾贡献 0.75(0.10+0.10)(−0.5)=−0.0750.75(0.10+0.10)(-0.5)=-0.075;真实尾贡献只有 0.10(5/6)(−0.5)≃−0.041670.10(5/6)(-0.5)\simeq-0.04167。估出来的 CC 约 0.04773,因此优势为一时的期望残余约 0.03333。两边尾质量完全匹配,中心化仍不精确;失配来自尾部内部的概率形状,以及尾部里真的存在被裁剪的动作。

这个例子是给附录 K 的假设加一个直观边界,不是对论文实验的反证。实际 top-128 与四动作里的 top-2 不可类比为同样的误差率。应当问的是,在出现尾重、生成变长或大量出界时,遗漏的带权 score 是否足以改写梯度。如果要增加遥测,可以先抽查部分前缀的完整词表,比较严格均值、尾部未裁剪近似和只看头部三种结果,再决定是否扩大头部。直接在每个位置输出完整词表会大幅增加通信与内存,未必值得。

7. 实验:稳定、答对和省时间分别看

7.1 先弄清对照和分母

主实验以 Qwen3-0.6B、1.7B 非思考模式做 Countdown。每步 64 个 prompt、每个八个回答,prompt 和响应分别最多 135、377 token。BF16 训练计算配 FP32 主权重、FSDP2;用无动量、无预热、无权重衰减的 SGD,学习率 0.01,主实验每个配置三次、40 步。局部反馈实验另用了 0.005。量化场景的采样端用 FP8 分块权重、动态激活量化和 FP8 KV;冻结场景是 BF16,名义上每 64 步更新,主对照的 40 步中不会定期刷新。参照用 BF16 vLLM 和 CUDA graphs。

偏离量是在初始策略产生的固定前缀上,对训练后模型到配对 on-policy 模型的全词表 KL 求平均。用两次独立 on-policy 训练之间的平均 KL 做分母,得到噪声底线倍数。倍数 1 表示跟参考之间的典型差异相当,不是置信区间;小于 1 也不代表策略相同。测试准确率另在 64 道留出的 Countdown 上每题采八次,反映模型自己生成时能否完成任务。

7.2 0.6B:同一个修正,换了误差源就换排名

下面摘取论文表 2 第 40 步。每格为「偏离倍数 / 测试准确率」,破折号是论文未报告,不是零。

修正FP8 采样冻结 BF16冻结 FP8
On policy1.00 / 46.5%1.00 / 46.5%1.00 / 46.5%
普通梯度12.7 / 26.4%345 / 0.2%107 / 0.2%
截断重要性权重0.74 / 43.2%4.50 / 20.9%3.91 / 27.1%
Score 中心化0.80 / 46.5%31.7 / 12.2%28.1 / 18.4%
权重加中心化1.11 / 46.0%2.10 / 32.0%2.61 / 30.5%
DLC—1.93 / 31.7%2.17 / 30.3%

图 7:切换误差来源会改变估计器排序

图 7:依据论文表 2 重绘。纵轴是对数刻度的 KL 倍数,横向每组对应不同采样端,空缺配置未绘制。

这里最稳的结论是普通中心化在量化下足够,在冻结下不够。量化时中心化能到 46.5%,冻结时只有 12.2%,相差 34.3 个百分点。DLC 和「重要性权重加中心化」的名次则不稳:冻结条件下,均值之比是 1.93 对 2.10,逐次比值取均值却是 2.70 对 2.51;两者准确率还只差 0.3 个百分点。这个例子也说明平均的顺序为何值得写在表头。噪声底线小的配对,若逐对归一,会得到更大的权重。

7.3 1.7B:重同步恢复了什么,旧前缀又漏掉什么

论文表 4 的冻结实验里,DLC 第 40 步为 0.6 倍、51.9%,on-policy 准确率 57.6%。三次各同步一次,在第 20、35、36 步;截断权重单用时是 115 倍和 0.5%,加相同阈值的同步后变成 2.6 倍和 36.6%,三次分别复制 2、4、5 次。这个对照已经说明同步本身有很大作用。它还不能说明「中心化加裁剪」在同等复制成本下会好多少,因为不同估计器又改变了触发时间。

图 8:原论文图 5,同步、训练崩溃和固定探针盲区

图 8:裁自原论文第 14 页图 5。面板 (b) 三角形是刷新事件,(a) 固定前缀偏离量接近噪声底线时,(c) 和 (d) 仍可能显示崩溃。

关掉同步的 DLC 三次里有两次准确率跌到初始模型以下,其中回答长度缩短到约 26 token。另一种崩溃出现在加同步的重要性采样中,回答跑到了长度上限。两种方向都可能被旧前缀探针漏掉。论文让当前模型自己采样,沿响应计算它到初始模型的 log-ratio,并把初始模型条件概率低于 10−310^{-3} 的动作贡献加起来,再除以总和。两次不刷新崩溃时这项比例约为 90%,此前最多 14%;完整 DLC 一直不超过 11%。论文所谓「离开支持集」是低概率的操作定义,并非这些动作在旧模型下概率严格为零。分子分母都是带符号的 log-ratio 加总,不是罕见 token 的采样频率;总 KL 很小时也不宜单独解释这个比例。

一个说明性的覆盖算例:旧策略以 10−510^{-5} 的概率进入某前缀,新策略以 10−210^{-2} 进入。各采 1000 条响应,期望出现次数是 0.01 对 10。在旧采样器的固定探针上几乎没机会看到它,在当前模型上却足以影响评测。真实训练并没有这个虚构前缀,算例只说明「探针没亮红灯」和「新策略没出问题」之间的差别。

7.4 8B、连续异步与每步时间

8B 冻结实验每行一次。DLC 为 3.1 倍、49.6%;重要性权重加中心化 2.9 倍、51.8%;on-policy 55.3%。普通中心化虽有 89.1 倍 KL,准确率仍 51.4%。这组数据提醒我,同一可验证任务上答对的比例相近,策略分布仍可能完全不同;反过来,固定探针距离近也不能替代回报评估。

连续异步的 1.7B 实验里,最大版本差为 4,按 token 平均为 2.85。不同方法每项只跑一次:普通 DLC 为 1.2 倍、55.9%;附带准入机制的 DLC 为 0.8 倍、55.3%;重要性采样为 1.4 倍、52.9%;on-policy 准确率 56.8%。准入变体将 ESS 低的整条响应延后并重新生成,40 步共延后 68 条,论文约计 0.3%,每步 94.2 秒;普通 DLC 为 80.1 秒,重要性采样 43.7 秒。数据支持后续实验,不能据此概括多模型、多集群的吞吐收益。

图 9:冻结 1.7B 实验的每步用时

图 9:按论文表 7 重绘。浅色部分为总步时减去生成、参考前向和更新之后的其余用时。

在冻结实验,DLC 每步 113.2 秒,对比 on-policy 50.4 秒、带同步的截断权重 52.7 秒。DLC 的参考前向就用了 54.2 秒。论文把其中约 19 秒归到没有参与损失的冗余参考路径。只做减法得到 94.2 秒,仍约为该 on-policy 配置的 1.87 倍;这只是反事实算术,不是实测加速。相比之下,DLC 每次权重复制不超过 1.5 秒,40 步只发生一次。这个环境里省同步次数并不能抵掉参考回放与日志的额外开销。

8. 局限

实验范围。 主要证据来自一种算术任务、短截断、一个稠密模型家族、40 步和简单 SGD。动量类优化器还保存梯度历史,复制权重不等于重置偏差在优化器里的积累。长链推理、工具使用或 MoE 路由改变时,旧策略和新策略的覆盖差可能更大,同版本数值差的经验稳定性也未必成立。8B 和连续异步的各行只有一个种子,应视作扩展试验。

推导范围。 偏差的局部近似要求固定一段时间内的梯度统计,测量没有把续写项估全。较好的拟合说明存在与位移相关的残差,并不能排除本来就随训练变化的梯度曲率。附录 I 用高斯比率推导上下尾概率,若要把它们换成「被裁掉的正负优势 token 比例」,还要知道按优势符号条件化的比率分布。论文图 3 本身就表明两者会关联。

指标范围。 半数阈值是在特定环境里观察到的经验界线。它既不能控制每个 prompt 的最差覆盖,也不能告诉我们被裁掉的少数样本是否拥有很高价值。旧策略低概率的动作也可能是有用的探索。把低概率贡献占比单独当作失败告警,会误报;只看固定前缀 KL,又会漏报。

系统结论。 论文按步比较准确率和耗时,未在相同墙钟时间、相同 GPU 预算或相同目标准确率下比较训练进度。额外的参考快照需要怎样存取,在大规模多机上是否把压力转移到内存、网络和批次等待,不能由当前步耗时推出。

9. 批判性分析:我会怎样做下一轮实验

9.1 把触发器改成双视角

旧采样器能回答「当前可用的数据是不是已经很旧」,当前训练器能回答「新策略实际在做什么」。在旧数据流上,我会按生成版本、序列位置、任务和优势符号报告比率的一阶、二阶矩,另外报告 Kish 比例、丢掉的有效 token 比例和被裁掉的优势权重。用 prompt 组做重采样区间,因为一个组的奖励基线是共享的,不能把几百个 token 当成几百次独立试验。这样,如果整体 ESS 还高、但少数有用的高回报动作已被裁掉,也能看到异常。

在另一条小探针上,让训练端定期用最新权重回答一批留出问题,观察准确率、长度分布、初始策略低概率 token 的真实频率、原始序列 KL,以及归一后低概率贡献。ESS 降低且新策略探针恶化时优先刷新;只有其中一个信号恶化时先用少量新轨迹确认。两条信号对不同的失败模式负责,可以解释是数据老化、质量崩溃,还是有益的分布迁移。运行这条探针也有成本,应记录占用了多少生成时间和训练设备。

9.2 让每种估计器有相同的刷新机会

论文最难直接归因的一点是:估计器影响位移,位移影响 ESS,ESS 又影响刷新次数。要拆这三层,可把估计器设为 DLC、仅滞后权重、仅中心化和组合权重四组,每组做冻结、固定频率、适应性触发,再加一组事先在留出种子上校准的等复制预算。固定频率组把数据年龄限制在同一区间,帮助估计单步修正带来的差异;适应性组则衡量每种算法为了保持同等质量需要复制几次。至少跨过数个刷新周期,再比较相同训练时间内的准确率和崩溃频次。

对于延期再生成,还要统计被延期样本的难度、长度和奖励。若长答或低奖励任务更容易遭延期,进入梯度的分布发生了变化。可以在边界附近抽取少量对照,比较接纳和延期之后的新样本,观察是解决了滞后,还是无意中把训练课程改成了短答案。在报告系统成本时,应加上废弃 token 数、重生成延迟和训练器等数据的时间。

9.3 给局部理论安排可失败的验证

我会在一组共享检查点上预先选好投影方向,例如对齐的平均梯度方向和几个独立的随机方向。然后在相同输入上测同版本误差、改权重造成的差、修正后残差,比较其投影及不确定性。加入一项明确干预:只刷新采样权重,不变其他设置,检查滞后相关残差是否如理论下降。若固定前缀上的引擎差也明显跳变,就需要放弃这一轮的「固定偏差」假设,但三分布恒等式仍然成立。

头部近似也能有更直接的验证。把 top-128 改为几档头部规模,同时记实际尾质量;对少量前缀额外收集更宽的分布,估计尾部 score 偏差。若头部质量已经很高而误差仍集中在几个罕见候选,应调整头部选择或采样规则,而不是盲目扩大所有日志。这样可以把性能花在真正影响梯度的地方。

9.4 用墙钟预算检验同步策略

如果目标是把方法放进异步流水线,计时不能只看一次复制有多快。设 TstepT_{\rm step} 是固定训练成本,TreplayT_{\rm replay} 是参考前向的边际成本,TrefreshT_{\rm refresh} 是一次刷新占用的关键路径时间,ff 是每步平均刷新次数。粗略地,每步成本至少要比较 Tstep+Treplay+fTrefreshT_{\rm step}+T_{\rm replay}+fT_{\rm refresh};若还有延期响应,则应另加等待与重生成,并区分可被流水线掩盖的时间和真正阻塞训练器的时间。用同一批数据对比时,不能把已经包含在总步时里的同步成本再加一遍。

以表 7 的量级说明:DLC 比带同步的重要性采样平均少复制约 2.7 次每 40 步,但每步慢 60.5 秒。若只让这 2.7 次复制差额抵消总步时差,所需差额约为每次 896 秒;这是一个把其他因素假设为不变的成本换算,并非部署预测。原实验复制最多约 1.5 秒,显然离这个假设边界很远。对于实际集群,更有意义的对照是拿同样的墙钟预算,统计消耗了多少训练 token、刷新和重采样分别用掉多少时间,并比较到达目标准确率的分布。若方法在固定步数更稳,却在相同时间里还没走到那个训练区间,就应把这两条结论同时报告。

10. 复现实验前我会确认的口径

首先做四格设计:对齐参考、只量化、只冻结、同时量化和冻结。固定 prompt 集、奖励、同一位置的 token ID、抽样概率、组内基线和按 token 的归约。选择配对 on-policy 种子和固定探针,先确认同位置的三个对数概率能闭合,再比较各修正如何改变漂移、剩余偏差和模型自采样的表现。同步前后分开记比率矩和样本生成版本。连续异步实验则另外记准入规则和延期样本量,以免将新的筛选偏差误归到数值误差。

本笔记实际核对了二项例子的精确期望与 logit 差分、Gaussian 阈值、触发点的矩差和表格的百分点及时间比;没有重新训练模型。若要单测数学定义,可以在很小的词表上令优势为常数,检查精确均值减除后期望为零;再令 p=rp=r 但保留 q≠rq\ne r,检查滞后恰为零而数值差仍在。这两项能检查公式符号、优势的括号位置和参考分母,却不能验证论文报告的训练效果。

10.1 建议保留的一张对照表

每个种子固定报告几列:训练步、已用秒数、旧到新的 KL 和固定前缀上的模型间 KL、比率矩、丢弃与重新生成的响应数,以及当前策略的答题准确率。前两种 KL 的方向和探针不同,应有各自列名;另报噪声底线的原始数值,避免只剩无量纲倍数。旧到新的 KL 用采样时版本的路径来估,当前策略的罕见 token 贡献则必须用当前策略自己生成的回答。这样同一日志可以回答「比率什么时候变坏」和「策略是否真的开始答错」两件事。

跨配置比较时,我会同时给固定步数和固定耗时的图,给同一 prompt 池上的配对差值及不确定区间。若某个种子提前崩溃,把它作为结果保留,不能只对活下来的曲线取平均。还要区分刷新前后一批样本实际携带的版本;若同步后还有旧请求尚未出队,所谓「刷新后的 ESS」不应把它们与新版本混成一个数。完成这些对照之后,才有条件讨论阈值该不该从 0.5 调整,或改成能随着任务、代价与版本距离变化的策略。

11. 结论

DLC 让我重新看待训推差异:先确认同一个动作究竟在哪份策略和引擎下生成,再问什么能在这一批数据上校正,什么必须通过改变下一批的来源解决。参考前向把版本差和数值差分开;裁剪滞后权重和减去其均值各处理不同的局部项;重同步才把未来的前缀重新交给更接近当前的策略。论文的 1.7B 冻结对照支持这一解释,同时也给出固定前缀探针漏报、参考前向昂贵的反例。下一步最有价值的问题是:在相同时间和质量目标下,这些额外信息与刷新决策是否仍然划算。

技术来源: Li、Zhou、Lan 的 arXiv v1,重点为第 2–7 节及附录 A–L;PPO;DeepSeekMath / GRPO。