论文链接:On the Origin and Evolution of Training-Inference Mismatch in LLM Reinforcement Learning (arXiv:2610.40945) | bf16 Rounding Silently Discards Most RL Policy Updates (arXiv:2610.41073) 发表时间:2026 年 10 月 29 日(两篇同日提交) 机构:论文一——George Washington University + Duke University(Yu Li 与 Yufa Zhou 共同一作,Tian Lan 通讯);论文二——Stanford University(Andrew Gao、William Gao 两人) 领域标签:cs.LG / LLM 强化学习系统 / on-policy 校正 / 低精度训练
引言
LLM 强化学习的 on-policy 承诺写起来只有一句话:训练响应应当从当前策略采样。但工程上,这个承诺由两台机器共同兑现——推理引擎(vLLM、SGLang)负责采样,训练器负责算梯度,两者的权重版本不同、数值内核不同,训练数据因此悄悄 off-policy 化。2026 年 10 月 29 日,两篇同日出现在 arXiv 上的论文从不同的层面对这个失配做了清算:一篇问失配由什么构成、如何随训练演化、该在哪一层校正;另一篇问当失配藏在权重导出的舍入规则里时,为什么所有现有诊断都看不见它。
论文一来自 George Washington University 与 Duke University。它注意到一个悬而未决的谜题:同一套校正方法,在不同的失配源下表现完全相反——score centering 在量化采样器下最好、在陈旧采样器下失效,PPO 抗陈旧却在量化下崩塌。作者的诊断手法是让训练器在采样器的权重上多做一次前向:这个第三视角把每个采样 token 的误差精确分解成「数值差异」与「策略滞后」两个分量,并追踪二者在训练中的动力学——前者近似恒定、只留下近乎固定的偏置;后者由训练器自己的更新制造,残差偏置进入下一次更新、放大下一次滞后,构成反馈环。由此导出的 DLC 校正按分量性质分配层级:centering 消常数偏移、clip 截断滞后环、有效样本量跌破二分之一时回到基础设施层重同步采样器,deviation 一路贴着 on-policy 噪声底走。
论文二来自 Stanford,撕开的是更深的一层。RL 后训练普遍用 fp32 主权重配 bf16 服务副本,而导出用的是 round-to-nearest 舍入——它丢弃一切小于半个格距的更新。在常用学习率 1e-6 下,几乎所有 Adam 更新都小于 u/2:Qwen3-1.7B 每步只有 0.4–0.5% 的服务权重真正变化,采样器实际执行的是 50–150 步前的旧策略。最要命的是,所有框架的失配诊断比较的是训练器前向与采样引擎这两个同在舍入下游的副本,比值恒接近 1——梯度永远看不到被丢弃的那部分更新。修复只需一行:导出改用随机舍入或误差反馈使更新无偏,同时在服务副本上计算训练 loss;25 个配对种子 18 胜 6 平 1 负,平均 +6.1 分。
两篇论文合起来读,会得到一条超出各自贡献的系统论:训练循环里最危险的偏差,恰恰是梯度与标准诊断都看不见的那种。论文一里,它在采样器够不着的前缀上积累成 off-support 塌缩;论文二里,它在舍入死区里积累成 50–150 步的策略滞后。下面按论文一、论文二各自完整走一遍题目、背景、定位、问题定义、解法、知识反推与通用灵感,最后做两篇的对比与交汇。
论文一:On the Origin and Evolution of Training-Inference Mismatch in LLM Reinforcement Learning
1.1 题目与基本信息
- 作者:Yu Li(George Washington University)、Yufa Zhou(Duke University)(共同一作)、Tian Lan(George Washington University)
- 链接:arXiv:2610.40945,代码开源于 github.com/Skylanding/Training-Inference-Mismatch
- 一句话:用训练器在采样器权重处的一次前向,把采样 token 误差精确分解为近似恒定的数值差异与自我放大的策略滞后,再按两个分量的动力学性质分层校正——centering、clip、有效样本量触底时重同步——使陈旧采样器下的训练 KL 始终贴住 on-policy 噪声底。
题目里的两个词就是论文的骨架。Origin(起源):失配不是一团混沌,它有两个可精确分离的来源——引擎数值与权重版本,二者以完全不同的方式进入梯度。Evolution(演化):两个分量在训练中走完全不同的轨迹——数值差异全程近似恒定(量化误差约 0.02 nats/token),策略滞后随累积更新增长两个数量级,且它的增长由校正自身的残差偏置驱动,是一个闭环系统。校正方法的设计因此不能再是单点技巧,而要匹配每个分量的动力学。
1.2 背景
LLM 的 RL 训练栈是天然分裂的:vLLM 一类的推理引擎用专属 kernel 与低精度计算 token 概率,即使权重完全相同,其分布 q 也与训练器分布 p 不同(Yao et al. 2025 与 Liu et al. 2025 的两篇博客首次量化了这一点);AReaL、PipelineRL 一类的异步系统再叠加第二源——采样器持有上次同步的旧权重,训练器继续前进。二者合起来,作者称为 training-inference mismatch。
已有工作提供了三件武器:截断重要性采样(每个 token 乘以截断比值 p/q)、score centering(在每个前缀处减去采样器平均分,消去 drift)、PPO 式 clip(把训练器对参考策略的比值截断)。但 Marek 与 Ryabinin 2026 年的实验暴露了谜题:校正的效果取决于失配的来源。量化采样器下 score centering 一枝独秀;陈旧采样器下 centering 落后于重要性采样;PPO 扛得住陈旧却在量化与合成权重噪声下崩塌。为什么没有一种校正能通吃?此前的回答停留在「clip 是为策略移动设计的比值」这类定性解释。更早的工程线也各自为战:batch 不变 kernel、跨 tensor 并行的确定性推理、FP16 训练、FP32 语言模型头、MoE 路由重放——都在压低数值差异,但没有一条线问过两个来源是否需要不同性质的校正。
论文一的第一步是把失配按「哪一层能校正它」整理成一张两层清单(原文 Table 1):
| 层级 | 失配 | 来源 | 已有校正 |
|---|---|---|---|
| 基础设施层 | 权重版本 | 异步 rollout | 同步、有界陈旧度 |
| 基础设施层 | 引擎数值 | 低精度、kernel | batch 不变 kernel、FP16 训练 |
| 基础设施层 | 采样与上报 | top-p、处理后 log 概率 | 上报真实采样分布 |
| 基础设施层 | 序列一致性 | 重分词 | 直接传 token id |
| 基础设施层 | 响应筛选 | 按奖励过滤、部分 rollout | 与结果无关的组批 |
| 算法层 | 策略滞后 ℓ_t | 权重版本,随更新增长 | decoupled PPO、M2PO、VCPO |
| 算法层 | 数值差异 e_t | 引擎数值,训练中近似固定 | 截断重要性采样、score centering |
一旦基础设施把采样、上报、序列对齐(论文的实验配置消掉了后三行),到达算法层的就是且仅是两个分量——而只有权重版本会随更新变化。这张表是全文逻辑的地基:失配的来源决定它的动力学,动力学决定校正应该放在哪一层。
1.3 定位
这篇论文的贡献可以放在四个同心圆上:
| 层面 | 贡献 | 关键结果 |
|---|---|---|
| 概念 | 采样误差的精确两分量分解 | 第三视角前向(训练器 numerics @ 采样器权重 θ_old)使 δ_t = ℓ_t + e_t 成为恒等式,而非近似 |
| 理论 | 滞后分量的反馈环分析 | 残差偏置 b ≈ −MΔ,score centering 的超额更新范数含 (ηk)² 正项,c = 0.52(R² = 0.987) |
| 理论 | 重要性加权的有效范围 | 比值重尾使 ESS 提前跌破 1/2:1.7B 上实测 step 11,比高斯预测早 3 步 |
| 系统 | DLC 校正 | 贴噪声底(1.7B 全程 ≤1.2×,终点 0.6×),重同步阻断 per-token 校正够不着的 off-support 塌缩 |
与已有工作的边界:Guan et al. 2026 已经证明重要性比值可分解为「训练-推理差异 × 策略陈旧」两个因子,本文站在这个因子分解上,但回答的是它们没有回答的问题——两个因子进入训练循环后的演化规律,以及各自的失效边界。GAC、SAT、GMC-GRPO 等针对更新的方法则不做 lag 与 discrepancy 的分离,因此无法解释 source dependence。DLC 的每个组件都有出处(centering 来自 Marek & Ryabinin,clip 参考策略取采样器权重,ESS 阈值重同步借鉴 Guan et al. 的 0.9 重置思想),论文的原创性不在组件而在「按分量动力学分配校正层级」这个因果闭环。
1.4 问题定义
形式化设置:训练器在权重 θ 下的下一 token 分布为 p_θ,采样器从 q 采样响应。每个被采样 token y_t 在前缀 h_t 处有分数 s_t = ∇_θ log p_θ(y_t|h_t) 与优势 A_t。在固定前缀上,采样器下的更新精确分解为:
$$\mathbb{E}_q[a\,s] = \mathbb{E}_q[a]\,\mathbb{E}_q[s] + \mathrm{Cov}_q(a, s), \qquad \mathbb{E}_q[s] = -\nabla_\theta \mathrm{KL}(q \,\|\, p_\theta)$$第一项 ā·s̄ 就是 drift:它只通过优势的均值起作用,等价于以步长 ā 对 KL(q‖p_θ) 做一步梯度——在期望优势为正的前缀上把训练器蒸馏向采样器、为负则推开。组中心化把每个 prompt 的平均优势归零,但通往正确答案的前缀天然携带正期望优势,所以 drift 恰好压在学习信号最重的地方。
被采样 token 的误差 δ_t = log p_θ(y_t|h_t) − log q(y_t|h_t) 无法直接归因,但引入第三个 log 概率——训练器 numerics 在采样器权重 θ_old 处的前向——就能恒等地拆开:
$$\delta_t = \underbrace{\log p_\theta(y_t|h_t) - \log p_{\theta_\mathrm{old}}(y_t|h_t)}_{\ell_t\ \text{策略滞后}} + \underbrace{\log p_{\theta_\mathrm{old}}(y_t|h_t) - \log q(y_t|h_t)}_{e_t\ \text{数值差异}}$$核心问题是:失配源的哪个性质决定它需要哪种校正? 实验装置围绕这个问题搭建:四种采样器(参考:vLLM BF16 + CUDA graphs,即 on-policy;量化:FP8 权重 128×128 分块 + 动态激活量化 + FP8 KV cache;陈旧:BF16 但每 64 步同步,40 步内始终持有 θ_0;组合:把 θ_0 再量化),训练 Qwen3-0.6B 与 1.7B(非思考模式,Countdown 任务,±1 奖励,每步 64 prompt × 8 样本,SGD 学习率 1e-2,每配置 3 次共 40 步,verl + FSDP2,BF16 计算 + FP32 主权重)。
评价指标设计得很讲究,两个量各司其职:
- deviation:训练后的模型对同配置 on-policy 模型的全词表 KL(在 θ_0 的固定探针前缀上测量),除以噪声底——两个独立 on-policy 训练之间的平均 KL。deviation 为 1 意味着与 on-policy 训练不可区分。
- 测试精度:64 个训练集外 Countdown 问题上以 8 样本测量,直接检验失配是否伤及任务表现。
这套测量协议还有两处工程上的讲究:一是短训练(40 步)加共享 checkpoint 的采样器回放,保证所有测量落在未崩塌的轨迹上;二是偏差测量用同一批次上「校正梯度减 on-policy 梯度」直接读出,并与梯度噪声(两个独立 on-policy 梯度之差)对比定标——这给了后续所有残差分析一个天然的显著性门槛。
1.5 解法
两分量动力学:一个恒定,一个闭环
40 步训练直接复现了 source dependence(0.6B):量化下重要性采样与 score centering(单独或组合)都贴住噪声底,裸策略梯度到 13 倍底,centering 拿到 46.5% 的 on-policy 满分精度;陈旧下 centering 冲到 32 倍底、精度 12.2%,IS+centering 停在 2.1 倍底、32.0%。为什么?
两个分量的动力学测量给出答案。量化采样器的数值差异全程约 0.02 nats/token,序列上累加成一个恒定的序列偏移(长响应上稳定在 8.9 nats)——它不依赖累积更新 Δ,每步以同样大小偏置更新、不反馈进后续误差,centering 消掉其一阶偏置即可。陈旧采样器的策略滞后则一阶近似为 ℓ_t ≈ Δ^⊤ s_t:滞后是训练器自己的移动在 token 分数上的投影,纯属自我诱导,序列偏移以每步约 0.7 nats 增长,40 步内在两个模型规模上都增长两个数量级。组合源实验验证了分解的可加性:数值差异保持量化单源时的数值,累积更新与纯陈旧运行相差在 10% 以内。
还有一个容易踩的坑被这套测量排除掉了:序列偏移的大小本身并不等于危害。量化下序列偏移高达 8.9 nats,残差偏置却始终贴着梯度噪声——偏置要走更新才成灾,恒定偏移没有通向更新的反馈路径;陈旧下偏移在 step 12 附近长到同量级时,score centering 恰好同期离开噪声底。危害的大小取决于偏移与梯度的协方差结构,而非偏移本身的幅度。
滞后的反馈环与 centering 的二次项
陈旧场景下训练环走过三段链路:累积更新 Δ_k 设定滞后 → 滞后设定校正留下的偏置 b_k → 偏置进入下一次更新,Δ_{k+1} ≈ (I − ηM)Δ_k + ηg_k。对 score centering,残差偏置精确展开为四项:前缀项、续写项、token 项、尾部项。数值差异给它们每步同样的大小;策略滞后给它们随 Δ 增长的部分。关键的 token 项 (A_t − Ā_t)ℓ_t 由 centering 保留、被重要性加权的比值消去——这就是 IS 在陈旧下更强的原因。
但比值加权有自己的死期。滞后比值 ρ_t = e^{ℓ_t} 的重尾使有效样本量 ESS = 1/E_q[ρ_t²] 提前崩塌:0.6B 上 step 40 高斯滞后预测 28% 的 token 比值低于 0.5,实测只有 11%——大部分 token 贴着比值 1,滞后集中在少数 token 上(step 5 时 lag 最大的 1% token 携带 78% 的总滞后)。1.7B 上实测 ESS 在 step 11 跌破 1/2(平均滞后 −0.15 nats/token),高斯值要到 step 14 才交叉;重要性采样的 deviation 恰好从 step 11 离开噪声底,step 30 冲到 152 倍。有效范围的重尾终点比高斯直觉早,早到哪一步完全可测。
学习率把环与固定偏置区分开:把 Δ_k 展开到二阶,环的贡献是 (ηk)² 的函数——半学习率重跑时所有曲线落在原曲线上,超额更新范数拟合 E = aηk + c(ηk)² 得 c = 0.52、R² = 0.987(纯线性只有 0.90)。这同时呼应了异步 GRPO 崩塌边界位于「同步间隔 × 学习率」常数积的既有结论。环的符号还能直接测出来:score centering 下负优势 token 携带更大的滞后(step 20 时两组平均滞后 −0.66 对 −0.37 nats),重要性采样下两组一致——低于前缀均值的 token 沿与其分数对齐的方向放大同伴的滞后,这正是线性化映射 M 出现负特征值、更新沿对应特征向量指数远离的微观机制;预测偏置与实测偏置的余弦最高到 0.55(梯度噪声只有 0.07)。
DLC:按分量性质分配校正层级
DLC 的每个 token 更新为 A_t(m_t ρ_t s_t − C_t),三件事各管一段:
- clip 滞后比值(ε = 0.2、对偶 clip 上界 c = 3,参考采样器权重):在有效范围内等价于比值加权,消掉设定环增益的 token 项;
- centering 项 C_t(采样器对加权分的均值):消掉数值差异的 drift——clip 后更新仍带着 q 与 p_θold 之间的差异,C_t 把常数优势前缀的期望贡献归零;
- ESS < 1/2 时重同步:把训练器权重拷回采样器,reset Δ、滞后与前缀偏移。算法本身够不着的部分(前缀项、续写项、越界 token)交给基础设施层。
DLC 在两个极限下退化为此前的方法:θ = θ_old 时退化为 score centering;q = p_θold 时退化为以采样器权重为参考的 PPO。成本为每步多一次训练器在 θ_old 处的前向(1.7B 上 DLC 步时 113.2 s,on-policy 50.4 s),重同步每次拷贝至多 1.5 s、40 步只需一次。
| 校正 | 每 token 梯度 | 比值分母 | centering | 自适应控制 |
|---|---|---|---|---|
| 重要性采样 | w_t A_t s_t | q | ✗ | – |
| score centering | A_t(s_t − s̄_t) | – | ✓ | – |
| IS + centering | A_t(w_t s_t − Σ q_v w_v s_v) | q | ✓ | – |
| PPO(batch 参考) | m̂_t r_t A_t s_t | p_θbatch | ✗ | K = 4 |
| M2PO | m_t^M2 ρ_t A_t s_t | p_θold | ✗ | – |
| VCPO | w̄_i Â_i s_t | q | ✗ | η·E[w̄²]^(−1/2) |
| DLC | A_t(m_t ρ_t s_t − C_t) | p_θold | ✓ | 1/E[ρ²] < 1/2 |
这张表的灵魂是比值分母:除以 q 的方法把数值差异和滞后一起加权;除以 p_θold 的只处理滞后;只有 DLC 在除以 p_θold 的同时用 centering 消掉差异的 drift。PPO 的 batch 参考把两者都留在比值外——这解释了它在陈旧下 699 倍底的崩塌(clip 只约束 batch 内移动),也解释了量化下它与策略梯度同水平(clip 省掉了多步更新的代价,却留着数值差异的 drift)。
结果:贴底,且挡住看不见的塌缩
陈旧采样器下的主结果(deviation 为噪声底倍数,step 40):
- Qwen3-1.7B:DLC 全程 ≤1.2×、终点 0.6×,测试精度 51.9%(on-policy 57.6%,θ_0 为 33.4%);重要性采样 115×、精度 0.5%;score centering 7.6×、15.9%;IS + 重同步 2.6×、36.6%(一个 run 崩塌拖累均值)。DLC 三个 run 各重同步一次(step 20/35/36),IS + 重同步要 2–5 次,固定间隔得每 11 步一次。
- Qwen3-0.6B:DLC 1.9×、31.7%(on-policy 46.5%);IS+centering 2.1×、32.0%;score centering 31.7×、12.2%;PPO 699×、0%。
- Qwen3-8B(单 run):DLC 3.1×、49.6%;IS+centering 2.9×、51.8%(on-policy 55.3%);score centering 89.1×;M2PO 10768×、0%;VCPO 14.0×、42.6%;PPO 1100×、20.7%。
- 连续异步(1.7B,最大版本差 4、平均滞后 2.85 版本):DLC 1.2×、55.9%;准入变体(推迟 ESS 不足的响应重生成,40 步仅推迟 0.3%)0.8×、55.3%。
最能说明重同步必要性的是消融:去掉重同步的 DLC 在 1.7B 上 3 个 run 崩掉 2 个——而崩塌发生时,在采样器前缀上测的 deviation 仍贴着底。真正的病灶在采样器够不着的地方:崩塌 run 的训练器响应里,初始策略概率低于 1e-3 的 token 占序列 KL 的比例(off-support share)跳到约 90%(崩塌前至多 14%);off-support share 对「精度跌破 θ_0」的排序力(Spearman 0.80)高于 deviation 本身(0.74)。token 级校正只作用于采样器画得出的 token,策略向采样器几乎不采的方向漂移时,clip、centering、比值加权集体失明——只有把采样器拉回训练器权重,训练器响应才能重新成为采样器响应。DLC 下 off-support share 全程 ≤11%,三个 run 全部守住 θ_0 之上。
1.6 知识反推
从这篇论文可以反推出一批关于 LLM RL 系统的「暗知识」:
- on-policy 是一个测度论意义上的理想,工程上只能逼近。噪声底(两个独立 on-policy 训练的 KL)给出了「逼近」的下限标尺——任何校正的 deviation 理论极限就是 1,而不是 0。这个指标设计本身就是可迁移的方法论。
- 重要性采样的死因不是发散而是 ESS 蒸发。截断比值在重尾下先失去有效样本量、后失去无偏性;「1/E[ρ²] < 1/2」是一个比 KL 监控更早报警的失效信号(Huang et al. 在序列级 IS 上观察到同样次序)。
- PPO 的参考策略放在哪里决定了它防什么。参考放采样器权重 → 滞后进比值、差异留在外面当 drift → 抗陈旧不抗量化;参考放 batch 前 → 两者都不进比值 → 连续更新下崩得更惨。这不是 PPO 的玄学,是参考点的代数。
- drift 是把训练器往采样器方向蒸馏的力,强度正比于前缀期望优势——它天然作用在「通往正确答案的前缀」上,因此 centering 不是锦上添花而是止痛。
- 异步崩塌已有标度律(崩塌边界在同步间隔 × 学习率的常数积上),本文的 (ηk)² 二次项给了它一个机理层面的微观基础。
1.7 通用灵感
- 分解先于校正。面对一个混合的病(这里的 δ_t),先找一个能把它恒等拆开的观察点(θ_old 处的前向),再按各分量的时间动力学开药——恒定的偏置用减法,闭环增长的用截断加断环。这套流程适用于任何「症状同源、病理不同」的系统问题。
- 反馈环的签名是控制变量的二次项。判断一个误差是外生偏置还是内生放大,把学习率减半重跑:曲线重合则误差只依赖走过的距离 ηk,出现 (ηk)² 超额项则环在起作用。这是一个廉价的因果检验。
- 监控量必须测在被校正过程能到达的空间上。deviation 在采样器前缀上测,恰好测不到 off-support 漂移;换成训练器自身响应的支撑分析才看见。任何系统的报警器都要装在故障真正发生的那套坐标里。
- 自适应控制的正确触发器是失效条件的直接量度。DLC 不用固定周期同步(IS 需要每 11 步),而是盯 ESS——「当工具失效的那一刻重置工具」比「按日历维护工具」便宜且稳。
- 指标的分母决定指标的哲学。deviation 除以噪声底而非绝对 KL,等于承认 on-policy 训练自身的随机性就是精度的极限——把「和理想一模一样」重新定义为「和理想的两次实现互差一样多」。这种归一化思维在任何 A/B 实验里都能防止对噪声的过度反应。
论文二:bf16 Rounding Silently Discards Most RL Policy Updates
2.1 题目与基本信息
- 作者:Andrew Gao、William Gao(Stanford University,两人)
- 链接:arXiv:2610.41073,代码开源于 github.com/andrewgcodes/faircast
- 一句话:fp32 主权重经 round-to-nearest 导出 bf16 时,小于半个格距的更新全部被静默丢弃,采样器实际落后优化器 50–150 步且梯度对此完全失明;把导出换成无偏舍入(随机舍入或误差反馈)并在服务副本上计算 loss——改动一行、零新超参、每 1.7B 导出仅增 22–38 ms——25 个配对种子上 18 胜 6 平 1 负,平均 +6.1 分。
题目值得逐词读:Silently(静默)——崩塌与滞后都不报错,训练曲线看起来只是学得慢;Most(大部分)——不是边缘效应,1e-6 学习率下几乎每个 Adam 更新都小于 u/2;Hidden(隐藏)——现有失配框架的比值诊断在结构上看不到它;One-Line(一行)——修复的工程成本被压缩到一次函数调用的替换。
2.2 背景
现代 RL 栈把优化器与服务分开:优化器持有 fp32 主权重 θ,vLLM/SGLang 持有 bf16 副本 q 负责 rollout。作者检查了所有主流开源框架——verl、TRL、OpenRLHF、slime、prime-rl、AReaL——全部用 round-to-nearest 从 θ 产生 q。
这个问题的物理尺度很朴素:bf16 只有 7 位尾数,权重 w 附近的格距 u ≈ |w|/128,round-to-nearest 丢弃一切 |∆| < u/2 ≈ |w|/256 的更新;而 fp32 主权重在初始化时恰好落在 bf16 格点上,所以死区从第一步就生效。常用学习率 η ≈ 1e-6 下,Adam 更新几乎全部落在死区内。Dirhoussi 与 Gallouédec 等人此前推导过同一阈值并观察到推理引擎「看到一个近乎静态的模型」,PULSE 测量过由此产生的稀疏性——但这两条线都把它当作通信层面的伪影:或让训练器迁就陈旧采样器(autocast 训练),或把变化的那约 1% bf16 元素当稀疏 delta 传输、宣称「零近似」。没有人问:被丢掉的那部分更新,对学习意味着什么?
顺带一提,同样的算术在 RL 之外也被独立观察过:三值模型的量化感知微调里,导出时的 bf16 舍入会回退低学习率的 code 改动、抹掉大部分微调收益(随机舍入或补偿写入可恢复);多教师 on-policy 蒸馏中,97% 的 fp32 主权重在移动,其 bf16 像只有 7–11% 在动。两项工作都没检查 RL 采样器,前者还明确把「RL 微调是否受影响」标为假设——本文正是对这个假设的直接检验。
2.3 定位
这篇论文的位置由一个区分决定:可见比值与隐藏比值。框架内部形成的比值是 ρ_loss = π_trainer(y)/π_sampler(y)——训练器前向与采样引擎之比,这正是 TIS 与 IcePop 所校正的 kernel 级数值差异;而真正控制策略梯度正确性的比值是 ρ = π_θ(y)/π_q(y)——fp32 主权重与服务副本之比。当训练器的 bf16 前向本身就是 q 的函数时,分子分母同源,ρ_loss 恒 ≈ 1,无论 θ 已经走了多远;而 ρ 从未被任何框架计算过。
由此定位出五个贡献:(1) 测量这个从未被形成的比值并解释 PPO clip、TIS、IcePop、autocast 为何在结构上看不见它;(2) Fair Cast 修复——无偏导出 + 在服务副本上训练,两半缺一不可;(3) 25 配对种子的端点比较;(4) 「checkpoint 不是模型」的工程发现;(5) 把 round-to-nearest 的隐式滞后识别为一个可以用 EMA 导出显式恢复的正则化器。在 Related Work 里作者也坦诚:prime-rl 有一个未合并的 PR 对 FP8 导出提出过随机舍入,但没有 bf16 场景、没有误差反馈、没有 served-copy 训练、也没有任何学习曲线。
实验配置的几个设计点值得记录:任务覆盖 Reasoning Gym 的逻辑题(knights-and-knaves、zebra、list functions、字符串操作、Countdown)、代码(MBPP+ 的 224 个训练集外题、HumanEval+)、数学(MATH、GSM8K)与带精确求解器的合成博弈(Nim、Kuhn poker);种子只拨动训练器 RNG 与 rollout 采样器、训练 prompt 序列对所有 run 固定,多种子结果因此度量的是采样与优化的方差而非数据顺序;每步 24 prompt × 8 组、GRPO 式 clip 目标(clip 0.2)、150 步(长 run 500 步)、H100 上 vLLM 采样器与训练器同卡共存、lag 1。
2.4 问题定义
死区分析:每步服务权重改变的概率为 Pr[η| m̂/√v̂| > |w|/256]。在测得的更新分布下,Qwen3-1.7B 于 η = 1e-6 时理论值 0.3–0.7%,实测 0.4–0.5%;η = 3e-7 时降到 0.13%,随 η/|w| 缩放。以平均漂移速度 |∆̄| 运动的权重每 τ ≈ u/(2|∆̄|) 步才跨过一次舍入边界——50 到 150 步;学习率衰减日程下 τ → ∞,优化器还在走,采样器彻底冻结。
隐藏滞后的测量(1.7B,MATH):可见的 |log ρ_loss| 全程 ≈ 0.01,隐藏的 |log ρ|(master 对 served)长到 0.10–0.16(MATH)与 ≈ 0.45(knights-and-knaves);Fair Cast 下同一量保持在 ≈ 0.01。逐 token 有效样本量在 2000-token 响应的任务上跌到 0.2–0.35,500-token 任务上 ≈ 0.9——策略走得越远、序列越长,欠的账越多。一个反直觉推论随之落地:降低学习率会减小可见比值、却增大隐藏比值(更少更新能越过死区),两个方向相反的观察在 (3) 与 (4) 的区分下同时成立。
一个单步受控实验把因果钉死:同一批 64 个 knights-and-knaves 题上,η = 1e-6 的一次优化器步把 fp32 采样器从 0.17 推到 0.84;round-to-nearest 的 bf16 采样器连续三步停在 0.19 不动。真实训练里同样如此:RTN 前 20 步近乎冻结(held-out 精度 0.12 → 0.15 → 0.22,step 0/9/19),Fair Cast 立即启动(0.12 → 0.51 → 0.79)。
2.5 解法
Fair Cast 的两个必要组件
无偏导出。随机舍入:θ 落在相邻 bf16 值 ⌊θ⌋ 与 ⌊θ⌋+u 之间时,以概率 p = (θ − ⌊θ⌋)/u 导出上值——E[q] = θ 精确成立,幅度为 ∆ 的更新把导出概率改变 ∆/u,服务权重的期望移动等于真实移动;实现只需给 fp32 位模式加 16 个均匀随机位再截断。误差反馈:维护每权重残差 r,q_t = round(θ_t + r_{t−1})、r_t = θ_t + r_{t−1} − q_t,望远镜求和使累计导出误差对所有时间以 u 为界——无偏是时间平均意义上的,且这是一个一阶 sigma-delta 调制器,确定性但同样抖动。
在服务副本上训练。训练器前向直接用 q_t,梯度经 straight-through estimator(量化感知训练的标准近似,偏差以同一舍入宽度为界)传回 θ_t。被采样与被微分的于是是同一个对象 q_t,rollout 对进入 loss 的策略严格 on-policy。实现上两种写法等价:前向调用时把参数替换成 q_t,或在该步期间把 q_t 写入参数存储、优化器更新前恢复主权重;带激活重计算时第二种是精确的(重算的反向也看到 q_t),主实验用第一种,0.6B 上两种给出相同学习曲线(knights 0.977 对 0.967、GSM8K 0.756 对 0.742)。
两半缺一不可,交叉实验(原文 Table 1)是最硬的证据:误差反馈导出而不做 served-copy 训练,4 个长 run 全部崩到 0.00;随机舍入导出而不做 served-copy 训练,0.6B 上 GSM8K 从 0.61 掉到 0.13(step 19,陷入 token 循环)、MATH 掉到 0.002(无限推理不终止)。原因在于:无偏舍入的扰动若不与训练侧对齐,会以噪声形式进入可见比值,clip 比例随每次导出的权重翻转比例同步上升,梯度范数在 GRPO 组全员答错后归零。反过来,round-to-nearest 加 served-copy 训练与现状无异——两份副本仍在同一次舍因的下游。
什么被保证、什么不被保证
作者对理论边界的诚实陈述值得整段复述。第一,E[q] = θ 不蕴含 E[π_q] = π_θ(网络非线性);精确的命题是三条:(i) rollout 对被微分的 q_t 严格 on-policy,策略梯度估计器不含重要性加权误差——这是 served-copy 训练的职责;(ii) π_q 与 π_θ 的差是每权重不超过一个格距的舍入扰动,RTN 下它跨步符号一致、一阶效应累积 50–150 步,随机舍入下零均值且跨步独立、一阶项期望为零、剩下二阶 Jensen 项 ½tr(HΣ)(Σ ⪯ (u²/4)I);(iii) 传给 θ 的梯度是 q_t 处的梯度。第二,被优化的目标是被导出模型的期望奖励 J(θ) = E_q[J(q)]——训练时采样的是它、部署的是它;RTN 优化的则是一个从未被服务的 master 策略。
结果:更快、更稳、以及三个副产品
25 个配对种子对(0.6B–4B,AdamW 与 Muon)上 Fair Cast 18 胜(>1 分)、6 平(1 分内)、1 负(list functions),平均端点 +6.1 分。增益集中在长 rollout 逻辑任务,端点对照如下:
| 任务 | 模型/优化器 | RTN | Fair Cast | Δ |
|---|---|---|---|---|
| Zebra puzzles | 1.7B AdamW | 0.33 ± 0.10 | 0.57 ± 0.16 | +24 |
| Knights-and-knaves | 0.6B | 0.865 | 0.967 | +10.2 |
| Knights-and-knaves | 1.7B | 0.959 | 0.996 | +3.7 |
| Knights-and-knaves(Muon) | 1.7B | 0.907 ± 0.016 | 0.988 ± 0.003 | +8.2 |
| Knights-and-knaves | 4B | 0.988 | 0.992 | +0.4 |
| Nim | 1.7B | 0.570 | 0.580 | +1.0 |
| MBPP+(224 held-out) | 1.7B | 0.595 ± 0.007 | 0.618 ± 0.017 | +2.3 |
| HumanEval+ | 1.7B | 0.613 ± 0.039 | 0.625 ± 0.013 | +1.2 |
| 字符串操作 | 1.7B | 0.352 | 0.363 | +1.2 |
| MATH level 5 | 1.7B | 0.492 | 0.523 | +3.1 |
| MATH 3–5 | 1.7B(300 步 cosine) | 0.664 | 0.656 | −0.8 |
| MATH 3–5 | 0.6B | 0.506 ± 0.025 | 0.533 ± 0.015 | +2.7 |
| GSM8K | 0.6B | 0.713 ± 0.025 | 0.764 ± 0.024 | +5.1 |
(MATH 3–5 的 1.7B 对在 step 150 时 Fair Cast 实际领先 5.5 分,终点持平是 cosine 衰减尾段的结果;0.6B 的三种子曲线在前 30 步——死区吞掉优化器移动比例最大的时段——就早早分开。)
zebra 是隐藏滞后杀伤力最大的任务:RTN 每个种子都在 20 步左右正常学习后崩塌(峰值 0.57 ± 0.01 → 终点 0.33 ± 0.10),30–60 步间响应膨胀顶到 2048-token 上限(held-out 截断率 0.47–0.89)、训练奖励下滑——一个被它已不再匹配的模型上的奖励推向更长推导的策略的签名。DAPO 式截断惩罚救不了(终点 0.45),因为病根不在惩罚结构。Fair Cast 四个 run 中三个从未进入该状态(终点 0.62–0.70),全程贴住 fp32-sampler oracle(0.69)。Muon 场景更极端:其逐元素更新幅度近乎均匀且几乎全部小于 u/2,RTN 让采样器前 20 步近乎冻结,Fair Cast 在两种子全部 15 个 checkpoint 上领先。
两个邻近任务给出了互补的注脚。knights-and-knaves 上滞后收走的是速度而非稳定性:AdamW 1.7B 下 Fair Cast 在 step 9 就到 0.88、step 40 约 0.97,RTN 要多花约 40 步才到同一水平、终点低 3.7 分——死区越深差距越大。Nim(6144-token 上限、精确求解器)则显示滞后有时只是延迟而非歧途:两种导出最终收敛(step 150 为 0.580 对 0.570),但 Fair Cast 前 100 步领先 10–30 分、峰值 0.736 对 0.596。横向看,增益沿「rollout 长度 × 策略移动距离」排布:长 rollout 逻辑任务受害最深,短答案任务与接近天花板(4B knights 0.992 对 0.988)的任务两种导出学得一样快。
三个副产品各有独立价值。Checkpoint 不是模型:RTN 下 fp32 master 与其服务导出在 HumanEval+ 上最多差 50 分(step 99:served 59.8 对 master 9.1),9 个含 master 评测的 RTN run 中 5 个出现过 ≥12 分的裂缝、2 个最终仍带着裂缝;且任何比 bf16 更细的导出(fp16、经 fp16 的 FP8)都会继承采样器从未见过的残差——同一 master 四种导出:bf16 58.5 / fp16 16.5 / FP8-via-bf16 60.4 / FP8-via-fp16 28.1(HumanEval+),fp16 导出的平均响应 1679 token 对 bf16 的 344——「它是一个不同的模型」。Fair Cast 下 master 与导出在 12 个 run 的每个 checkpoint 上 3 分内一致(四种导出 64.6/62.2/61.0/61.0)。迁移无损:MATH 训练的 1.7B checkpoint 在 AIME24 上 0.204 对 0.152、AMC23 上 0.548 对 0.495、MATH-500 上 0.790 对 0.754,GSM8K 持平 0.83。滞后作为可调正则器:list functions 是 RTN 的低通滤波有帮助的任务——无滞后的 Fair Cast 在 step 29 就提交 answer-only 输出(中位响应 13 字符)并停在 0.523,RTN 靠 600-token 推导拿到 0.668;给 Fair Cast 加 α = 0.05 的 EMA 导出(无偏舍入同一套),两种子达 0.707/0.709,反超 RTN。意外的延迟从一个依赖权重大小的数格式的副作用,变成一个显式超参。
对照与消融堵住了所有「更简单的办法」:FP16 采样器把死区缩小 8 倍但不消除、加溢出风险;把 RTN 学习率调到 3e-6 与 1e-5 换来两次 MATH 崩塌(推 biased 采样器更狠的 usual price);Fair Cast 与 TIS 可组合(一个治舍入滞后、一个治版本滞后,效果加性);OLMoE-1B-7B 与 Qwen2.5-1.5B-Instruct 上两者在噪声内、Fair Cast 从不更差。成本侧:导出仅占每步(31–130 s)的 0.1% 以下——RTN 4.3 ms、随机舍入 21.7 ms(位操作 kernel)、误差反馈 37.2 ms(外加 1.7B 下 6.9 GB fp32 残差);输出长度匹配的任务上每步墙钟几乎相同(56.2 对 56.0 s)。与 delta-sync 的权衡也被量化:Fair Cast 每步改变 2–15% 的服务权重(RTN 0.4–0.5%),稀疏传输压缩率损失 5–30 倍,但换来一个不再落后 50–150 步的采样器。
2.6 知识反推
- bf16 的 7 位尾数决定了 RL 微调的可分辨更新尺度:|w|/256。这是「为什么 RL 学习率要那么小」与「为什么小学习率在 bf16 导出下无效」两个现象的连接点。Schulman 等人的 LoRA 分析(RL 只需每 episode O(1) bit、LoRA 最优学习率是全参 10 倍)在此获得一个数值解释:LoRA 适配器单独服务,天然逃出死区。
- 随机舍入与误差反馈是低精度训练与通信压缩的成熟工具(可追溯到 2015 年的 limited-precision 深度学习与 1-bit SGD),本文的贡献是把它安置到一个此前无人安置的位置:trainer 到 sampler 的导出边界。
- 两个副本同源时比值诊断结构性失明。visible ratio ≈ 1 不是健康的证据,只是分子分母共命运的证据。判断一个诊断是否有效,先问它比较的两个量是否真的跨越了怀疑的断层。
- 「学习率越低失配越小」是测量伪影。它只在可见比值上成立;隐藏比值随学习率降低而增大。工程上流传的这条经验,在这篇论文之后需要重新标注适用范围。
- 训练时评估的模型、保存的模型、部署的模型可能是三个东西。bf16 评估再现训练分数,fp16/fp32 导出继承未见残差——部署格式的每一个选择都在隐式回答「你到底要哪个模型」。
2.7 通用灵感
- 在系统边界上检查无偏性。数据流每跨过一个有损转换(量化、舍入、压缩、降采样),问一句:这个转换对增量是无偏的吗?偏差会不会在下游累积?Fair Cast 的全部发现来自把这个问题问到一次人人都写、无人多看的类型转换上。
- 警惕零均值扰动与符号一致扰动的天壤之别。同样 ≤ u 的扰动,跨步独立时是噪声(二阶项),符号一致时是 50–150 步的系统性漂移。评估任何量化方案,扰动的时间相关性比扰动的幅度更值得看。
- 一行修复是最有价值的技术资产。不引入超参、不改框架、不增加显著成本——可落地性本身是设计目标,不是事后考量。反例是「调大学习率绕过去」:两次崩塌说明绕行的代价往往在别处结账。
- 隐式副作用要么消除要么显式化。RTN 的低通滤波有时是正则化(list functions),有时是毒药(zebra)——把偶然的副作用变成一个可调旋钮(EMA 的 α),两种任务都能各取所需。这条原则适用于一切「bug 与 feature 一体」的遗产行为。
- 诚实的理论边界反而增强说服力。作者主动写明 E[q] = θ 不蕴含 E[π_q] = π_θ,并把可保证的命题压缩到严格成立的三条(on-policy 采样、扰动二阶界、straight-through 偏差界)——每个声称都被标注了强度。写系统论文时这种「声明分级」值得效仿。
- 局限也要量化。作者给出单端点差异的标准误(512 题约 3 分、128 题约 6 分),等于自己标注了哪些胜负在噪声内。这让 18/6/1 的总战绩比任何单一任务的悬殊比分更可信。
两篇对比与交汇:隐藏失配的系统论
两篇论文的对照可以压进一张表:
| 维度 | 论文一(DLC) | 论文二(Fair Cast) |
|---|---|---|
| 失配所在层 | 算法层:采样分布对训练分布的偏移 | 基础设施层:fp32 master 对 bf16 导出的偏移 |
| 失配的来源 | 引擎数值(FP8/BF16 kernel)+ 异步权重版本 | round-to-nearest 的舍入死区 |
| 关键诊断量 | δ_t 的两分量分解;ESS = 1/E[ρ²] | 隐藏比值 π_θ/π_q;逐 token ESS |
| 诊断盲区 | 采样器前缀上的 KL 看不见 off-support 漂移 | 可见比值 ρ_loss 恒 ≈ 1,看不见被丢弃的更新 |
| 修复手段 | centering + clip + ESS < 1/2 重同步 | 无偏舍入导出 + 在服务副本上训练 |
| 修复位置 | 算法层为主、基础设施层兜底 | 一次导出调用 |
| 失效签名 | off-support share 跳到 ~90% 后塌缩 | 长 rollout 任务截断膨胀后崩塌;checkpoint 与模型分叉 |
| 修复的语义 | 校正到达梯度的部分 | 让采样器成为训练器的无偏像 |
| 典型数字 | 1.7B deviation 全程 ≤ 1.2× 噪声底 | 25 种子 18 胜,+6.1 分 |
三层交汇值得单独写。
**第一层:梯度看不见的偏差才是最危险的。**这是两篇论文共有的、也是最反直觉的命题。论文二里,PPO clip、截断重要性采样、IcePop 掩码全部失效,不是因为它们设计得不好,而是因为它们校验的比值在结构上绕开了断层——训练器与采样器都在同一次舍入的下游,比值恒近 1,梯度对被丢弃的更新零感知。论文一里,去掉重同步的 DLC 崩塌时,采样器前缀上测的 deviation 依旧贴底——三个 per-token 校正都只作用于采样器画得出的 token,策略向采样器几乎不采的方向漂移时集体失明,直到训练器响应的 off-support share 跳到九成。两个案例的教训同构:失配的危害不取决于它的大小,而取决于它是否落在梯度与监控的可观测范围里。一个 |log ρ| ≈ 0.01 的可见差异可以被一整套校正产业处理掉;一个长到 0.45 的隐藏差异可以无声地毁掉整个 run。
由此还能推出一条关于「谁该背锅」的修正。论文一 Table 1 的基础设施层列着五行失配——权重版本、引擎数值、采样上报、序列一致性、响应筛选——论文二实际上在表上补了不存在于任何清单的第六行:导出舍入。一个失配能躲过整个研究社区几年的清理,靠的不是复杂,而是「两边的诊断都看不到它」这个结构性伪装。系统审计的清单永远不完整,除非审计的对象包括诊断本身。
**第二层:ESS 是失配的通用温度计。**两篇论文在没有互相引用的情况下收敛到同一个量:有效样本量。论文一用 ESS = 1/E_q[ρ_t²] 定位重要性加权的有效终点、并作为重同步的触发器(跌破 1/2);论文二用逐 token ESS 诊断 master-served 滞后的深度(2000-token 任务跌到 0.2–0.35)。原因不难理解:失配本质上是「你手里的样本来自多远的过去/多偏的分布」,而 ESS 正是对这个距离的样本级折算。对于任何做采样-训练分离的系统,ESS 都应当是一等公民监控量——它比 KL 更早报警,且直接给出「这批数据还值几个样本」的可解释读数。
两文用 ESS 的方式差异也有信息量。论文一把 ESS 当控制信号:它触发动作(重同步),把采样器拉回有效范围;论文二明确说 ESS 只当诊断而非重要性校正用——因为在 q 上采样、在 q 上求梯度的组合根本不需要加权。同一个量,一个系统里它是失效的前兆,另一个系统里它只是体温读数。什么时候该行动、什么时候只该观察,取决于失配是否已经进入梯度。
**第三层:修复应该放在失配产生的层级。**论文一的总纲是「基础设施决定采样器偏离多远,算法校正到达梯度的部分」——按分量的动力学分配层级:恒定偏置在算法层减掉,闭环增长在算法层截断,算法够不着的(前缀项、off-support)交回基础设施重同步。论文二则演示了另一个方向:当失配的根在基础设施(导出舍入),在算法层做任何事都不如把根源修成无偏——一行改动让「rounding lag」这个类别整体消失。两者合起来是一张完整的决策表:先分解失配、找出每一段的产生层级,能根治的根治(无偏导出),根治不了的在最近的上游校正(centering/clip),最后剩下的用重置兜底(重同步)。值得一提的是两篇的修复是正交且可组合的:Fair Cast 消除舍入滞后、论文一族校正版本滞后,论文二的消融里 Fair Cast 与 TIS 的加性组合已经预演了这种分层防御。
还有一个耐人寻味的呼应:两篇论文都发现了「让被微分的策略就是采样的策略」这一 on-policy 的最严格形式。论文二用 served-copy 训练做到字面意义的同一对象;论文一用 DLC 把 KL 压到噪声底、并用重同步让训练器响应重新成为采样器响应。殊途同归地,它们都在回答 RL 系统设计的原点问题:当工程必然引入偏差时,至少让梯度知道真相。
成本上两篇也站在同一侧:DLC 每步多一次 θ_old 前向(1.7B 步时 113.2 s 对 on-policy 50.4 s,重同步本身每次至多 1.5 s);Fair Cast 每次导出多 18–34 ms、占优化器步时的 0.1% 以下。相对各自替代方案(更频繁的全量同步、fp32 采样器或 FP16 全栈),两者都是用诊断换来的廉价修复——先看清失配的解剖结构,再花小钱办大事。
结语
读这两篇论文,最容易产生的冲动是立刻去查自己训练栈里的两处:异步采样器的 ESS 曲线,和权重导出调用里的那个 rounding mode。这大概是它们最实际的贡献——把两个分别藏在不同层、都会无声吃掉训练效果的设计默认值,变成了应该出现在每个 RL 训练仪表盘上的两个数字。
但更持久的启发是方法论层面的。面对「训练不稳定」这类模糊症状,两篇论文示范了同一条路径:先把失配分解到来源(第三视角前向 / 隐藏对比值),再测量各分量的时间动力学(恒定还是自放大、可见还是隐藏),最后把修复放到产生该分量的层级并量化失效边界(ESS 1/2 阈值 / 死区无偏性)。没有一步依赖玄学调参,每一步都产出了可复用的量具。
LLM RL 的工程栈还在快速拼装中,类似的隐藏失配大概率不止这两个——凡是两套系统共享状态的地方(权重、梯度、数据、评测),都可能有「两边都看得见、就是对不上的缝」。这两篇论文交给我们的是探缝的手电筒:怀疑每一个边界转换,测量每一个跨越边界的比值,并且永远问一句——梯度真的知道这件事吗?