老师也可能一本正经地教错:TGOPD 给 on-policy 蒸馏加了一道"先验证再教"的门
你有没有想过一个问题:蒸馏的时候,如果老师(teacher)在某道题上其实根本不会做,但偏偏答得自信满满,会发生什么?
在 on-policy distillation(OPD)的训练里,这不是假设,是常态。学生模型(student)自己采样 rollouts,冻结的 teacher 在每个 token 上给出 reverse KL 的稠密监督信号——这套方法让 student 达到 teacher 水平的速度比纯 RLVR 快差不多一个数量级。问题在于,reverse KL 是 mode-seeking 的:teacher 越是自信地把概率集中在错误答案上,student 收到的梯度就越强烈地指向这个错误。
上周看到的这篇 arXiv 2609.02998 论文给了一个我觉得"对,就该这么做"的解法:先验证,再蒸馏。
核心摘要:这篇论文发现 Vanilla OPD 对所有 prompt 无条件接纳 teacher 监督,但 teacher 的 confidence 根本无法区分它到底是"自信地对"还是"自信地错"——在 code 领域用 confidence 做可靠性判断的 AUROC 只有 0.51,接近瞎猜。作者提出 TGOPD(Teacher-Gated On-Policy Distillation):用 teacher 自己跑 K=3 条 probe rollouts,交给 verifier 打分,三取二通过才放行稠密蒸馏,否则退回 verifier-grounded 的 GRPO。效果上,TGOPD 在 4B 和 35B 两个规模、数学/代码/指令遵循六个单域设置中全部超过 Vanilla OPD,多域训练下七个 benchmark 平均分分别提升 1.14 和 0.95 个点。顺手还解决了一个工程痛点:异步 OPD 中 teacher 节点 GPU 利用率常年趴在 9.8% 的位置,probe 计算恰好填进闲置窗口,利用率直接拉到 78.9%。我的判断:这不是底层理论突破,但抓的痛点非常真实,且"可靠性估计吃闲置算力"这个设计漂亮得让人拍大腿。
论文信息
- 标题:Verify Before You Distill: Prompt-Level Teacher Gating for On-Policy Distillation
- 作者:Zhiwei Zhang, Zechen Sun, Fei Zhao, Kang Peng, Bin Liang, Huayu Deng, Yao Hu, Kam-Fai Wong, Mu Chuan(AllSpark Team)
- 链接:https://arxiv.org/abs/2609.02998 (提交于 2026 年 9 月 2 日,17 页,6 图 7 表)
🎯 问题:蒸馏流水线上的两个"房间里的大象"
先说一个工程上很扎心的事实。典型的异步 OPD 部署里,student 在专门的 inference 节点上自回归生成 rollouts,teacher 在独立节点上对已生成的 tokens 做一次 forward 打分。打分这个活儿比生成便宜太多了,而且必须等 student 的 batch 准备好才能开工——于是 teacher 节点的大部分时间都在空转。
空转到什么程度?论文用 4B 单域 run 的实测数据说话:

图1:teacher 节点的 GPU 利用率时间序列(上)与平均值对比(下)。橙色是标准 OPD——teacher 节点平均利用率只有 10%,59% 的时间低于 5%,曲线呈现典型的"短暂尖峰+长时间归零"的 bursty 形态。蓝色是 TGOPD,probe 计算填进尖峰之间的空隙后,利用率拉到 79%,集群平均利用率从 51% 提到 69%。
说实话看到这个图我第一反应是心疼——一整台 8-GPU 节点,90% 的时间在烧钱干等。
第二个问题更要命:teacher 的可靠性是因 prompt 而异的,但 Vanilla OPD 根本不看这个。作者做了个诊断实验——每个领域抽 2400 个 prompts,每题让 teacher 离线采 10 条回答,用 verifier 算出细粒度 pass rate(记为 \(q_T^{(10)}\)),然后看 teacher 的 token 置信度能不能区分高/低可靠性样本:

