Paper Review · Multi-Teacher On-Policy Distillation

Open-MOPD:多教师蒸馏真正缺的是优化预算,不只是正确路由

这篇论文从一个受控问题出发:数学、代码和指令遵循三个 RL 专家都能教会同一个 3B 学生,领域标签也完全正确,为什么把三位教师同时接进来后,学生仍明显弱于三个单教师学生的组合?作者给出的答案是:共享 loss 中真正被分配的不是“题目数”,而是带着不同长度、不同 reward 尺度和不同新鲜度的 token 更新预算。

Gao 等,arXiv:2608.1909822 页,2026-08-20 发布数学 / 代码 / 指令遵循

第一遍:按论文顺序把原文讲清楚

1. 论文为什么出现:专家能力能训练出来,却不容易装回一个模型

现实的 post-training 往往先把同一个基础模型分叉成多个专家:数学教师用可验证答案做 RL,代码教师用单元测试做 RL,指令遵循教师用格式与约束 verifier 做 RL。部署时却不希望同时维护三套模型,于是出现 multi-teacher on-policy distillation(M-OPD):学生先在当前策略下生成自己的回答,再按样本领域把这条学生轨迹交给对应教师,教师在学生实际走到的每个 prefix 上提供 token 级反馈,最后仍只更新一个学生。

它比离线 SFT 更贴近部署状态,因为监督发生在学生自己的错误轨迹上;也比“把三份专家数据混起来再训”更密集,因为教师不是只给最终答案,而是在每个 token 的候选分布上指出学生与教师的差距。论文指出,DeepSeek-V4、Kimi K3、Agents-A1 等工业系统已经采用多教师蒸馏,但公开研究缺少一条从基础模型、混合 SFT、领域 RL 教师到统一学生的可重复链路,也缺少对“为什么多教师能力没有简单相加”的机制诊断。

2. 作者先搭了一个故意消除路由误差的受控试验台

作者从 SmolLM3-3B-Base 出发。选择 3B 不是只为便宜:1.7B 模型在同一 OpenR1 数学 SFT 下有 69.17%–80.42% 的回答耗尽 31K 长度,很多推理根本没有闭合;7B 能把截断率降到 12.92%,但要重复训练三个 RL 教师和多组消融,成本太高。3B 因而被当作“能完成长推理、又能在单个 8×A100-80GB 节点上反复试验”的折中点。

完整流水线分三阶段。第一阶段用 OpenR1-Math-93k、OpenCodeReasoning 的 50K 子集和 Instruction-Nemotron 做四轮 mixed-domain SFT;它们按回答 token 数而非样本数平衡,最终约为 37% / 28% / 35%。第二阶段从同一个 MixSFT checkpoint 分叉,分别在 DAPO-Math-17k、DeepScaler-24k 和 Nemotron-IF-RL-46k 上做 GRPO,得到数学、代码和 IF 三位教师。第三阶段让学生再次从 MixSFT 起步,在三域 prompt 并集中生成回答,并用真实领域标签硬路由到正确教师。这个设计刻意不研究 router:只问“教师选对了,能力是否就能写进同一组参数”。

基础模型SmolLM3-3B
混合 SFT三域 token 平衡
领域 RL三位专家教师
学生 rollout生成当前轨迹
硬路由真实领域标签
教师打分student top-16
共享更新一个统一学生

3. OPD 的 token 信号究竟是什么

在位置 \(t\),作者不计算完整词表,而是取学生概率最高的 16 个 token 构成集合 \(\mathcal S_t\)。对其中一个候选 \(v\),教师—学生差距是:

\[\delta_t(v)=\operatorname{sg}\!\left[\log \pi_{\phi_{d(x)}}(v\mid x,y_{<t})-\log \pi_\theta(v\mid x,y_{<t})\right].\]

