知识蒸馏
深入阅读 · 第 15 章 从基础模型到助手——训练一个小模型去模仿一个更大的模型,而不只是(或除了)模仿人类。
同样的配方,标签换了个来源
本章把指令微调(SFT)讲成了模型一直在用的那个下一个 token 损失,只是把它指向了一小批精心整理的(指令,回复)对——这些回复通常由人类编写或审核。知识蒸馏保留这套设置原封不动,只换了一件事:回复不再由人类写出,而是由一个更大、更强的teacher 模型写出(在下面的经典版本里,甚至由它提供整个目标分布)。student 模型——真正被训练的那个模型,通常比 teacher 小得多——学的是模仿 teacher,而不只是(或除了)模仿人类标注者。
这仍然完全是训练一章引入的那个损失:,在每个计分位置上取平均——在初始化时是 纳特,也就是在这个模型的词表上均匀乱猜。 蒸馏从不触碰这个公式,它只改变什么算目标。
经典配方:软标签与「暗知识」
这项技术比 LLM 时代要老得多——Geoffrey Hinton、Oriol Vinyals 和 Jeff Dean 在 2015 年提出了它,起名蒸馏(distillation)(建立在 Rich Caruana 及其合作者更早的一个想法之上,那个想法是直接匹配原始 logits——论文证明这正是 Hinton 方法在高温极限下的一个特例)。他们的洞察是:一个训练好的分类器,其 softmax 会给每一个类别都分配一点概率,哪怕是错误的类别,而这些小概率并不是噪声——它们编码了这个模型倾向于如何泛化。他们自己给的例子,逐字引用:
「例如一张宝马汽车的图片,被误认成垃圾车的概率或许非常小,但这个概率仍然比被误认成胡萝卜的概率要高出许多倍。」——Hinton, Vinyals & Dean,《Distilling the Knowledge in a Neural Network》,arXiv:1503.02531,第 1 节
一个 one-hot 标签(「这是一辆宝马」)把这种模式彻底丢掉了。要保住它,就用一个temperature 去软化 teacher 的 softmax:
在 时这就是普通 softmax;调高 会把分布压平,让近似错误(垃圾车)和离谱错误(胡萝卜)彼此分开,而不是都四舍五入到零。随后 student 会在两个交叉熵的加权组合上训练:一个是在同样高的 下,对 teacher 的软标签;另一个较轻的,是在 下,对普通的硬标签。有一个细节值得记住:因为软标签项的梯度会按 缩小,Hinton 的论文把这一项乘以 ,这样它的贡献不会随着 调高而悄悄消失。
效果并不含糊。在 MNIST 上,一个 800 单元的小网络按普通方式训练会犯 146 个测试错误;同样大小的网络只训练去匹配一个更大的、带 dropout 正则化的网络给出的软标签(在 下),只犯 74 个——大约减半。在一个商用语音模型上(约 8500 万参数,2000 小时音频),一个 10 模型的 ensemble 把帧准确率从 58.9% 提到 61.1%;从这个 ensemble 蒸馏出的单个模型达到 60.8%——论文写道这「转移了超过 80%」的 ensemble 增益,而且只用了一个模型,不是十个。
现代配方:就是 SFT,只是文本来源换了个更聪明的
今天规模最大的一次 LLM 蒸馏实践,把软分布那一整套机制全丢掉了。DeepSeek 的 R1 论文把自己冗长的思维链推理蒸馏进六个小得多的稠密模型(Qwen2.5-Math-1.5B/7B、Qwen2.5-14B/32B、Llama-3.1-8B、Llama-3.3-70B),用的是 800,000 条 (prompt, response) 对,其中每一条 response 都由 DeepSeek-R1 自己生成(大约 60 万条推理轨迹,加 20 万条通用示例)。论文附录里逐字写的方法:「we apply only SFT and do not include an RL stage」(我们只应用 SFT,不包含 RL 阶段)。完全没有 temperature,没有 KL 散度,也没有任何 teacher logits——teacher 生成的文本就被当成一个普通的 SFT 目标来处理,正是本页最开始讲的那套配方。
这个头条结果想说的是:蒸馏不只是比从零训练一个小型推理模型更便宜——它还可能更好。直接对一个 Qwen2.5-32B 基础模型做强化学习、完全不蒸馏(「Qwen2.5-32B-Zero」),AIME 2024 pass@1 达到 47.0。而只是在同等规模的基础模型上,对 DeepSeek-R1 生成的回复做微调——纯 SFT,完全没有 RL——达到 72.6。就连蒸馏出来最小的那个模型 DeepSeek-R1-Distill-Qwen-1.5B,在这项基准上都超过了 GPT-4o 和 Claude-3.5-Sonnet。把两个时代放在一起比一比:
下面两种训练都是在一个小的 STUDENT 模型上做微调,用大 TEACHER 模型的输出作为标签,来替代(或补充)人工写的标签。两者的差别只在于什么算「标签」。
用温度 T 软化 teacher 的 softmax,再训练 student 在同一个 T 下去匹配这个同样软化过的分布(再加上一个较轻的、在 T = 1 时对真实硬标签的交叉熵)。拖动 T,看错误答案的概率如何从几乎为零变得清晰可见:
「例如一张宝马汽车的图片,被误认成垃圾车的概率或许非常小,但这个概率仍然比被误认成胡萝卜的概率要高出许多倍。」
——Hinton, Vinyals & Dean,《Distilling the Knowledge in a Neural Network》,arXiv:1503.02531,第 1 节
这里的 logits(60、25、3、−3)是为了演示效果而虚构的——论文只是定性描述了这个例子,并未公布具体的 logit 数值。T = 1 时分布几乎是宝马的 one-hot,错误答案的概率都被压得接近零——小到无法携带可学习的信号。调高 T 会把它们撑大到一个清晰、可比较的量级,暴露出它们之间的相对结构——这正是 student 也会一并学到的「暗知识」——即便同时软化也在把每一个概率(包括正确答案)都拉向均匀分布。因为软标签项的梯度按 1/T² 缩放,Hinton 的损失把这一项乘以 T²,让它的权重不随 T 变化而改变。
完全没有软分布,也没有 KL 散度——就是普通的下一个 token 交叉熵,跟 training 那一章讲的损失一模一样,只是 (prompt, response) 里的 RESPONSE 换成了由 teacher 生成、而不是人工标注。
这里的每一个 token 都会算一个普通的 −log p(token) 损失——跟 SFT 完全一样,只是训练文本换了个更大、更聪明的来源。
DeepSeek-R1 论文附录 F.1(arXiv:2501.12948):对蒸馏模型「我们只应用 SFT,不包含 RL 阶段」。
两者都被称为「蒸馏」,原因相同——一个更小的 student 向一个更大的 teacher 学习,而不只是向人类学习。两个时代真正不同的只有一件事:目标究竟是一个被温度软化过的概率分布,还是 teacher 自己生成的、被当成普通 SFT 样本对待的文本。
两者并不互斥:Qwen 自己的 strong-to-weak 蒸馏
上面这两套配方不是竞争关系——Qwen 自己(上一代)的 Qwen3 技术报告记录了一条先后用上两者的 pipeline,用在 Qwen3 的小型稠密模型和 MoE 模型上。先是一个 off-policy阶段:对一个更大的 teacher(Qwen3-32B 或 Qwen3-235B-A22B)生成的回复做普通 SFT——就是上面的现代配方。然后是一个on-policy 阶段:小的 student 模型生成自己的 rollout,再被微调去最小化它自己的 logits 与 teacher 的 logits 之间的 KL 散度——这字面上就是 Hinton 2015 年的方法,只是跑在 student 自己采样的样本上,而不是一个固定的数据集。Qwen 报告说这条路线达到了比他们完整的四阶段训练 pipeline 更高的基准分数,同时「只用了 1/10 的 GPU 时数」。这是一个真实、有据可查的例子,正好把本页刚走过的经典 vs 现代这条分界线,共存在了同一次训练里。
你浏览器里的 Qwen 是这么来的吗?
未经证实——与其按类比默认成立,不如老实说清楚。上一段讲的是 Qwen3,也就是上一代。而 Qwen3.5——本课程实际教授、包括这个标签页里正在跑的 0.8B 模型在内的、基于 Qwen3-Next 的这一系列——没有任何官方来源提到过蒸馏。Qwen3.5-0.8B 的 model card、QwenLM/Qwen3.5 的 GitHub README,以及 qwen.ai 的旗舰发布博客,都把这一系列的训练描述成预训练之后接「Scaled Reinforcement Learning」——在大量 agent 环境上跑强化学习——针对 Qwen3.5,哪里都没提到 teacher 模型、「strong-to-weak」pipeline,或者蒸馏。所以诚实的答案是:Qwen 确实公开记录过,在它上一代的小模型上做过正是本页描述的这件事。而这套手法、或它的某个变体,是否也碰过这个具体的 0.8B checkpoint,没有任何公开来源可以证实——所以本课程不会这么断言。