在大模型的强化学习训练里,「on-policy」这个词的成色可能没你想的足。主流训练栈通常在同一份权重上跑两套系统:推理引擎负责采样回复,训练器负责算梯度,论文里引用的标准配置就是 vLLM 采样加独立训练器。两套系统的数值实现和权重版本对不齐,「从当前策略采样」的假设就悄悄打了折扣——此前已有研究者报告 vLLM 与 FSDP 在完全相同的权重下给出不同的 token 概率。10 月 29 日挂上 arXiv 的这篇论文,把这类训练-推理失配拆到了可测量的粒度。
两个来源,两种动力学
作者先做减法:把基建层的干扰对齐消掉——top-p 采样让上报的分布与实际采样的分布不一致、解码后重新切分 token 改变序列、按奖励过滤回复让批次组成依赖结果。对齐之后,真正到达算法层的失配只剩两个:引擎数值差与权重版本差。拆法本身很干净:让训练器在采样器的权重处做估值,每个采样 token 的误差就能精确分成两块——引擎的数值差、训练器的策略滞后。两块的动力学截然不同:数值差在训练全程近似恒定,像一个固定偏置,在每个前缀上做 score centering 就能消掉主要部分;策略滞后则是训练器自己造成的,上一次更新留下的偏差进入下一次更新,又放大下一次滞后,形成正反馈回路。
实验设置
训练跑在 verl 里,采样用 vLLM:Qwen3-0.6B 与 Qwen3-1.7B 的 non-thinking 模式,Countdown 任务,±1 奖励,每步 64 个 prompt、各采 8 条回复,SGD,共 40 步,每个配置三个种子。采样器设四档:BF16 加 CUDA graphs 的参考档(on-policy 基准)、FP8 权重(128×128 分块)加动态激活量化加 FP8 KV cache 的量化档、每 64 步才同步一次的 stale 档(40 步内基本停在初始权重),以及两者的组合档。
一条失效定律
重要性加权只能在这个反馈环的比值还集中时切断环路。论文给出的判据是滞后比值的有效样本量:跌破一半,修正失效。Qwen3-1.7B 上比值的重尾让交叉点在第 11 步就到来,比高斯预测早三步,重要性采样随即离开噪声底。量级对比很直观:量化源下各修正基本贴着噪声底,策略梯度本身是噪声底的 13 倍,score centering 复现了 on-policy 训练 46.5% 的测试精度;换成滞后源,score centering 冲到 32 倍噪声底、终点测试精度只剩 12.2%,重要性采样加居中为 2.1 倍、精度 32.0%,以每批前训练器为参考的 PPO 则达到 699 倍。
DLC 与看不见的塌缩
由此导出的修正叫 discrepancy-lag correction:居中数值差、按采样器权重截断滞后比值、在有效样本量跌破一半时把采样器重同步到训练器权重。stale 源下,DLC 把与 on-policy 训练的偏差控制在两倍噪声底之内(Qwen3-0.6B 上 1.9 倍),1.7B 的三条 run 各在第 20、35、36 步触发一次重同步,全程贴住噪声底;给重要性采样配上同阈值重同步,偏差从 115 倍降到 2.6 倍。最扎心的发现是塌缩的隐蔽性:不做重同步时,两次塌缩点落在初始策略概率低于 10^-3 的 token 上的占比冲到约 90%,此前至多 14%;带重同步则全程不超过 11%。可同一时刻,采样器前缀上的 next-token KL 仍落在正常训练的范围里——漂移发生在 stale 采样器到达不了的前缀上,只盯采样器侧的监控,塌缩是看不见的。跨检查点看,这个 off-support 占比对精度下跌的排序相关(Spearman 0.80)也高于偏差本身(0.74)。
所以呢
这篇论文的价值不在又一个训练 trick,而在把一个工程痛点变成可测量对象:数值差恒定、滞后自放大,修正手段因此必须分开;有效样本量跌破一半就是重要性加权的失效线,重同步比调系数更根本。对跑异步 RL 的人,监控清单值得加一条——训练器自身响应的 off-support 占比;只在采样器侧量 KL,可能到发散了都还蒙在鼓里。