教师比学生更偏好某个 token 时,差值为正;反之为负。再用学生在 top-16 内重新归一化后的概率 \(\tilde\pi_\theta\) 加权,并把 16 个候选求和成位置级 reward \(r_t\)。这里用 stop-gradient,是因为这项量扮演 PPO advantage,而不是让梯度直接穿过 reward 公式。没有 critic,位置 reward 直接进入 advantage 槽。关键点是:trajectory 来自学生,教师只在学生真实访问的状态上纠偏。

4. 第一个发现:正确路由仍留下 3.50 分整合缺口

作者把三个单教师 OPD 学生按领域分别调用,称为 RouteOPD。它不是可部署的单模型,而是一个参考上限:证明同样的初始化、教师和 OPD 目标,在每个领域单独训练时确实能学进去。Naive M-OPD 的总分从 MixSFT 的 25.67 提升到 28.05,说明多教师信号有效;但 RouteOPD 达到 31.55,仍留下 3.50 分差距。

缺口高度不对称:数学差 1.89,代码差 2.45,IF 差 6.16。训练 200–300 步时,数学关闭了到 RouteOPD 距离的 64%,代码 40%,IF 只有 26%;IF 还是唯一在中段下降的领域。这让问题从“多教师是否有效”变成“为什么短回答领域最先失去更新权”。

5. 作者先排查最直觉的解释:不同教师是否互相打架

即使每条样本只选一位教师,共享参数仍可能被不同领域的格式词、连接词和推理模板推向相反方向。作者让三位教师同时给同一学生 token 打分,用三者 log-prob 的最大差定义冲突 \(c_t\)。结果平均只有 0.126 nat,训练全程低于 0.27 nat;只有 0.62% 的 token 超过 1 nat,IF 为 3.9%,数学为 0.31%。

更重要的是干预结果:删掉冲突最高的 1%、5%、20% token,总分分别下降 0.52、0.73、0.75;在低冲突位置改用三教师平均目标,也下降 0.83。作者据此没有宣称“冲突不存在”,而是把结论限定为:在他们的 token-level spread 指标下,广泛教师冲突不像当前缺口的主因;高冲突 token 也可能恰好承载领域信息,盲目删除会伤害学习。

6. 真正的诊断:prompt 平衡,不等于 token 更新平衡

Naive M-OPD 的数学、代码、IF prompt 份额约为 39.8%、39.8%、20.3%,看起来并不极端。但数学和代码回答平均约 10.5K token,IF 只有约 409 token;loss 又按有效 token 求平均,所以实际梯度 token 份额变成 49.7%、49.3%、0.99%。也就是说,每五道题里就有一道 IF,却每一百个产生更新的 token 里还不到一个来自 IF。

如果只靠过采样把 IF token 拉到三分之一,需要约 33.6 倍 IF prompt,会挤掉 batch 中数学和代码长推理的题目多样性。作者因此不改 sampler,而是在 loss 上给每个领域一个 \(g_d^\star/s_d^{tok}\) 权重:目标均为三分之一时,实测数学、代码、IF 权重约 0.69、0.66、32.7,使加权 token 份额精确回到 33.33%。

7. 第二层失衡:即使 token 数相等,teacher–student gap 也在漂移

每个 token 对梯度的影响还与 reward 绝对值有关。训练开始时三域平均 reward 幅度相差 4.9 倍,之后又以不同速度收缩;如果静态固定三域 token 各占三分之一,有效预算仍近似正比于 reward magnitude。论文观察到 25 步内 IF 的有效预算掉到约 9%,代码升到 63.8%。

一个看似公平的做法是用 reward 的倒数补偿“小信号领域”,但这会形成反向激励:一个领域越接近教师,reward 越小,反而获得越大权重,于是继续吞噬预算。实验中 IF gap 缩小 32.5 倍后,逆向权重不断增大,训练在第 74 步崩溃。作者转而顺着 gap 分配:用当前领域 reward magnitude 相对跨域均值的比例乘到 token-share 权重上,且裁剪在 0.05–20。已经接近教师的领域自动降权,剩余 gap 大的领域得到更多预算。

