蒸馏与在轨蒸馏(Distillation / On-Policy Distillation, OPD)
所属:01-fundamentals / 02-post-training
面试权重:★★★
来源:《深入理解 AI Agent:设计原理与工程实践》第 8 章「蒸馏:提升样本效率」(李博杰,github.com/bojieli/ai-agent-book)—— 在轨蒸馏 / OPSD / Prompt 蒸馏 / CoT 蒸馏 / 拒绝采样微调;《深入理解 AI Infra:量化分析与系统设计》第 3 章、第 10 章 §10.5 —— OPD 的计算工作与流水线位置。两处均为读书所得,非一手实测
面经信号:《腾讯大模型算法面经》一二面直接问「什么是 OPD / OPD 用什么 loss / 为什么用 reverse KL 而不是 forward KL」(原始摘录见02-interview/questions/xhs-reports.md§4.5;该文件此前标着「超出可核实范围」,本文即是对这条标注的兑现)
相关知识点:sft.md、08-agentic-rl.md、grpo.md、rlhf-ppo.md、data-engineering.md、06-agent-infra/09-training-systems.md
⚠️ 诚实边界(先自己讲):你没有做过蒸馏。HKJC 是单轮 RLVR(采样多条 SQL、规则判定奖励),Writing Copilot 是 SFT / DPO / GRPO —— 都在信号源是环境或偏好的那一侧。被追问「你实际蒸馏过什么」,正确答法是划边界:「蒸馏这条线我没有落地过;我做过的是它两端的素材——SFT 的数据构造,和 RL 的奖励设计。中间『教师分布怎么给、给在哪』这一环,我的理解来自材料。」这比编一条蒸馏流水线可信得多。
⚠️ 书没覆盖的一层:书只写到「通常最小化两者的 KL 散度」与「在轨蒸馏优化的是学生当前策略所访问状态上的教师 KL」,没有明说 KL 的方向。本文 §3 对 reverse / forward KL 的回答属通用领域知识与文献(GKD 一类工作),未做一手考证 —— 这是本文唯一一处离开参考书基线的地方,已单独标注。
一句话#
蒸馏是「用教师的行为监督学生」。在轨蒸馏(On-Policy Distillation, OPD) 相对离轨蒸馏只改了一件事:轨迹由当前学生自己生成,教师在这些位置上给出逐 token 的完整概率分布。于是同一条长度为 的 rollout,从「一个 0/1 结果」变成「约 组密集监督」—— 这是它相对 RL 的全部卖点,也是它的全部代价(要额外跑一遍教师前向)。
为什么重要(面试角度)#
这是仓库此前整块缺失的后训练主题(backlog 里点名过:「蒸馏,仓库作为后训练主题完全缺失,GLOSSARY 只有一行」),而它在面经里是直接题。面试官想听的是:
- 它和 RL 是同一个问题的两种答法。 「反馈太稀疏怎么办」有两条路:RL 的做法是把信号做细(过程奖励、路径约束、turn-level reward,见
08-agentic-rl.md),蒸馏的做法是换一个信号源(用教师的逐 token 分布替代标量奖励)。能把这两条并排讲,比只会其中一条高一个层次。 - 「OPD 用什么 loss、为什么是 reverse KL」是区分「听过」和「想过」的一问。 这一问书里没有直接答案,所以更要能说清自己的依据是什么、哪一层是通用知识 —— 这恰好是本文唯一标注「未做一手考证」的地方。
- 它回答的是 SFT 的结构性缺陷,而那个缺陷在
sft.md里只说了半句。SFT 的监督很密集,却只覆盖教师会走到的状态;学生一旦在早期犯下教师不会犯的错,后面每一步都在陌生前缀上预测。 - 它有系统侧成本,不是免费的密集信号。 教师前向是一项独立的计算工作,要和生成、验证、学习一起进流水线 —— 这一层接
06-agent-infra/09-training-systems.md。面试里能主动说「OPD 省的可能是更新次数,不是总 GPU 小时,要实测」,比说「OPD 更省」稳得多。
核心内容#
1. 先把「蒸馏」这个词拆成三个正交的维度#
「蒸馏」在中文语境里被当成一个词用,但它至少混了三条不同的轴。先把它们拆开,后面每一个问题才有明确所指:
| 维度 | 取值 | 决定什么 |
|---|---|---|
| 谁生成轨迹 / 状态 | 人类或教师(离轨)↔ 当前学生(在轨) | 训练状态分布是否等于部署时遇到的分布 —— 这是 on-policy 的全部含义 |
| 监督是什么形态 | 硬标签(SFT)↔ 教师的逐 token 分布(软监督)↔ 完整思考轨迹(CoT 蒸馏) | 每条轨迹能产生多少学习信号 |
| 迁移方向 | 大到小(换更便宜的模型)↔ 思考到非思考(同规模,把显式 CoT 折叠进参数) | 目的是降本还是降延迟 |
书里的原话值得背:「这里的 policy 指谁生成学生将要学习的状态前缀,不是指谁提供监督。」—— 这句话能一次挡掉「on-policy 是不是指用在线数据」这类混淆。采样与监督是两件事,OPD 是「学生采样 + 教师监督」。
顺带把三个近义词钉死:
- 离线 / 在线(offline / online):数据是否预先固定。也可以在线收集数据后用监督损失。
- 在轨 / 离轨(on-policy / off-policy):采样分布与所优化的策略是否一致 —— 比 online 更严。
- 异步的在线 RL 可能使用滞后的策略,于是名义上在线、实际已经离轨。OPD 同样会遇到生成引擎与训练引擎的计算差异。在线采样用来缓解数据分布偏移;训推一致性是另一笔账。
2. 在轨蒸馏(OPD):让一次 rollout 产生密集监督#
书里那张表是这一节的骨架,值得整张记住:
| 方法 | 轨迹 / 状态由谁采样 | 每条轨迹的主要监督 |
|---|---|---|
| SFT / 离轨蒸馏 | 人类或教师 | 标注答案的逐 token 监督,密集 |
| On-policy RL | 当前学生 | 结果或过程奖励,通常稀疏 |
| On-policy Distillation | 当前学生 | 教师在学生前缀上的逐 token 分布,密集 |
它补的洞是「前缀分布偏移」(协变量漂移)。 固定数据的 SFT 在给定答案的真实前缀上预测下一个 token(教师强制),部署时却要按自己生成的前缀继续。一旦前面出错,后续就进入训练数据很少覆盖的上下文。书给了一个量级:在特定的序列模仿学习设置中,误差最坏可随轨迹长度 近似按 累积,而在线数据聚合可把它降到约 —— 注意这是「特定设置下的最坏界」,不是普适定律,但它解释了为什么长序列任务上离线模仿特别脆。
OPD 把两侧的优点拼起来:学生决定走到哪里(消掉分布偏移),教师告诉它下一步的完整分布(拿到密集信号)。伪代码只有五行:
student_trajectory = rollout(student, task)
loss = 0
for state in student_trajectory:
teacher_logits = teacher(state)
loss += KL(student_logits(state), teacher_logits)
update_student(loss)书里举的例子很直观:学生生成「先查询 API,再解析返回值……」,教师在「查询」这个 token 的位置给出「查询」80%、「调用」15%、其余 5% 的分布。相比一个终局 0/1,这是密集得多、方差低得多的信号。
可引用的数字(都标出处):
- 数学任务上,达到同等性能所需的训练步数约为纯 RL 的 1/10(书第 8 章)。
- 作者自己的一手实验:在「时间感」任务上比较 DPO、四种 RL 与 OPD,前三类分别受稀疏奖励、目标错位、rollout 形状不匹配和策略崩溃限制;换成冻结的 Qwen3-32B 教师、在学生自己的多轮轨迹上逐 token 对齐后训练平滑收敛,四种条件下通过率比同源 SFT 基线高 23–47 个百分点(书第 8 章)。
- 报告里的一次横向对照:Qwen3 技术报告表 21 把同一个 8B 模型的 RL 与 OPD 两条后训练路线并列,投入分别约 17,920 与 1,800 GPU 小时(infra 书第 3 章)。注意读法:这是两条可二选一的替代路线,不是流水线里前后相接的两段,不能相加。
- DeepSeek V4-Flash 的用法:先通过 SFT 和 RL 训练领域专家,再用多教师 OPD 把多个专家的能力整合进同一个模型(infra 书第 3 章 §5.1)。
但它的前提很硬,必须自己先说出来:
OPD 不是「从零创造能力」的办法。 学生至少要能进入教师可纠正的有效状态,教师策略也不能离学生的有效支持太远。若基模连目标语言、领域概念或基本动作都没有,仍应先 Mid-training 或用离轨示范冷启动,再切换到在轨蒸馏。
还有一条工程前提容易被漏:OPD 优化的是「学生当前策略所访问状态上的教师 KL」。如果 rollout 引擎实际从 采样、而 trainer 计算的是另一个 ,即使不显式使用 PPO 的概率比,训练状态也已经离轨。实现时要检查「更新前 sampler / trainer 的 log probability 是否一致」,否则名义上的 On-Policy Distillation 会退化成带分布错位的训练。
3. OPD 用什么 loss:KL 的方向(书未覆盖,标为通用知识)#
这一节回应面经原题的后半问。先把出处说清楚:书只写到「让学生的预测分布贴近教师分布,通常最小化两者的 KL 散度」,以及「在轨蒸馏优化的是学生当前策略所访问状态上的教师 KL」。方向(reverse 还是 forward)书里没有明说。 以下属通用领域知识与文献(GKD 一类工作),未做一手考证 —— 面试里也应当这样交代,而不是把它说成一手结论。
3.1 两个方向的差别#
对同一个前缀位置、在词表上定义两个分布 (学生)与 (教师):
两者不对称,差别不是数值大小,而是优化出来的形状不同:
- forward KL 是 mass-covering(覆盖式) —— 只要教师在某个 token 上有质量、而学生给了接近零的概率,惩罚就很大。它逼学生把概率摊开去覆盖教师的所有峰。
- reverse KL 是 mode-seeking(寻峰) —— 学生可以放弃教师分布里它学不会的尾部,把质量集中到少数高峰上。
这一对词参考书里有(第 8 章讲 SFT 与 RL 的分布差异时):极大似然 SFT 逐条学习示范,因此常表现出 mass-covering 倾向;而 RL「按奖励重新分配概率,配合常见的反向 KL 约束时更容易表现出 mode-seeking 倾向」。书还补了一句很关键的话:最终保持多样性还是收缩到少数模式,「取决于示范分布、奖励函数、KL 方向与系数、熵正则和采样温度」—— 即方向本身就是一个可调的设计变量,不是常数。
3.2 为什么 OPD 用 reverse KL#
三条理由,按可靠程度排:
- 采样与期望必须一致(最干净的一条)。 轨迹由学生生成,所以只有对 取的期望能用样本无偏估计。在学生采出的 token 上算 ,就是 reverse KL 的一个无偏单样本估计;拿同一个样本去估 forward KL 则是有偏的(它要对 求期望)。方向跟着采样分布走 —— 这是判据,不是巧合。
- mode-seeking 与「学生容量有限」这个事实相符。 学生学不会教师的长尾。forward KL 会重罚「教师有质量、学生为零」的位置,把学生的概率推向它根本生成不好的区域 —— 表现就是输出不流畅、把教师的系统性长尾错误也一起硬编码进来。reverse KL 允许它放弃学不会的部分。
- 与目的相符。 蒸馏一个生成器,目标通常是「让学生像教师那样写出高概率的好答案」,而不是「复现教师的整个分布」。
3.3 反向的代价,以及「没有免费的方向」#
别把 reverse KL 说成普遍更优 —— 这是这一节最容易写满的地方:
- reverse KL 是 mode-seeking,会收缩多样性。教师的多峰分布(多种合理写法、多种风格)在学生这里可能只剩一个峰。要保多样性时,forward KL 或 JSD 更合适。
- 离轨蒸馏里常见的选择恰恰是 forward KL。 经典 Hinton 蒸馏、以及「在教师生成的固定数据上做蒸馏」,用的都是 —— 因为那里的样本来自教师,forward KL 才是能被无偏估计的那个方向。同一条判据,反过来用。
- 系统比较过 forward KL / reverse KL / JSD 的工作(GKD 一类)给出的结论是没有哪个方向在所有设置下都最好,与教师数据的比例、学生容量有关。
可背的一句话:「KL 的方向应该与生成样本的那一方一致 —— 学生生成就用 reverse KL,教师或固定数据生成就用 forward KL。OPD 选 reverse KL,根子上是因为它叫 on-policy。」
3.4 追问两层:实现里未必真的在算 KL#
面试官如果继续挖,这一层能拉开差距 —— 但要先声明这是实现层面的常见差异,不是定义:
- 做法 A:逐位置的全分布 KL。 教师在学生走到的每个前缀上跑一次前向,拿到完整 logits,算 。这是 §3.1 的严格形态,代价是每个位置都要存教师分布。
- 做法 B:在学生采出的那个 token 上算交叉熵。 损失写成 , 是学生自己采的。这不是 reverse KL 本身 —— 它等于 ,而 ,差一项学生的熵。
两者的取舍是真实的:做法 B 便宜(只需教师在那个 token 上的概率),且天然带一点「别把学生熵压太低」的意味;做法 A 才严格对应「在学生的状态分布上最小化教师 KL」。能主动说出「我实现的是哪一种、它和严格 reverse KL 差在哪一项」,比背下 reverse KL 更值钱。
4. 没有更强的教师怎么办:OPSD(在轨自蒸馏)#
OPD 的威力来自教师,也因此背上一个硬前提:必须有一个明显强于学生的教师。做垂直领域模型时这个前提常常不成立 —— 现有模型在该领域都不够好,就没有教师可用。
On-Policy Self-Distillation(OPSD,在轨自蒸馏) 的破题方式是:同一个模型分饰教师和学生两角,但看到的上下文不同。教师版能看到特权信息(标准答案、已验证的正确解答、人工示范、领域文档),学生版只看到问题本身,却在自己采样的轨迹上向教师版的逐 token 分布对齐。对着答案解释学生刚走过的路径,通常比独立探索容易,所以一条 rollout 仍然产生密集监督。
student_trajectory = rollout(model, task_without_answer)
loss = 0
for state in student_trajectory:
privileged_state = add_verified_answer(state)
teacher_logits = stop_gradient(model(privileged_state))
loss += KL(model(state), teacher_logits)
update(model, loss + retention_regularizer)三条边界,一条都不能省:
privileged_state只能在训练侧构造,绝不能泄露给部署时的 Agent;retention_regularizer代表保留集 / 风格约束,不是一个固定超参数;- 流程还必须检查数据权限、答案遮蔽和遗忘风险。
与 RLVR 的差别:OPSD 不要求奖励一定能被自动验证 —— 特权信息可以是标准答案、人工示范或领域文档。它保留了「在轨采样 + 逐 token 监督」的样本效率优势,但不会凭空创造新知识:如果模型拿着答案也讲不清过程,自蒸馏就没有额外信号。朴素 OPSD 还可能让模型丢失原有的思考风格,需要额外正则稳定(书引的 Purified OPSD 正是在处理这一点)。
5. 另外两条路:Prompt 蒸馏与 CoT 蒸馏#
这两条是离轨蒸馏,与 OPD 正交,面试里常被当成「蒸馏」的默认含义,值得分清。
5.1 Prompt 蒸馏(把长提示 + 思考教师,压成短提示 + 非思考学生)。 复杂任务常需要数千甚至上万 token 的系统提示,每次调用都付延迟与费用;用思考型大模型时,内部思考 token 进一步放大成本。做法是:教师在完整提示与思考模式下生成高质量答案,训练数据只保留用户输入与最终结论,丢弃冗长提示与中间思考。学生学会「直接给出结论」。
- 书给的量级:「思考 → 非思考」在同规模下可获得 20–30 倍的响应速度提升(书第 8 章)。
- 两个方向不冲突,生产里常同时用:「大到小」换成本,「思考到非思考」换延迟。
- 它继承教师的边界:教师在长尾上有系统性错误,学生会进一步硬编码;教师靠工具保证正确性时,单纯的输出蒸馏会丢掉工具带来的鲁棒性。
- 适用判据(书里的工程启示):产品形态稳定、输入分布可预期、成本约束明显时是好手段;探索期或任务未定型时,保留显式思考与可编辑的提示工程仍是快速试错的核心。
5.2 CoT 蒸馏(把完整思考轨迹转移给学生)。 与 Prompt 蒸馏相反,它保留教师的完整思考轨迹。书给的数字:对能力较强的教师做 CoT 蒸馏,同等参数量下可恢复教师 70%–80% 的能力。DeepSeek-R1 发布时同步开源的一系列蒸馏小模型(用 R1 的思考轨迹对 Qwen、Llama 做 SFT)是这条路线的代表。
- 三步流程:① 采集轨迹(从目标任务分布采样问题,教师生成「思考 + 答案」轨迹,用规则验证器过滤掉最终答案错误的轨迹 —— 否则错误的思考过程会被学生一并模仿);② SFT 训练(以「问题 →
<think>思考</think>+ 答案」为训练对);③ 对比评估(测能力恢复比例,并检查思考轨迹里是否出现教师式的反思、回溯与验算行为)。 - 「思维围墙」现象:一些闭源思考模型在输出前会对 CoT 做改写或摘要,最有价值的原始思考过程被留在 API 之后 —— 这既是防蒸馏,也是产品体验考虑。所以书里选开源思考模型当教师。
- 代价:学生会继承教师的系统性错误与冗长思考习惯(后者可结合 AdaptThink 一类思路做二次优化,与 Prompt 蒸馏互补成「快—慢双系统」)。
一条来自书里实验现场的观察,面试里很少见但很有意思:作者实现蒸馏实验时,先由 GPT-5.6-Sol 驱动的 Codex 写代码,任务一旦明确涉及模型蒸馏,Codex 拒绝继续;换到 Claude Opus 5 驱动的 Claude Code,同样拒绝;最后用 Kimi K3 完成。两次拒绝针对的不是「公开内部思维链」,而是「实现一个用强教师数据训练学生模型的完整蒸馏实验」。模型蒸馏与正常 SFT 技术上高度相似,但在厂商的安全与产品策略里,它可能与模型提取、能力复制和知识产权保护联系起来。 书同时给了一句给绝大多数后训练者的定心丸:教师只需要「明显高于学生」,不需要「全球第一」;如果要训的是 200B 及以下规模,用开源 SOTA 当教师已经完全够用。
6. 拒绝采样与 RFT:蒸馏的「离线表亲」#
拒绝采样(Rejection Sampling):从目标任务分布采样问题,让模型生成多条候选,用规则验证器或奖励模型筛掉错的、只留对的。用它构造的数据做 SFT,就是拒绝采样微调(Rejection Sampling Fine-Tuning, RFT)。
书对它的定位很准:它介于纯 SFT 与 RL 之间 —— 不训奖励模型、不做策略梯度,只靠「从多条采样中拒绝错的、留下对的」提升数据质量,是可验证任务上性价比极高的数据构造手段。
三条容易答错的边界:
- 「采样自当前策略」不等于「on-policy 训练」。 筛完冻结成数据集做 SFT,就是离线训练 —— 这一点
data-engineering.md已经改正过(此前写成「拒绝采样天然 on-policy」)。 - 它和蒸馏的关系:RFT 是数据构造手段(造出一批对的轨迹),OPD 是训练信号手段(教师在学生自己的前缀上给分布)。两者可以叠加:先用拒绝采样筛出正确轨迹,再让教师在这些轨迹上逐 token 给分布。
- 验证器决定上限:规则验证器覆盖不到的失败模式,拒绝采样一条也筛不掉。
7. 系统侧:OPD 在训练系统里长什么样#
这一层接 06-agent-infra/09-training-systems.md,是「算法答完了,工程怎么接」的部分(来源:infra 书第 3 章、第 10 章 §10.5)。
① 教师前向是一项独立的计算工作。 书里把它与「规则验证」并列点出:RL 的反馈阶段可能执行规则验证或奖励模型,OPD 则需要教师给出监督;两者都应按实际反馈工作的处理能力分配资源。所以 OPD 不是「免费拿密集信号」,它往流水线里插了一道工序。
② 它进的是同一套三阶段流水。 生成、验证、学习像前后相接的三道工序,前一道做得更快,只有后一道能消化,才会增加最终产出。设三者处理能力为 ,验证后符合策略版本要求的比例为 ,则每秒可用于训练的样本数上限
扩容要加在当前最慢的那一段,加完再看瓶颈移到哪 —— 这条对 OPD 和 RL 同样成立,只是「验证」那一段换成了「教师前向」。
③ 训推一致性是 OPD 的额外负担。 书把两者放在一起讲:异步在线 RL 可能使用滞后的策略,OPD 也会遇到生成引擎与训练引擎的计算差异。所以「在线采样」缓解的是数据分布偏移,而训推一致性要另外对齐生成与训练两端的数值路径。
④ 到底省不省,要实测。 书的结论句值得原样记住:
OPD 的潜在优势在于:达到目标能力所需的学习样本或更新次数可能减少。它同时增加学生在线生成、教师前向与权重同步的成本,是否减少总 GPU 小时或完成时间仍要实测。
「OPD 更省」和「OPD 更贵」都能被反问穿 —— 前者忽略教师前向与权重同步,后者忽略更新次数的下降。正确答法是分开说这两笔账,然后说哪一笔在什么条件下更大。
8. 选型:什么时候用哪个#
| 你手上的条件 | 该选 | 理由 |
|---|---|---|
| 有明显更强的教师 + 环境交互昂贵 | OPD | 一次 rollout 产生约 组监督,不必再采一批环境轨迹 |
| 有教师,但只有固定数据、不打算在线采样 | 离轨蒸馏 / CoT 蒸馏(forward KL) | 数据来自教师,forward KL 才是可无偏估计的方向 |
| 没有更强的教师,但有标准答案 / 示范 / 领域文档 | OPSD | 特权信息替代外部教师,保留在轨采样 + 逐 token 监督 |
| 基模连基本动作都没有 | 先 Mid-training 或离轨示范冷启动,再切 OPD | OPD 不创造能力,学生得先能进入「教师可纠正」的状态 |
| 产品形态稳定、只想降本降延迟 | Prompt 蒸馏(+ 可选 CoT 蒸馏) | 长提示与思考 token 的成本可直接消掉 |
| 可验证任务、不想训奖励模型 | 拒绝采样 / RFT | 不训 RM、不做策略梯度,性价比高;但筛完即离线 |
| 奖励能可靠验证、且要探索示范之外的行为 | RL(见 08-agentic-rl.md) |
蒸馏只能学教师会做的;RL 有机会发现教师不会的策略 |
这张表的用法:面试官问「你会选蒸馏还是 RL」,先反问两个条件 —— 「有没有一个明显更强的教师」和「环境交互贵不贵」。这两个答案基本就把选项缩到一两个了。不要直接答「蒸馏更省」或「RL 更强」。
常见面试问法#
Q:什么是 OPD?它和 SFT、RL 分别差在哪? A:OPD 是在轨蒸馏,定义特征是**「学生生成轨迹,教师在这些位置上给逐 token 分布」。和 SFT 差在谁生成状态**:SFT 用教师强制、在人类或教师的前缀上预测,因此只覆盖教师会走到的状态;学生在部署时按自己生成的前缀继续,一旦早期出错就进入训练数据没覆盖的上下文(前缀分布偏移,书给的量级是特定设置下误差最坏按 累积,在线数据聚合降到约 )。和 RL 差在信号密度:RL 通常只在轨迹结束拿到一个标量(或加了过程奖励),OPD 把同一条长度 的轨迹变成约 组监督,因此方差低得多。书给的可引用数字:数学任务上达到同等性能所需步数约为纯 RL 的 1/10。
Q:OPD 使用什么 loss?为什么用 reverse KL 而不是 forward KL? A:先说清出处 —— 参考书只写到「通常最小化两者的 KL 散度」,方向没有明说,下面是通用知识。loss 是在学生的前缀位置上,让学生的预测分布贴近教师分布,即逐 token 的 KL(书原话:在轨蒸馏优化的是「学生当前策略所访问状态上的教师 KL」)。用 reverse KL(,期望在学生下)而不是 forward KL(,期望在教师下),三条理由:① 采样与期望必须一致 —— 轨迹是学生生成的,只有对 的期望能用样本无偏估计,在学生采出的 token 上算 就是 reverse KL 的无偏单样本估计,估 forward KL 则是有偏的;② mode-seeking 更符合「学生容量有限」 —— reverse KL 允许学生放弃教师分布里它学不会的尾部,forward KL 是 mass-covering,会重罚「教师有质量、学生为零」的位置,把学生概率推向它根本生成不好的区域;③ 与目的相符 —— 蒸馏生成器的目标是「像教师那样写出高概率的好答案」,不是复现整个分布。但要把代价也说了:reverse KL 会收缩多样性,教师的多峰分布可能只剩一个峰;离轨蒸馏里常见的选择恰恰是 forward KL,因为那里的样本来自教师。统一判据是「KL 的方向应该与生成样本的那一方一致」。另外,系统比较过 forward/reverse/JSD 的工作给出的结论是没有哪个方向在所有设置下都最好。
Q:实现的时候,loss 真的是在算 KL 吗? A:不一定,两种做法都存在。做法 A 是逐位置的全分布 KL(教师在每个学生前缀上跑前向,拿完整 logits 算 ),严格对应定义;做法 B 只在学生采出的那个 token 上算交叉熵 ,它等于 ,而 ,差一项学生的熵。做法 B 更便宜且天然带一点熵的意味,做法 A 才严格对应「在学生的状态分布上最小化教师 KL」。能主动说清自己实现的是哪一种、差在哪一项,比背下 reverse KL 更有说服力。
Q:没有比学生更强的教师,还能做蒸馏吗? A:能,用 OPSD(在轨自蒸馏):同一个模型分饰两角,区别只在上下文 —— 教师版看到特权信息(标准答案、已验证的正确解答、人工示范、领域文档),学生版只看到问题,在自己采样的轨迹上向教师版的逐 token 分布对齐。「对着答案解释自己刚走过的路径」比独立探索容易,所以一条 rollout 仍有密集监督。三条必须守住的边界:特权信息只能在训练侧构造、不能泄露给部署时的 Agent;要有保留集 / 风格约束做正则(朴素 OPSD 会让模型丢失原有思考风格);要检查数据权限、答案遮蔽和遗忘风险。它和 RLVR 的差别是不要求奖励能被自动验证,但不会凭空创造新知识 —— 模型拿着答案也讲不清过程时,自蒸馏就没有额外信号。
Q:蒸馏和 RL,你选哪个? A:先反问两个条件:有没有一个明显强于学生的教师,以及环境交互贵不贵。有教师 + 交互贵 → OPD(一次 rollout 产生约 组监督,不必再采一批环境轨迹);没教师但有特权信息 → OPSD;可验证任务且不想训奖励模型 → 拒绝采样 / RFT;奖励可靠且要探索示范之外的行为 → RL,因为蒸馏只能学教师会做的,RL 才有机会发现教师不会的策略。别直接答「蒸馏更省」或「RL 更强」 —— 书对 OPD 的结论句是「潜在优势在于达到目标能力所需的学习样本或更新次数可能减少,但它同时增加学生在线生成、教师前向与权重同步的成本,是否减少总 GPU 小时或完成时间仍要实测」。报告里可引的对照是 Qwen3 表 21:同一 8B 模型的 RL 与 OPD 两条替代路线,约 17,920 与 1,800 GPU 小时,不能相加。
Q:蒸馏有什么风险? A:四条。① 继承教师的边界 —— 教师在长尾上有系统性错误,学生会进一步硬编码;教师靠工具保证正确性时,纯输出蒸馏会丢掉工具带来的鲁棒性。② 不能创造能力 —— 学生得先能进入「教师可纠正」的有效状态;基模连基本动作都没有时,仍要先 Mid-training 或离轨示范冷启动。③ 系统成本 —— 教师前向是独立的计算工作,还要过训推一致性;「省不省」要分两笔账算。④ 安全与合规 —— 书里的实验现场记录了两次模型拒答(Codex 与 Claude Code 都拒绝实现蒸馏实验),说明模型蒸馏在厂商策略里可能与模型提取、能力复制和知识产权保护关联;使用开源模型做教师前仍应确认许可证对蒸馏产物的授权条款。
易错点#
| 易错说法 | 问题 | 应该说 |
|---|---|---|
| 「on-policy 就是用在线数据」 | 混淆了采样与监督两件事 | 书里点明:policy 指谁生成学生将要学习的状态前缀。OPD 是「学生采样 + 教师监督」;在线(online)只表示数据随训练持续产生,在轨(on-policy)还要求采样分布与所优化的策略一致 |
| 「OPD 用 forward KL,因为蒸馏就是最小化 KL」 | 方向没交代,且多半答反 | OPD 用 reverse KL(期望在学生下),根子是采样与期望一致;离轨蒸馏才常用 forward KL。判据是「方向跟着生成样本的那一方走」,并主动说明这层参考书未覆盖 |
| 「OPD 更省」/「OPD 更贵」 | 各说一半 | 省的是更新次数/样本,贵的是学生在线生成 + 教师前向 + 权重同步;书原话是「是否减少总 GPU 小时或完成时间仍要实测」 |
| 把 Qwen3 表 21 的 17,920 与 1,800 GPU 小时相加 | 读错口径 | 那是同一 8B 模型的两条替代后训练路线,二选一,不是流水线前后两段 |
| 「蒸馏能从零教会模型一个能力」 | 高估了它 | OPD/OPSD 都不创造能力:学生至少要能进入教师可纠正的有效状态;没有基本动作时先 Mid-training 或离轨示范冷启动 |
| 「采样自当前策略 = on-policy 训练」 | 术语踩坑 | 拒绝采样筛完冻结成数据集做 SFT 就是离线;「采样自当前策略」≠ on-policy 训练 |
| 「名字叫 On-Policy Distillation,就一定是 on-policy」 | 忽略训推一致性 | 若 rollout 引擎从 采样、trainer 算的是另一个 ,名义 OPD 也会退化成带分布错位的训练;要查更新前 sampler / trainer 的 log probability 是否一致 |
| 「蒸馏小模型一定划算」 | 漏了继承成本 | 会继承教师的系统性错误与冗长思考习惯;后者要二次优化(AdaptThink 一类),与 Prompt 蒸馏互补成「快—慢双系统」 |
| 「教师越强越好」 | 把必要条件当充分条件 | 书里的定心丸:教师只需明显高于学生,不需要全球第一;训 200B 及以下时开源 SOTA 已够用。教师太强反而可能离学生的有效支持太远 |
| 「Prompt 蒸馏和 CoT 蒸馏是一回事」 | 方向相反 | Prompt 蒸馏丢弃思考、只留结论(换延迟,20–30×);CoT 蒸馏保留完整思考轨迹(换能力,可恢复教师 70%–80%) |
自测#
1. 为什么说「在轨蒸馏」里的 on-policy,指的不是「用在线数据」?
答案
因为书里把 policy 定义得很窄:它指「谁生成学生将要学习的状态前缀」,不是指谁提供监督。OPD 的两个角色是分开的 —— 学生生成轨迹(这部分是 on-policy),教师提供逐 token 分布(这部分是监督)。所以「在线」和「在轨」是两层:在线(online) 只说数据随训练过程持续产生(在线收集的数据也可以配监督损失,甚至筛完冻结成数据集就变成离线);在轨(on-policy) 更严,要求采样分布与所优化的策略一致。这个区分有实际后果:异步在线 RL 可能用的是滞后策略,OPD 也会遇到生成引擎与训练引擎的计算差异 —— 此时名义上的 on-policy 已经不成立,所以实现里要检查「更新前 sampler / trainer 的 log probability 是否一致」。
2. OPD 用 reverse KL 而不是 forward KL,最根本的理由是什么?把代价也说清楚。
答案
最根本的理由是采样与期望必须一致:轨迹由学生生成,所以只有对 取的期望能用样本无偏估计 —— 在学生采出的 token 上算 就是 reverse KL 的无偏单样本估计,拿同一个样本估 forward KL 则是有偏的(它要对 求期望)。第二条是形状:reverse KL 是 mode-seeking,允许学生放弃教师分布里它学不会的尾部;forward KL 是 mass-covering,会重罚「教师有质量、学生接近零」的位置,把学生的概率推向它根本生成不好的区域,表现就是输出不流畅、把教师的长尾错误也硬编码进来。代价必须一起说:reverse KL 会收缩多样性,教师的多峰分布可能只剩一个峰;离轨蒸馏(数据来自教师或固定数据集)里常见的选择恰恰是 forward KL,因为那里的样本来自教师。所以统一判据是「KL 的方向跟着生成样本的那一方走」,而不是「reverse KL 普遍更优」——系统比较过 forward/reverse/JSD 的工作结论是没有哪个方向在所有设置下都最好。另外要交代出处:参考书只写了「通常最小化两者的 KL 散度」,KL 方向这一层书里没有明说。
3. 一个团队说「我们用 OPD 替代了 RL,训练成本降了一个数量级」。这句话哪里可疑?
答案
可疑在把两笔账混成了一笔。 OPD 确实可能减少达到目标能力所需的样本或更新次数(书给的量级:数学任务上所需训练步数约为纯 RL 的 1/10),但它同时增加了三项成本:学生在线生成、教师前向(书明确把教师前向列为生成与更新之间的一项独立模型工作)、以及权重同步。所以「成本降一个数量级」要么是在说更新次数/样本量,要么是真的测了总 GPU 小时或完成时间 —— 后者才是结论。书对这个问题的原话是「是否减少总 GPU 小时或完成时间仍要实测」。还要再问两句:① 教师是谁、有多大(教师前向的成本与教师规模成正比);② 两条路线的口径是不是可比 —— 报告里可引的对照是 Qwen3 表 21,同一 8B 模型的 RL 与 OPD 两条替代路线分别约 17,920 与 1,800 GPU 小时,这是二选一,不能当成流水线前后两段相加。追问的落点是「你说的省是哪一笔」,不是否认 OPD 的价值。
4. 基模在你这个领域什么都不会,但你有大量标注好的标准答案。你会怎么排后训练的顺序?
答案
先冷启动,再上在轨方法。 书里对 OPD 的前提说得很硬:它不是「从零创造能力」的办法 —— 学生至少要能进入教师可纠正的有效状态,教师策略也不能离学生的有效支持太远;基模连目标语言、领域概念或基本动作都没有时,应先 Mid-training 或用离轨示范冷启动,再切换到在轨蒸馏。所以顺序是:① 用离轨示范 / CoT 蒸馏把基本格式与领域概念固化下来(这一步是 mass-covering,要的是覆盖面);② 有了基本动作之后,用标准答案当特权信息做 OPSD —— 这正好匹配「有大量标注好的标准答案」这个条件,因为 OPSD 的教师版就是拿着特权信息解释学生自己走过的路径,而且它不要求奖励能被自动验证;③ 如果还能拿到可靠的环境奖励,再考虑用 RL 去探索示范之外的行为(蒸馏只能学教师会做的)。要主动说的边界:OPSD 不会凭空创造新知识,模型拿着答案也讲不清过程时自蒸馏就没有额外信号,这时得回头补冷启动数据;朴素 OPSD 还可能让模型丢失原有思考风格,需要保留集 / 风格约束做正则。
5. 面试官问「你们线上为什么不做蒸馏」,你会怎么答?
答案
先划边界,再给判据,最后说清如果要做会怎么做。 ① 边界:我没有落地过蒸馏 —— 我做的是 SFT 的数据构造和 RL 的奖励设计(单轮 RLVR),蒸馏这条线我的理解来自材料,不是一手经验。② 判据:要不要上蒸馏,取决于两个条件 —— 有没有一个明显强于学生的教师,以及环境交互贵不贵。有教师 + 交互贵,OPD 才划算,因为它把一条 rollout 从「一个标量」变成约 组逐 token 监督;没有教师就退到 OPSD(用标准答案、示范或领域文档当特权信息);只是降本降延迟、产品形态已经稳定,那 Prompt 蒸馏(丢弃思考、只留结论)比 OPD 直接得多。③ 如果要做:先确认教师从哪来、许可证允许不允许蒸馏产物(书里的实验现场记录了两次模型拒答,说明这件事在厂商策略里是敏感类别),再排顺序 —— 冷启动 → 在轨蒸馏 → (奖励可靠时)RL,并接受「省不省要实测」这个结论,而不是承诺一个降本比例。这样答的价值在于:不假装做过,但把决策框架给出来了。