图2:诊断实验结果。左图(code 域)和中图(math 域)画的是高/低可靠性两组样本的 teacher mean token log-prob 分布——code 域两组分布几乎完全重叠,AUROC 只有 0.51;math 稍好但也只有 0.73。右图更扎心:在低可靠性区间(\(q_T^{(10)} \lt 0.5\),蓝色阴影),teacher 置信度最高的那条 sampled response 在 code 上 84% 是错的、math 上 61% 是错的。
"自信地错"这件事用 entropy 或者 teacher-student likelihood agreement 这类分布代理指标是看不出来的——它们度量的是不确定性或一致性,不是答案对不对。而 reverse KL 偏偏就喜欢往 teacher 的高概率行为上靠。Vanilla OPD 实际上在系统性地放大这类错误。
这就是关键。两个问题的答案居然是同一个:让 teacher 在闲下来的时候,自己先做几道题自测一下。
🧠 方法:TGOPD 的三件套
一句话讲清核心 idea:每个 prompt 进训练之前,先让 teacher 自己解 K 次,用 verifier 统计通过率,通过率高就上稠密蒸馏,通不过就退回 GRPO——两种监督从不在同一个 prompt 上混用。

图3:TGOPD 框架对比。上半部分是 Vanilla OPD:prompt 进来,student 采样 G 条 rollouts,teacher 直接对所有 prompts 施加 OPD 更新。下半部分是 TGOPD:prompt 同时走两条路——student 照常采样,teacher 额外生成 K 条 probe rollouts 交给 verifier 算出可靠性 \(q_T(x)\),然后进入自适应监督分支:\(q_T(x) \geq \tau\)(可靠)走 OPD 的逐 token 优势,否则(不可靠)走 GRPO 的整轨迹相对优势。
拆开看技术细节。
可靠性估计。teacher 在 prompt \(x\) 上的可靠性被定义为期望 verifier 奖励,说白了就是"teacher 随手做一次能做对的概率":
估计方式简单粗暴:teacher 独立生成 \(K_T\) 条 probe rollouts,用和 student rollouts 完全相同的 verifier 打分(code 用单测,math 和 IF 用规则判分器),经验通过率:
因为 probes 是 i.i.d. 采样且 \(r\) 是二值的,\(K_T q_T(x)\) 服从二项分布——这个估计量无偏,方差 \(R_T(1-R_T)/K_T\) 随 \(K_T\) 线性下降。主实验 \(K_T=3\) 就够用,不需要精确排序 prompts,只要粗粒度的"靠谱/不靠谱"判断。
硬门控。可靠性过了阈值才放行:
默认 \(K_T=3\)、\(\tau=2/3\),也就是三取二多数表决。
路由,而不是混合。这是我觉得设计里最克制也最对的一个决定。门开着,OPD 的逐 token 优势完全接管,verifier 的轨迹级奖励不进梯度;门关着,teacher 监督整体撤回,改用 GRPO——rollout 组内奖励中心化(遵循 Dr. GRPO 惯例,不做标准差归一化)。如果组内全对或全错,中心化后优势恰好为零,这个 prompt 干脆不产生更新。合成到一条公式里:
注意 \(g(x) \in \{0, 1\}\),这是选择器不是插值器。Vanilla OPD(门恒开)和纯 GRPO(门恒关)只是它的两个退化端点。
为什么不在一条 trajectory 内部混合两种信号?我的理解是,OPD 的优势来自 teacher-student 的 log-likelihood 差,GRPO 的优势来自组内相对奖励——两者量纲和来源完全不同,混在一起校准会引入一堆说不清的超参。Prompt 级别一刀切,干净。
为什么 probe 几乎不花额外的钱。这是全文我最喜欢的设计。teacher 在 cycle 开始时就并发发出 \(K_T\) 条 probe decodes,跟 student 的生成同时进行——正好占用 teacher 节点原本闲置的那个窗口。如果 probes 在 student batch 完成前跑完,墙上时间一分不加。而 teacher 的 scoring pass 保持无条件执行(单次 forward 很便宜,条件化反而增加流水线分支)。所以 TGOPD 的全部额外工作就是 K 条 probe decodes,且大部分被闲置容量吸收。附录的匹配实验显示,35B CodeIO run 的 500 个对齐 cycle 里平均 step time 只增加 5.9%,decode throughput 变化小于 0.1%——审计不是严格免费,但接近。
🔧 系统实测:利用率真的被填满了
论文在四种部署配置(4B/35B × 单域 SOPD/多域 MOPD)下各采了一小时窗口、15 秒分辨率的利用率数据:

图4:四种配置下 teacher 节点的 GPU 利用率时间序列。可以明显看到标准 OPD(橙色)全是低矮尖峰,TGOPD(蓝色)把曲线整体抬到了高水位。MOPD 下提升稍小(67%/58%),因为 probing 也是按领域路由的——一个节点被切成 code 4 卡、math 2 卡、IF 2 卡三个引擎,只有当前 prompt 所属领域的引擎在工作,呈双峰分布。
汇总成分布和均值更直观:

图5:左图是四种配置 teacher 节点利用率的核密度分布对比——橙色 Standard OPD 全部堆在 10% 以下的底部,蓝色 TGOPD 整体移到 58%-83% 的高位。右图是集群平均利用率:4B SOPD 提升 18.0 个点(51%→69%),35B SOPD 提升 11.8 个点,两种 MOPD 配置分别提升 12.7 和 8.6 个点;rollout 节点利用率在四种配置下基本不变(波动在正常 run-to-run 方差内),说明没有持续资源争用。
几个值得记住的数:idle(低于 5% 利用率)样本占比从 59%-78% 降到 0%-2%;35B SOPD 的 teacher 节点利用率拉到 82.8%,是四种配置里最高的。这个闲置现象是结构性的,跟具体配置无关——只要 scoring 比 decoding 便宜且必须等 batch,teacher 就一定闲。
📊 实验:六个单域全胜,唯一正的 code 迁移
实验设置交代一下:student 是 Qwen3.5-4B(dense)和 Qwen3.6-35B-A3B(MoE,3B 激活参数);三个领域——数学(DAPO-Math-17K 训练)、代码(CodeI/O 的 input-output prediction)、指令遵循(Nemotron-Cascade 2 过滤 prompts)。每个领域先用 GRPO 训一个专用 teacher 再冻结。基线包括 Vanilla OPD、TrOPD(token 级 trust region)、RG-OPD(verifier 一致性做轨迹级门控)、RLSD-style(方向-幅度分解)。框架是 slime 的异步 rollout-update 架构,所有方法共享 IcePop 做 train-inference mismatch 校正。
单域结果(Table 1),4B 的关键数字:
| 方法 | AIME 2025 | AIME 2026 | HMMT-Feb | LiveCodeBench | OJBench | IFBench | IFEval |
|---|---|---|---|---|---|---|---|
| Base Model | 47.8 | 58.1 | 40.5 | 39.4 | 14.4 | 35.9 | 85.3 |
| Teacher | 63.4 | 73.4 | 54.8 | 53.3 | 17.0 | 55.9 | 85.3 |
| Vanilla OPD | 61.1 | 71.2 | 54.3 | 42.3 | 18.8 | 48.5 | 83.9 |
| TrOPD | 62.1 | 70.5 | 56.8 | 49.6 | 18.1 | 53.2 | 84.6 |
| RG-OPD | 63.5 | 73.6 | 54.1 | 45.6 | 19.4 | 54.3 | 84.1 |
| RLSD-style | 48.8 | 56.7 | 40.3 | 38.4 | 15.1 | 31.5 | 79.8 |
| TGOPD | 64.8 | 73.5 | 52.7 | 47.1 | 20.0 | 50.4 | 85.2 |
35B 那边我挑最戏剧性的说:35B 代码域是最干净的胜负手。LiveCodeBench 上,所有其他蒸馏方法全部产生负迁移——Vanilla OPD 比 base 还低 0.8 个点,TrOPD 低 2.5,RG-OPD 低 3.5,RLSD-style 低 4.1。而 TGOPD 是唯一正向迁移的方法:比 base 高 3.0 个点(64.0 vs 61.0),甚至比 teacher 本身还高 1.3 个点。OJBench 上同样超过 teacher(28.7 vs 27.6)。
为什么偏偏是 code?回到图2,code teacher 的"自信地错"用 confidence 检测的 AUROC 只有 0.51——基本等于掷硬币。别的领域 teacher 错了多少还留点痕迹,code 领域的错误是完全隐形的,所以对 code 来说,prompt 级可靠性门控的边际收益最大。整体增益排序也印证了这一点:code 最大(两个规模平均提升约 3 个点),IF 次之,math 最小。
RLSD-style 的对照也很有意思:它对所有 prompts 统一削弱 teacher 的作用,结果 14 个 benchmark 列里有 8 列低于没训练过的 base——均匀减少 teacher 角色,会把有用的监督也一起砍掉。TGOPD 的思路恰恰是反的:大多数 prompts 上稠密信号原样保留,只在审计失败处撤回。
多域 MOPD(Table 2),无需任何修改直接复用(门控是 per-prompt、per-teacher 的):4B 平均分从 53.40 提到 54.54(提升 1.14 个点,赢 6/7 列),35B 从 60.99 提到 61.94(提升 0.95 个点,赢 5/7 列)。少数几列回退都在半分以内,处于早期 checkpoint 的正常波动范围。
🔬 消融:阈值是倒 U 形,"堵住错误信号"才是收益主体
阈值消融(\(K_T=5\) 扫五个阈值,4B 数学域,99 steps):