8. 第三层失衡:同一批 rollout 被更新多次后,reward 过期了

为了吞吐,PPO 常把一次 rollout batch 分成 \(K\) 个 minibatch 顺序更新。trajectory 固定来自 rollout 时的学生,但第一轮更新后学生参数已经变化。如果后续仍使用 rollout 时保存的学生 log-prob 来计算 teacher–student reward,reward 描述的就是一位已经不存在的旧学生。作者测得 rollout policy 到当前 policy 的 KL 随 \(K\) 单调上升:\(K=4\) 时为 0.059,\(K=32\) 时为 0.216;PPO clipped token 比例相应升到 0.86。

Reward refresh 不重新生成轨迹,也不重复教师 prefill。教师在固定 top-16 token 上的 log-prob 只缓存一次;每个 inner update 本来就要做 actor forward,作者直接复用其中的当前学生 log-prob,重新计算 \(\delta_t\)、top-k 权重和 advantage。因此它只修复 reward 中显式依赖学生的部分,不能修复旧 trajectory 的 state-distribution staleness。

9. 消融如何一步步落到最终结果

在 \(K=1\) 的消融梯子上,Naive M-OPD 为 28.05;加入 token-share balancing 后达到 29.22,+1.17 几乎都来自 IF;再加入 gap-following 达到 29.94,再增 0.72。切换到 \(K=4\) 会同时改变 rollout batch 与每次更新的 prompt 数,因此作者另给同设置 control 29.28;share+gap 达到 30.43,reward refresh 再带来 0.81,最终 Open-MOPD 为 31.24。

最终数学 / 代码 / IF 分别为 22.42 / 21.73 / 49.58,总分距 RouteOPD 只剩 0.31;相对 RouteRL 可用 headroom 的恢复率从 35.6% 升到 83.4%。Reward refresh 的 dense-reward 计算只占整步约 2.2%,实测开启前后完整 step 为 1298 秒与 1313 秒,差异落在波动内,所以作者报告“没有可测额外吞吐成本”。论文最后把贡献概括为一个逐项对应关系:token 数、gap 幅度和 reward 新鲜度三种失衡,分别由 share、gap、refresh 三个机制处理。

以上是论文原文的完整论证链。下面开始证据审计与本文自己的判断。

第二遍:核心判断

预算,不是样本数

最重要的新诊断

在 token-mean loss 里,领域实际拿到的更新权由回答长度 × reward 尺度 × 数据新鲜度共同决定;prompt 比例只是很弱的代理。

35.6% → 83.4%

结果有明显工程价值

同一个 3B 学生收回了大部分 RouteRL headroom,而且三项改动都对应可监控量,不依赖另加 router 或部署模型。

开放 ≠ 一键复现

发布仍有关键文档缺口

权重、数据和实现确实公开,但当前快捷 M-OPD 命令默认未启用三项机制,评测 README 的 repeat 口径也与论文主表不一致。

我认为论文最有价值的部分不是又提出一个“动态加权公式”,而是把多教师融合失败从模糊的 task interference 改写成一份可观测账本:每个领域到底贡献多少 token、每个 token 的 gap 有多大、这个 gap 是基于哪一版学生算出来的。这个诊断框架比当前三领域配方更容易迁移。

机制拆解:把共享更新预算写成三个乘子

论文没有直接写出一个统一预算公式,但三项机制可以近似压缩为:

\[B_d \propto s_d^{tok}\times w_d^{share}\times \left(\frac{m_d}{m_{ref}}\right)^\alpha\times q_d^{fresh},\qquad w_d^{share}=\frac{g_d^\star}{s_d^{tok}}.\]

