第一遍:按论文顺序把原文讲清楚
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:只问“教师选对了,能力是否就能写进同一组参数”。
3. OPD 的 token 信号究竟是什么
在位置 \(t\),作者不计算完整词表,而是取学生概率最高的 16 个 token 构成集合 \(\mathcal S_t\)。对其中一个候选 \(v\),教师—学生差距是:
教师比学生更偏好某个 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 比例只是很弱的代理。
结果有明显工程价值
同一个 3B 学生收回了大部分 RouteRL headroom,而且三项改动都对应可监控量,不依赖另加 router 或部署模型。
发布仍有关键文档缺口
权重、数据和实现确实公开,但当前快捷 M-OPD 命令默认未启用三项机制,评测 README 的 repeat 口径也与论文主表不一致。
机制拆解:把共享更新预算写成三个乘子
论文没有直接写出一个统一预算公式,但三项机制可以近似压缩为:
其中 \(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 本身来自旧学生 |
结果与独立复算
| 方法 | Math | Code | IF | Total | 相对 RouteRL headroom |
|---|---|---|---|---|---|
| MixSFT epoch 4 | 17.95 | 17.60 | 41.46 | 25.67 | 基线 |
| Naive M-OPD | 21.26 | 19.26 | 43.64 | 28.05 | 35.6% |
| RouteOPD(三模型参考) | 23.15 | 21.71 | 49.80 | 31.55 | 88.0% |
| Open-MOPD | 22.42 | 21.73 | 49.58 | 31.24 | 83.4% |
| RouteRL(三模型参考) | 24.24 | 21.73 | 51.08 | 32.35 | 100% |
复算与论文一致: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 专家能力。
术语速查
证据审计:哪些结论强,哪些仍需保留
证据较强的部分
- 短回答被 token-mean loss 淹没有直接计量:20.3% prompt 对应 0.99% token,且 share 权重能精确把加权份额拉回三分之一。
- 冲突不是该试验台的主要瓶颈不仅有描述统计,还有 mask 与 consensus 两类反事实干预;所有干预都更差。
- refresh 修复的对象明确:代码缓存教师在 student top-k 上的 log-prob,并在 actor update 内重算当前学生部分;它不是用 importance sampling 冒充 reward 修正。
- 开放资产比多数工业 MOPD 更完整:五个模型 checkpoint、训练/评测数据、训练框架修改和定向单元测试均公开可访问。
不能从当前证据推出的结论
- 主结果没有报告多随机种子、置信区间或独立复现。数学 mean@64 和代码 mean@10 降低了采样噪声,但没有消除训练随机性。
- 只有同源 3B 模型、三个领域和真实标签路由;不同 tokenizer、不同架构教师、十位以上教师、未知领域 prompt 或路由错误都没有验证。
- \(m_d=\mathbb E|r_t|\) 被当作“剩余能力差距”代理,但它也会受回答长度、top-k coverage、教师熵和校准影响。当前结果支持这个代理在本设置有用,不证明它跨任务恒等于能力缺口。
- 冲突指标只观察已采样 token 上三教师 log-prob spread。共享参数空间里的梯度夹角、隐藏层竞争与长期遗忘不等价于这个指标,因此更准确的结论是“该 token 指标下的冲突不是主因”。
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。
对工程实践的具体建议
- 先做只读诊断:按领域记录 prompt、有效 response token、reward 绝对值、clipped fraction、teacher entropy、验证分数,不要先改 sampler。
- 把“目标 token 份额”设成显式配置,并同时报告加权前后 share;不要让序列长度偷偷决定业务优先级。
- 动态权重只根据可解释的剩余 gap 增大,必须裁剪、归一化并做正负方向消融;倒数归一化很容易奖励已经收敛的领域。
- batch reuse 大于 1 时,把 advantage 中所有依赖当前 policy 的量列出来;能复用 actor forward 重算的部分应优先 refresh。
- 发布实验时冻结完整 Hydra/CLI 配置、数据 manifest、评测 repeats 与 commit;“代码里支持”不等于“README 命令复现论文”。
证据边界与资料索引
本文核对了 X 发布帖、arXiv v1 全文及附录、项目页、公开仓库当前发布提交、五个模型卡与数据集公开状态,并对主表和 recovery 指标做了独立复算。论文所有训练曲线、成本和最终成绩仍属于发布方报告;本轮没有 8×A100 条件重跑训练,也没有完成 PyTorch 单元测试执行。X 主帖仅承担发布导航作用,没有额外技术论证;平台公开接口只显示极少回复,未发现会改变论文结论的作者补充。