图6:门控阈值 \(\tau\) 的消融曲线,三个数学 benchmark 全部呈倒 U 形。阈值太松(\(\leq 2/5\))放进太多低可靠性信号,增益变小;太紧(\(\geq 4/5\))又把有用监督拒之门外——\(\tau=5/5\) 时 HMMT-Feb 甚至跌破 Vanilla OPD 基线。峰值在 \(\tau=3/5\):AIME 2026 达 73.1、AIME 2025 达 64.4、HMMT-Feb 达 58.0,分别超 Vanilla OPD 1.9、3.3、3.7 个点。
峰值 60% 跟主实验默认的 2/3(约 67%)挨得很近——说明在"多数表决"附近存在一个相当宽的最优区间,工程上不用精细调这个阈值。
门关之后怎么办(GRPO fallback vs Mask only)的消融更有信息量。跨四个设置统计,masking 平均提升 1.08 个点,full fallback 平均提升 1.20 个点。也就是说,大约 90% 的收益在"把不可靠的 teacher 信号直接掐掉、什么都不补"时就已经拿到了。
这个数字值得停下来想想。TGOPD 涨点的主体不是 GRPO fallback 提供了什么好信号,而是阻止了坏信号进入梯度。这和图2的诊断闭环了——真正伤训练的是那些 confidently wrong 的稠密监督。fallback 只在 student 自己也能解决一部分 gated-off prompts 时锦上添花(组内有对有错才有相对信号),code 域因为执行式 verifier 信号直接,fallback 在 OJBench 上两个规模都赢了 masking。
🤔 我的判断
这篇论文最值钱的地方,是把一个系统观察和一个算法洞察缝在了一起:teacher 节点反正闲着,不如让它先自测——自测结果同时解决了可靠性问题和利用率问题。这种"一个改动治两个病"的设计,通常比单纯的算法创新更值得工程团队抄作业。
批判几句也说在前面。
关于 baseline:TrOPD 和 RG-OPD 在不少列上跟 TGOPD 互有胜负(比如 4B HMMT-Feb 上 TrOPD 56.8 对 TGOPD 52.7),TGOPD 赢在 6/6 设置的稳定性而不是每列都碾压。增益绝对值多在 1-3 个点,属于扎实但不惊人的幅度。
关于适用范围:整套方法依赖 automatic verifier。open-ended 任务(写作、对话)没有现成的二元判分器,可靠性估计这条路走不通——作者自己也承认这是最重要的扩展方向。
关于"先验证再蒸馏"这个 idea 的新颖性:坦白讲,用 verifier 给 teacher 信号做质量过滤并不是没人想过,RG-OPD 已经在 trajectory 级做了类似的事。TGOPD 的差异在于决策的粒度和时机——在稠密监督被接纳之前、在 prompt 级、用完整 teacher rollouts 做排他性路由,而不是事后剔除或校准。粒度选择带来的工程简洁性(probe 填闲置窗口)是它真正区别于前人的地方。
还有一个我自己也没完全想透的点:fallback 和 masking 的差距其实很小(0.15-0.60 个点),4B 多域下 masking 反而更好。作者选 fallback 的理由是"一致性",但如果你的场景 verifier 信号弱或组内方差经常为零,直接 mask 掉可能更省事。这块结论别当成铁律。
工程启发:如果你在做异步蒸馏架构,不管用不用这套门控,"teacher 节点利用率常年个位数"这个现象都值得去自己集群上量一下——59%-78% 的时间低于 5% 利用率,这个浪费是结构性的。哪怕只做利用率回收,probe 类任务填充闲置窗口的思路也能直接搬。
觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我