其中 \(s_d^{tok}\) 是领域 token 份额,\(g_d^\star\) 是目标份额,\(m_d\) 是剩余 teacher–student gap 的代理,\(q_d^{fresh}\) 不是论文显式定义的标量,而是用来理解 reward refresh 的“信号是否仍对应当前学生”。第一项与第二项相消,把长度带来的预算偏差移除;第三项让预算跟随尚未蒸馏完的能力;第四项要求内层更新使用当前学生重新评估 reward。

机制观测量修改位置解决什么不解决什么
Token-share balancing当前 batch 的 response token share每序列 loss 权重长回答淹没短回答不同 gap 尺度、陈旧轨迹
Gap-following allocation每域平均绝对 reward领域相对预算领域收敛速度不同reward 是否是可靠能力差距代理
Reward refresh当前学生 top-k log-prob每个 inner update 的 advantage学生更新后 reward 仍引用旧策略trajectory 本身来自旧学生

结果与独立复算

方法MathCodeIFTotal相对 RouteRL headroom
MixSFT epoch 417.9517.6041.4625.67基线
Naive M-OPD21.2619.2643.6428.0535.6%
RouteOPD(三模型参考)23.1521.7149.8031.5588.0%
Open-MOPD22.4221.7349.5831.2483.4%
RouteRL(三模型参考)24.2421.7351.0832.35100%

复算与论文一致:Naive 的恢复率为 \((28.05-25.67)/(32.35-25.67)=35.63\%\);Open-MOPD 为 \((31.24-25.67)/6.68=83.38\%\)。对 RouteOPD 的整合缺口从 \(31.55-28.05=3.50\) 降至 \(31.55-31.24=0.31\)。不过最终结果并未超越 RouteRL;它证明的是“一个学生接近三个专家组合”,不是统一学生已完全保留所有 RL 专家能力。

读消融表时不要把 +3.19 全算给三项机制最终 31.24 相对 \(K=1\) Naive 28.05 是 +3.19,但切换到 \(K=4\) 的同设置 control 本身已到 29.28。以匹配的 \(K=4\) control 计算,share+gap 带来 +1.15,refresh 再带来 +0.81,三项机制在该设置下合计约 +1.96。论文提供了 control,因此因果解释是可修正的;宣传页只展示总提升时容易忽略这层口径。

术语速查

RouteRL / RouteOPD评测时按领域切换到三个独立模型的参考系统。它用于测量可用能力上限,不是一个统一可部署学生。
Integration gap统一 M-OPD 学生与 RouteOPD 的总分差。它隔离了“同样教师单独能教会、合起来却没有完全写入”的损失。
Gradient-token share真正进入 token-mean loss 的有效回答 token 比例;长 chain-of-thought 会天然获得更多份额。
Reward staleness学生参数已经更新,但 advantage 仍用 rollout 时旧学生概率计算。它不同于 trajectory state 本身过期。
Oracle routing用真实领域标签选教师,假设路由完全正确。它提高了机制可识别性,也限制了真实部署外推。

证据审计:哪些结论强,哪些仍需保留

证据较强的部分

不能从当前证据推出的结论

公开复现链目前存在两个具体断点第一,仓库的 scripts/local/mt_opd.sh 快捷命令只设置教师域和数量;target shares、gap 的 multiply 方向、\(\alpha=1\) 与 opd_refresh_advantage 默认均未打开。README 却把这条 dry-run 示例称为 Open-MOPD training run,用户若直接加 --run,更接近 Naive M-OPD 而不是论文最终配方。第二,公开评测 README 写 AIME 重复 32、LiveCodeBench v6 重复 1,并引用当前仓库中不存在的部分数据构建入口;论文主表则是 AIME 64、LCB v5/v6 各 10。代码和数据“可见”已经成立,但端到端命令与论文口径之间还需要发布方补齐一份冻结配置和统一评测说明。

