1 先用一句话说清楚
蒸馏不是一种模型,是一种训练方式:教师已经会了,学生容量更小或更便宜,让学生去对齐教师的行为。
对齐的对象可以很不一样:
2 时间线
名字是 2015 年 Hinton、Vinyals、Dean 给的。事情本身更早:2006 年 Buciluǎ、Caruana、Niculescu-Mizil 已经把集成模型压进一个小网,当时叫 model compression。
读这条线时,不要把每一站都当成「把模型变小」。早期目标确实是部署:手机上跑不动大网。LLM 之后,蒸馏经常发生在差不多大的模型之间:把 RL 训出来的推理能力灌回基座、把多个专家合并成一个学生、把长思维链压成短回复。压缩还在,但已经不是唯一动机。
3 Hinton:软标签里的暗知识
Hinton 2015 那篇 workshop 论文(Distilling the Knowledge in a Neural Network)把一件反直觉的事讲清楚了:教师就算几乎总能答对,错误类上的那一点点概率仍然有用。
MNIST 上一个「2」,教师给「3」的概率可能是 10−6,给「7」是 10−9。对分类对错来说,这两个数都可以当 0。对学生来说,它们说的是:这个 2 更像 3,不像 7。Hinton 把这种结构叫 dark knowledge。
温度 T 在干什么
softmax 改成:
T=1 时,教师经常把正确答案推到 0.99,剩下的类挤在 10−6 量级,学生学不到相对关系。T 提到 3~5,这些小概率被放大,暗知识才进得了损失。
损失一般写成:
前面那项是蒸馏,后面那项是真实标签。T² 是因为温度会把梯度压扁,乘回去才能让软标签这项的量级正常。Hinton 原文强调:软标签带来的梯度比硬标签小,不乘 T²,这项会被真实标签盖掉。
同时期旁边的两根枝
FitNets(Romero et al., 2015)
学生更深更窄时,只对齐最后一层 logits 不够。他们让学生中间层去拟合教师中间层,叫 hints。这是后来 TinyBERT、MiniLM 对齐隐状态的源头。
Attention Transfer(Zagoruyko & Komodakis, 2017)
视觉里:教师看图时激活在哪,学生也看哪。NLP 里对应的是注意力矩阵蒸馏。
4 Transformer 压缩年代
2018 年底 BERT 出来之后,蒸馏的主战场从 CNN 分类转到「把 12 层 BERT 变成能上线的小编码器」。三篇必须点名。
| 模型 | 年份 | 对齐什么 | 结果(相对 BERT-base) |
|---|---|---|---|
| DistilBERT(Sanh et al.) | 2019 | 软标签 + 隐状态余弦 + 掩码语言模型 | 参数少 40%,快 60%,GLUE 大约留 97% |
| TinyBERT(Jiao et al.) | 2019/2020 | 嵌入、隐状态、注意力;预训练和任务两阶段都蒸 | 4 层版大约 7.5× 更小、9.4× 更快,GLUE 留 96.8% |
| MiniLM / MiniLMv2(Wang et al.) | 2020 | 只蒸自注意力关系(Q/K/V 的点积关系) | 不必和学生头数一致;大教师往往蒸中上层比蒸最后一层更好 |
这三篇把「知识」从 logits 扩成了 Transformer 内部的三种东西:
- 输出分布:还是 Hinton 那套,只是词表从 10 类变成 3 万词。
- 隐状态:每一层的向量,FitNets 的 NLP 版。
- 注意力:谁在看谁。MiniLM 发现,不必层层对齐,蒸好关键一层的关系矩阵就够。
5 LLM 时代:先变成抄作业
生成模型和分类模型有一个本质差别:输出不是一个类别,是一条任意长的 token 序列。Kim & Rush 2016 在神经机器翻译里已经把这件事拆开了。
词级蒸馏 vs 序列级蒸馏
Word-KD:每个位置上,学生去拟合教师的下一个词分布。还是 Hinton,只是每步做一次。
Seq-KD:教师对训练集做 beam search,得到完整译文,学生在这些译文上做普通交叉熵。实现上就是「用教师造一份新语料,再 SFT」。Kim & Rush 发现,序列级往往比词级更有效,学生分布更尖,贪心解码就能接近教师的 beam 搜索。
2023 年 Alpaca、Vicuna 那一波,其实就是 Seq-KD 的黑盒版:GPT-4 / ChatGPT 写出回答,开源小模型在这些回答上做 SFT。教师内部 logits 拿不到,只能抄文本。Xu 等人 2024 的 LLM 蒸馏综述把这叫 black-box KD,把能拿到分布或隐状态的叫 white-box KD。
6 前向 KL 和反向 KL
进入生成蒸馏,散度方向突然变得重要。分类任务里输出空间就那么几类,学生盖得住。生成任务里,教师分布是多峰的:同一道题有很多都说得通的写法。小学生容量不够,硬去盖所有峰,会把概率洒到教师几乎为 0 的区域——生成里就是胡话。
反向 KL KL(π_θ ∥ π_T) = Ey∼π_θ[ log π_θ(y|x) − log π_T(y|x) ]
注意期望下标:前向 KL 是在教师样本上算的,反向 KL 是在学生样本上算的。所以散度方向和「谁来生成前缀」是绑在一起的。标准 SFT / soft KD 走前向;OPD 走反向。2026 年有人专门写论文把这两轴解开,得到四种合法目标,后面变种里会回到这张表。
7 曝光偏差:离线蒸馏的硬伤
把「在谁的前缀上算损失」画出来,OPD 为什么会出现就清楚了。
Ross 等人的 DAgger 给过一个经典界:离线模仿的误差随序列长度平方放大,O(εT²);如果专家能在学习者自己访问的状态上给反馈,可以降到大约 O(εT)。自回归语言模型就是长度为 T 的模仿学习。思维链一长,离线蒸馏的平方项开始不可忽视。
所以 OPD 的定义可以写成一句很窄的话:
8 MiniLLM、GKD、DistiLLM:OPD 的三篇奠基
2023 年中,两篇几乎同时的论文把在策略蒸馏写进 LLM:MiniLLM(Gu et al.,后来 ICLR 2024)和 GKD(Agarwal et al.,ICLR 2024)。DistiLLM(Ko et al.,2024)把工程上最容易炸的两个点补上了。
MiniLLM:反向 KL + 策略梯度
Gu 等人的判断是:标准 KD 最小化前向 KL,会逼小模型去覆盖教师的长尾变体。他们改成最小化 KL(π_θ ∥ π_T)。因为期望在学生分布上,梯度要用 REINFORCE 来估:
也就是把「学生相对教师多自信了多少」当成逐步奖励。他们加了三件稳定装置:
- 单步分解:把逐步质量从整句回报里拆出来,降方差。
- 教师混采:采样时掺大约 20% 教师分布,避免学生生成重复废话却拿到高分(reward hacking)。
- 长度归一:长句子的累计回报容易变小,模型会学会写短。
实验覆盖 120M 到 13B,指令跟随里比标准 KD 更准、校准更好、长文本更稳。代码在 Microsoft LMOps。
GKD:一个 λ 滑过去
Agarwal 等人不急着站队。他们把采样写成混合策略:
λ=0 退回离线 KD,λ=1 是纯在策略。散度可以选前向 KL、反向 KL 或 JSD。他们还指出,在策略蒸馏可以和 RL 微调接在同一条管线上。经验上 λ≥0.5 往往已经比纯离线好。翻译这种「答案有几个但不是无限个」的任务,JSD 经常更合适。
GKD 是现在很多框架里「GKD OPD」这个名字的来源:有全量或 top-k logits 时,直接反传 token 级散度,不必走 REINFORCE。
DistiLLM:让早期训练别炸
纯 KL 在师生分布几乎不重叠时会出数值问题。前向 KL 遇到教师给了近 0 的 token 会梯度爆炸;反向 KL 则对那些区域视而不见。DistiLLM 的 skew KL 把 KL 的第二个参数往第一个上混:
分母被自己撑住,log 比有下界。对称地还有 skew reverse KL。采样上他们不用固定 λ,而是自适应调度:早期多用教师样本(便宜、稳),学生像样了再切到自己的 rollout,并加 replay buffer。可以把它理解成「把 GKD 的 λ 从超参变成课程」。
9 OPD 是什么,怎么训练
到 2025 年,Thinking Machines Lab 的博客把工业界正在用的写法讲成了「在现成 RL 脚本上改一行」:把 KL 正则的参考模型换成教师,把逐步 advantage 设成负的反向 KL。
目标函数
序列级反向 KL 按自回归链式法则拆开,就是逐步 KL 之和:
逐步 KL 的无偏单样本估计(k1)就是:
advantage a_t = − r̂_t (学生比教师更自信,就挨罚)
Tinker 的伪代码几乎是字面翻译:
# 教师只做采样客户端,不反传
teacher = service.create_sampling_client(base_model=teacher_name)
# 和学生做 RL 时一样采样
traj = do_group_rollout(student, env)
logp_s = traj.loss_fn_inputs["logprobs"]
# 教师在同一条轨迹上算 logprob
logp_t = teacher.compute_logprobs(traj)
traj["advantages"] = -(logp_s - logp_t)
# 原来的 importance sampling 损失直接拿来用
training.forward_backward(traj, loss_fn="importance_sampling")
和 SFT、RL 各差在哪
| SFT / SeqKD | RLVR(结果奖励) | OPD | |
|---|---|---|---|
| 轨迹从哪来 | 教师或标注 | 学生 | 学生 |
| 监督密度 | 逐步,但是离策略 | 整条对错,大约 O(1) bit | 逐步,在策略,大约 O(N) bit |
| 散度 | 前向 KL / CE | 由奖励诱导的反向 KL | 对学生分布的反向 KL |
| 教师是否可黑盒 | 可以(只要文本) | 不需要教师 | 至少要 logprob;纯文本不够 |
Thinking Machines 用 Qwen3 做了对照:从同一个初始化出发,把 RL 训出来的策略再蒸回去,OPD 大约 7–10 倍更少的梯度步就追上教师,折算算力大约 50–100 倍。原因很具体——RL 必须把 rollout 跑完才有对错;OPD 每个 token 都能算,甚至能用短的、截断的轨迹。
verl 把同一件事拆成两条实现:
- GKD OPD:
use_policy_gradient=false,用教师 top-k logits 做前向 KL,直接反传。推理服务往往只回采样 token 和教师 top-k,所以工程上先实现这个。 - PG OPD:
use_policy_gradient=true,用 k1 等估计器,把 −KL 当 advantage,走 PPO 式裁剪。不要把 top-k 损失和 PG 混用:PG 只推动被采样的那一个 token,top-k 里其他 token 的信息用不上。
10 OPD 变种地图
2025–2026 年的论文大多不是再发明一遍 OPD,而是在四个旋钮上打补丁。Song & Zheng 2026 的综述把领域收成「优化什么、信号从哪来、怎么稳住」。下面按工程更有用的切法画。
10.1 采样:谁来写前缀
GKD 用 λ 混合;MiniLLM 用教师混采;DistiLLM 把混合变成课程。2026 年 Rethinking OPD 给出更硬的经验:师生思维方式差太远时,纯 OPD 会失败。修复是先用教师 rollout 做一段离线 SFT,再切 OPD。SFT 把双方高概率 token 的 overlap 先抬起来,后面的逐步信号才用得上。
10.2 散度:KL 怎么写才稳
- Skew KL(DistiLLM):数值稳定。
- OPD+(2026):很多实现为了稳,对 log 比 stop-grad。作者证明这对一般 f-散度是有偏的;改回忠实梯度之后,前向 KL 和 JSD 不再崩,甚至在部分工具使用任务上超过反向 KL。
- 解耦前缀 × KL 方向(2026):序列级 KL 看起来只能「教师前缀+前向」或「学生前缀+反向」。token 级其实可以叉开,得到四种目标,分别对应离线 SFT、DAgger 式在策略 SFT、离线 RL 式蒸馏、标准 OPD。长序列蒸馏需要给前向 KL 足够权重,否则熵塌、回复变长。
10.3 奖励:要不要冲过教师
ExOPD / G-OPD(Yang et al., 2026)把 OPD 写成带参考策略的 KL 约束 RL,教师 log 比是隐式奖励。缩放因子 λ=1 是标准 OPD;λ∈(0,1) 是在参考和教师之间插值;λ>1 是外推,学生可以在域内任务上超过教师。多教师合并时,这个外推经常用来把几个 RL 专家灌回同一个基座——MiMo 那类「能力合并」管线走的就是这条。
AOPD(Asymmetric OPD,arXiv:2605.06387)针对另一头:标准 PG OPD 在 advantage≈0 的区域梯度消失,负 advantage 又噪。它在非正 advantage 的位置改走教师 support 上的前向 KL,正 advantage 仍走强化学习。论文报过相对标准 OPD 平均高约 4.1 / 8.3 分(强 / 弱初始化),熵掉得也更慢。
10.4 监督打在哪:词表太大以后
逐步反向 KL 有三种粒度:
| 粒度 | 做法 | 代价 |
|---|---|---|
| 全词表 | 对整张 softmax 算 KL,可直接反传 | 零估计方差,显存按 |V| 涨,Qwen 词表约 15 万 |
| 采样 token | k1/k2/k3 单样本估计 | 只要教师 logprob,方差后期会主导信号 |
| Top-k | 只在学生或教师的前 k 个 token 上算 | k=16 常见;有截断偏差,但稳 |
Rethinking OPD 观察到:成功的 run 里,师生高概率 token 的 overlap 从约 72% 升到 91%,这小撮共享 token 集中了 97%–99% 的质量。只优化 overlap 集合,效果能打平全量 top-k。失败的 run 从一开始 overlap 就卡住。
OPRD(2026)把监督从 LM head 之后挪到隐状态:在同一条学生轨迹上对齐选定层的表示,MSE,确定、低方差,还绕开 |V|。他们报过比 top-k OPD 快约 1.44 倍、更新时峰值显存低约 54%,并且能把学生-教师差距再往下压。多教师合并时特别有用——全词表 OPD 要为每个教师物化 [B, T, |V|] 的 logit 张量。
OPSD 是教师-free 的亲戚:同一个模型,提示里塞进标准答案或环境反馈,当「特权教师」,对学生自己的 rollout 做 OPD。自改进、持续学习常用这套,Thinking Machines 也拿它做过个性化助手。
11 能跑起来的配方
下面这套不是论文最优,是 2025–2026 年产线和复现博客反复出现的最小组合。Qwen3、Thinking Machines 对 Qwen3 的复现、verl 文档,走的都是这条骨架。
步骤
一段可运行的逐步损失
def opd_k1_advantage(logp_student, logp_teacher, clip=2.0):
# 逐步反向 KL 的单样本估计,stop-grad 用在 advantage 上
kl_hat = (logp_student - logp_teacher).detach()
adv = (-kl_hat).clamp(-clip, clip)
return adv
def pg_loss(new_logp, old_logp, adv, eps=0.2):
ratio = (new_logp - old_logp).exp()
unclipped = ratio * adv
clipped = ratio.clamp(1 - eps, 1 + eps) * adv
return -torch.minimum(unclipped, clipped).mean()
def gkd_topk_kl(student_logits, teacher_topk_ids, teacher_topk_logp):
# 教师 top-k 上的前向 KL,直接反传
logp_s = student_logits.gather(-1, teacher_topk_ids).log_softmax(-1)
p_t = teacher_topk_logp.exp()
return (p_t * (teacher_topk_logp - logp_s)).sum(-1).mean()
Tinker cookbook 和 verl 的 distillation_loss 就是这两支。自己接训练循环时,先把「学生采样 → 教师 compute_logprobs → 写 advantage」跑通,再加 top-k 和裁剪。
12 什么时候会失败
OPD 不是免费午餐。2026 年几篇机制论文把失败模式写得比较清楚,值得在开训之前当检查单。
思维方式不兼容
师生要共享一套推理格式。base 蒸 instruct、think 蒸 no-think,逐步信号会对不上。同族更大但没新能力的教师,可能把已经 RL 过的学生拉回更弱的检查点。
长度黑客
逐步 advantage 对长度敏感。学生可以靠灌水把负 advantage 稀释,或靠截断骗均值。看起来 KL 在动,准确率不动。裁剪、对数压缩、长度归一都是冲这个来的。长轨迹后半段奖励质量还会系统性下降。
大教师不一定更好
师生鸿沟太大,教师的逐步偏好里混着格式癖和好答案。硬裁剪有时比用 30B 教师更有效。先缩小格式差距,再放大教师。
长视野还没解决
稠密逐步奖励看起来便宜,长程任务上估计方差和截断偏差都会回来。agent、多步工具调用不能默认「OPD 一定比 RL 省」。
13 关键论文(按阅读顺序)
不是完整文献表。按「读完能自己讲清楚这条线」来排。
- C. Buciluǎ, R. Caruana, A. Niculescu-Mizil. Model Compression. KDD 2006. 蒸馏这件事的前身。
- G. Hinton, O. Vinyals, J. Dean. Distilling the Knowledge in a Neural Network. arXiv:1503.02531, 2015. 软标签、温度、T²。
- A. Romero et al. FitNets: Hints for Thin Deep Nets. ICLR 2015. 中间层对齐。
- Y. Kim, A. M. Rush. Sequence-Level Knowledge Distillation. EMNLP 2016. arXiv:1606.07947. 词级 vs 序列级。
- V. Sanh et al. DistilBERT. NeurIPS EMC2 2019. arXiv:1910.01108.
- X. Jiao et al. TinyBERT. Findings of EMNLP 2020.
- W. Wang et al. MiniLM / MiniLMv2. 2020. 自注意力关系蒸馏。
- Y. Gu, L. Dong, F. Wei, M. Huang. MiniLLM: Knowledge Distillation of Large Language Models. ICLR 2024. arXiv:2306.08543. 反向 KL + 在策略。
- R. Agarwal et al. On-Policy Distillation of Language Models: Learning from Self-Generated Mistakes(GKD). ICLR 2024. arXiv:2306.13649.
- J. Ko et al. DistiLLM: Towards Streamlined Distillation for Large Language Models. 2024. arXiv:2402.03898. Skew KL + 自适应调度。
- Qwen Team. Qwen3 Technical Report. 2025. arXiv:2505.09388. 后训练里采用 OPD。
- K. Lu, Thinking Machines Lab. On-Policy Distillation. 2025-10-27. thinkingmachines.ai/blog/on-policy-distillation. 工业写法、7–10× 步数。
- Song & Zheng. A Survey of On-Policy Distillation for Large Language Models. 2026. arXiv:2604.00626.
- W. Yang et al. Learning beyond Teacher: Generalized On-Policy Distillation with Reward Extrapolation. 2026. arXiv:2602.12125. ExOPD。
- Rethinking On-Policy Distillation of Large Language Models. 2026. arXiv:2604.13016. 成败条件、overlap、冷启动。
- S. Yang et al. OPRD: On-Policy Representation Distillation. 2026. arXiv:2606.06021. 监督打到隐状态。
- OPD+: Rethinking the Advantage Design for On-Policy Distillation. 2026. arXiv:2606.01039. stop-grad 对一般 f-散度有偏。
- Asymmetric On-Policy Distillation(AOPD). 2026. arXiv:2605.06387. 非正 advantage 改走前向 KL。
- Decoupling KL and Trajectories. 2026. arXiv:2605.16826. 前缀来源和 KL 方向可以叉开,得到四种合法目标。verl 文档是工程索引。