本轮尝试运行 M-OPD 定向测试时,本地 Python 环境缺少 PyTorch,测试在收集阶段停止;因此这里把“实现存在且测试文件覆盖关键分支”与“本轮已执行通过”严格分开,没有把静态代码核对写成动态复现。

独立 insight:多教师蒸馏需要的是能力预算控制器

Insight 1:M-OPD 的 routing plane 与 budgeting plane 应当分离。路由回答“这条轨迹听谁的”,预算控制回答“每种能力本轮获得多少可产生参数位移的监督”。Oracle router 仍失败,说明更好的分类器不可能自动修好预算失衡。工业系统应同时记录 prompt share、raw token share、weighted token share、reward scale、有效 unclipped token、每教师查询成本和每域验证 gap;只看采样比例会系统性误判。

Insight 2:回答长度其实是一种隐形学习率。在 token-mean 目标下,10K token 数学回答天然比 400 token 格式回答获得约 25 倍更新机会。它不是数学更重要,而是 aggregation 方式把长度编码成了领域权重。这个现象不仅适用于 M-OPD,也适用于混合 SFT、tool trajectory training 和长短任务混合的 Agent RL。只要不同任务的有效 action/token 数相差一个数量级,就应先审计“每任务有效更新质量”,再调 sampler。

Insight 3:gap-following 本质上是闭环控制,reward magnitude 是传感器而非真值。当前控制器把大 \(|r|\) 解释为“尚未蒸馏完”,方向在本实验成立;但如果某位教师过度自信、某域 top-16 coverage 差或 reward 噪声高,控制器可能把噪声当缺口并不断加预算。更稳健的下一步应把当前 gap、领域验证增益、teacher entropy 与单位教师 FLOP 收益联合成控制信号,并加上积分饱和与预算上限。

Insight 4:refresh 的真正价值是把高吞吐和 on-policy 语义部分解耦。完全重新 rollout 才能消除 state staleness,但成本高;重算当前学生 reward 部分几乎免费。因而可以把陈旧性拆成“状态旧、教师项旧、学生项旧”三层,分别决定重生成、缓存和重算。这种拆分可迁移到异步 OPD、长轨迹 Agent RL 和 replay-based post-training。

什么证据会推翻或收窄这些判断如果在多 seed、异构教师、真实 router 错误和更多领域上,token/gap/refresh 账本无法预测哪个能力退化;或匹配总计算量后,简单 per-sequence mean / uncertainty sampling 与 Open-MOPD 相当;或发布方补出的冻结配置显示当前快捷命令已通过隐含默认值打开全部机制,那么本文关于普适性或复现缺口的判断都需要更新。

对工程实践的具体建议

  1. 先做只读诊断:按领域记录 prompt、有效 response token、reward 绝对值、clipped fraction、teacher entropy、验证分数,不要先改 sampler。
  2. 把“目标 token 份额”设成显式配置,并同时报告加权前后 share;不要让序列长度偷偷决定业务优先级。
  3. 动态权重只根据可解释的剩余 gap 增大,必须裁剪、归一化并做正负方向消融;倒数归一化很容易奖励已经收敛的领域。
  4. batch reuse 大于 1 时,把 advantage 中所有依赖当前 policy 的量列出来;能复用 actor forward 重算的部分应优先 refresh。
  5. 发布实验时冻结完整 Hydra/CLI 配置、数据 manifest、评测 repeats 与 commit;“代码里支持”不等于“README 命令复现论文”。

证据边界与资料索引

本文核对了 X 发布帖、arXiv v1 全文及附录、项目页、公开仓库当前发布提交、五个模型卡与数据集公开状态,并对主表和 recovery 指标做了独立复算。论文所有训练曲线、成本和最终成绩仍属于发布方报告;本轮没有 8×A100 条件重跑训练,也没有完成 PyTorch 单元测试执行。X 主帖仅承担发布导航作用,没有额外技术论证;平台公开接口只显示极少回复,未发现会改变论文结论的作者补充。