一个 670 亿参数的模型,怎么把自己的能力”倒”进一个 15 亿参数的小模型里?答案不是压缩权重,而是一种更古怪的手法:让小模型去模仿大模型的”犹豫”。

故事从这里开始

2025 年初,DeepSeek 放出了 R1 这个推理模型之后,做了一件让很多人意外的事:他们同时放出了六个”蒸馏版”小模型——1.5B、7B、8B、14B、32B、70B,分别基于 Qwen 和 Llama 系列。这些小模型在数学、代码这些需要多步推理的任务上,表现远超同尺寸从头训练的模型,有些甚至逼近参数量大它们十几倍的模型。

训练这些小模型的方法说出来会让你觉得太简单了:让 DeepSeek-R1 生成一堆解题过程(包括它”思考”的完整文字),然后直接拿这些文字去微调小模型。没有花哨的算法,没有对齐权重,就是把大模型说过的话喂给小模型学。

这就是知识蒸馏(Knowledge Distillation, KD)——一个 2015 年就被 Geoffrey Hinton 提出的想法,十年后成了压缩大模型、造出便宜又聪明的小模型的核心武器。但这里有个问题没解释清楚:如果只是”用大模型的输出当训练数据”,这跟普通的监督学习有什么区别?为什么它能让一个小模型学到比它自己直接从原始数据学习时更强的能力?

答案藏在一个反直觉的地方:大模型犯的”错误”里包含着比正确答案本身更丰富的信息。

这篇文章会带你搞清楚这件事到底是怎么发生的——从最基本的”温度”和”软标签”,到现代 LLM 蒸馏里绕不开的 KL 散度选择问题,再到 DeepSeek-R1 展示的规模化实践。

老师模型 (670B, 已训练好) 软标签/生成文本 P(下一个词) 分布 完整推理文本 学生模型 (1.5B~70B)

老师模型的”犹豫”里藏着什么

问题是什么

想象你在教一个小孩认数字。你给他看一张写着”2”的卡片,告诉他”这是 2”。这就是传统的监督学习——标签是 one-hot 的:正确答案概率是 1,其余全是 0。

但一个训练好的图像分类模型看到手写的”2”时,它给出的不是这种铁板一块的判断。它可能说:”我 90% 确定这是 2,但也有 5% 的可能是 3,3% 的可能是 7,剩下 2% 分给别的数字。” 为什么模型会犹豫在 3 和 7 之间,而不是随便犹豫在 2 和”猫”之间?因为写得潦草的 2,笔画结构确实跟 3、7 有些相似——上半部分弯曲,下半部分有条横线。

这个犹豫的分布,其实是模型对”数字长什么样”这个问题的一份隐藏笔记。一个只被告诉”这是 2,不是别的”的学生,永远学不到”2 和 7 长得有点像”这个知识——因为标签把这部分信息直接抹掉了。

Hinton 在 2015 年那篇奠基性论文里,把这份藏在错误答案分布里的信息叫做“暗知识”(dark knowledge)——之所以叫”暗”,是因为它一直都在模型的输出里,只是被我们习惯性地扔掉了(我们通常只看 argmax,取概率最高的那个答案,其余的全部忽略)。

直觉:核心想法

蒸馏的核心想法翻译成人话就是:别只让学生学”正确答案是什么”,让学生学”老师对所有答案的完整看法”。

打个比方。你考试的时候,老师批改的标准答案只写着”选 B”。但如果老师愿意告诉你:”这题我认为 B 最可能对,但 A 也有点像是对的(干扰项设计得很像),C 和 D 基本不可能”——这份”完整看法”比单纯一个”B”字,能教给你更多关于这道题的结构性知识。你不仅知道答案,还知道为什么别的选项错、错在哪个层次。

知识蒸馏就是把这套逻辑用到神经网络训练上:老师模型(通常更大、更强)不只告诉学生”正确的下一个词是什么”,而是把自己对所有可能词的完整概率分布,都作为训练信号给学生。学生的任务不再是”猜中一个词”,而是”让我的整个概率分布尽量贴近老师的整个概率分布”。

问题来了:如果老师很自信(比如 99.9% 确信答案是”2”),那这个分布几乎跟 one-hot 标签没区别,暗知识几乎全部丢失了。这就是”温度(temperature)”要登场的地方。

技术细节(选读)

Softmax 函数把一堆数值(logits)转成概率分布:

\[p_i = \frac{\exp(z_i)}{\sum_j \exp(z_j)}\]

如果 logits 之间差距很大,softmax 会把概率高度集中到最大值上,其它选项的概率被压得几乎看不见——暗知识就这样被”压扁”没了。解决办法是引入一个温度参数 T,把每个 logit 先除以 T 再算 softmax:

\[p_i = \frac{\exp(z_i / T)}{\sum_j \exp(z_j / T)}\]

翻译回人话:T 越大,分布被”拉平”得越厉害,原本被压扁的次优答案重新露出头来;T=1 就是普通 softmax;T 越小则越接近”一家独大”的硬标签。训练时老师和学生都用较高的 T(比如 2~5)计算软标签之间的 KL 散度,推理时再用 T=1 做正常预测。

Hinton 提出的完整蒸馏损失,是硬标签交叉熵和软标签 KL 散度的加权和:

\[\mathcal{L} = \alpha \cdot \text{CE}(y_{\text{true}}, p_{\text{student}}^{T=1}) + (1-\alpha) \cdot T^2 \cdot \text{KL}(p_{\text{teacher}}^{T} \| p_{\text{student}}^{T})\]

这里那个 $T^2$ 不是随便加的:因为软标签这一项的梯度大小天然会随 $1/T^2$ 缩小,如果不乘回 $T^2$ 补偿,调温度就会连带改变两个损失项的相对权重,训练会变得难以调参——这是一个纯粹的工程细节,但没注意到的话复现实验会踩坑。

但 LLM 不是分类器,蒸馏要怎么做?

问题是什么

Hinton 最初的设定是图像分类:一张图对应一个标签,词汇表(类别数)通常几十到几千。而 LLM 的输出是逐词生成的序列:每一步都要在几万甚至十几万个 token 里选一个,选完之后下一步的分布完全依赖你刚才选的这个词。这跟分类任务有本质区别——你不是在预测一个孤立的答案,而是在预测一整条会自我延续、自我强化的轨迹。

这带来一个新麻烦:假设学生在生成的第 5 个词时,选了一个老师本来觉得概率不高但也不算离谱的词。到了第 6 个词,学生现在站在的”位置”(前 5 个词构成的上下文),是老师在训练时从没见过的——因为老师自己从不会走到这里。学生接下来该怎么办,完全没人教过它。这个问题有个名字,叫”曝光偏差(exposure bias)”或者”分布偏移”:训练时看到的都是标准轨迹,推理时自己走出来的轨迹却渐渐偏离标准,而且偏得越远,误差累积得越狠——就像传话游戏,第一个人说错一个字,后面的人接不上,越传越离题。

直觉:核心想法

先说一个更基础的分歧:蒸馏 LLM 该用哪种 KL 散度?

普通的蒸馏用的是”正向 KL”:让学生的分布去覆盖老师分布覆盖的所有地方,哪里老师有概率、学生就必须也分配概率,不然会被重罚。有个专门做 LLM 蒸馏的工作叫 MiniLLM,指出这对一个能力有限的小模型是个坑:小模型没有能力精确覆盖老师那种复杂、多峰的完整分布,硬撑着去覆盖,反而会在老师认为”不太可能”甚至”荒谬”的地方,分配出不该有的概率——生成时就容易讲出些听起来通顺但事实上胡编的话。

他们提出用”反向 KL”:让学生优先把资源集中在老师最自信、概率最高的那部分内容上,而不强求处处覆盖。类比一下:正向 KL 像是让一个新手翻译尽量照顾原文的每一个细枝末节,力求”面面俱到”;反向 KL 像是让新手先抓住原文最核心、最不能错的主干意思讲清楚,次要的细节宁可舍弃也别乱猜。对一个能力有限的学生,后一种策略更不容易”翻车”。

至于曝光偏差,解决思路也很直白:既然学生自己走出来的轨迹和老师不一样,那就干脆让学生按自己的方式先走一遍,再让老师给这条自己走出来的路打分。这就是”在策略(on-policy)”蒸馏的核心想法——不再只用老师事先准备好的标准答案训练学生,而是让学生自由发挥、生成自己的输出,老师实时反馈”这一步好不好、该往哪修正”。这跟强化学习里”从自己的经验中学习”是同一个思路,只是这里给反馈的不是环境奖励,而是老师模型的判断。

技术细节(选读)

反向 KL 定义为 $\text{KL}(q | p) = \sum_x q(x) \log \frac{q(x)}{p(x)}$(q 是学生,p 是老师),跟正向 KL $\text{KL}(p | q)$ 只是把谁当分母、谁当求和权重换了一下,但优化行为差别很大:反向 KL 只在学生分布 $q(x) > 0$ 的地方计入损失,如果学生某处概率本来就是 0,那老师在那儿有多大概率都跟学生没关系——这天然鼓励学生把概率集中到少数几个自己有把握的地方,而不必勉强地”到处摸一把”。

不过要老实说一句:2024 年一篇叫《Rethinking KL Divergence in Knowledge Distillation》的论文对这套”反向 KL=模式寻找、正向 KL=模式覆盖”的教科书叙事提出了修正——他们发现在训练轮次有限(现实中 LLM 训练几乎不可能跑到收敛)的情况下,真正的差别其实是:正向 KL 前期优先拟合高频常见词(分布的”头部”),反向 KL 更早关注长尾稀有词(分布的”尾部”)。如果训练轮数够多,两者最终会收敛到相似效果。他们进一步提出了自适应组合两者权重的 AKL 方法。这提醒我们:很多流传很广的直觉解释,拿到大模型这种高维、有限训练步数的真实场景下检验时,往往需要打折扣。

在策略蒸馏的代表工作是 Google DeepMind 的 GKD(Generalized Knowledge Distillation)。它把训练数据来源换成”学生自己生成的序列”,然后让老师对这些序列打软标签当监督信号,损失函数上还兼容多种 KL 变体(正向、反向、Jensen-Shannon),并且能跟 RLHF 无缝结合训练——本质上是把蒸馏和策略优化统一到了同一个训练循环里。

传统离线蒸馏 vs 在策略蒸馏 离线蒸馏 老师固定序列 → 学生模仿 推理时走出老师没教过的路 → 曝光偏差累积 在策略蒸馏 (GKD) 学生自己生成 → 老师打分 训练分布=推理分布 → 缓解分布偏移 代表: Hinton KD, Sequence-Level KD 代表: MiniLLM (反向KL+RL), GKD (灵活损失+RLHF融合)

当老师”太强”反而是坏事:容量差距

问题是什么

直觉上,找一个越强的老师,学生应该学得越好——毕竟老师懂得更多。但苹果公司 2025 年发表的《Distillation Scaling Laws》这篇论文,用大规模实验证明了一个反直觉的现象:当老师和学生之间的能力差距过大时,学生反而学得更差。这被称为”容量差距(capacity gap)”问题。

为什么会这样?想象让一位量子物理学教授去教一个刚学加减法的小学生。教授给出的答案信息量确实极大,但那份信息编码得太精细、太依赖小学生根本不具备的背景知识——分布形态过于复杂、过于”尖锐”,小学生的表达能力(模型容量)根本没有足够的”带宽”去逼近这种复杂分布,反而在尝试模仿一个自己理解不了的目标时,学出一堆四不像的行为。

直觉:核心想法

这篇论文把”该不该蒸馏、蒸馏该配多大的老师”这件事,变成了一个可以提前计算的优化问题,而不是”越大越好”的直觉判断。他们发现教师的交叉熵和学生最终损失之间存在幂律关系,这个关系会根据学生和老师的相对能力,在两种行为模式之间切换。

给工程实践的启示很实际:如果你只打算蒸馏一个学生、而且这个老师还需要从头训练出来,那还不如直接花这些算力去监督训练学生本身——蒸馏在这种”一次性”场景下未必划算。但如果你已经有一个训好的老师、要批量产出很多不同尺寸的学生(这正是 DeepSeek-R1 蒸馏出六个不同尺寸模型的场景),那么蒸馏在相当大的算力范围内都比直接监督训练更划算。这解释了为什么 DeepSeek 会选择”训一个大的 R1,蒸出一整个系列的小模型”这条路线——老师的训练成本被平摊到了六个学生身上。

技术细节(选读)

论文里给出的核心关系大致是:学生的最终损失 $L_{\text{student}}$ 随老师的交叉熵 $L_{\text{teacher}}$ 呈现幂律变化,但这个幂律的具体形状(斜率、拐点)取决于学生和老师各自的参数规模。当老师相对学生”过强”时,进一步提升老师质量反而会让学生损失下降得更慢甚至反弹——这就是容量差距在数学上的体现。这套 scaling law 让团队能在正式跑一次昂贵的蒸馏实验之前,先估算出”教师应该多大、蒸馏能不能带来收益”,避免了”训一个巨大的老师结果学生没学好”这种代价高昂的试错。

除了 KL 散度,蒸馏还能怎么”教”?

问题是什么

到目前为止我们讨论的都是”逐词匹配概率分布”这种方式,这要求你能访问老师模型内部的 logits——这被称为白盒蒸馏。但现实中,最强的模型往往是像 GPT-4 这样只提供 API 的黑箱,你压根拿不到它内部任何概率分布,只能看到它最终吐出来的文字。这种情况下,前面讲的 KL 散度损失全都用不上,还能蒸馏吗?

直觉:核心想法

答案是可以,而且这恰恰是过去两三年开源社区最常用的做法——叫黑盒蒸馏。思路很朴素:既然拿不到老师内部的”想法分布”,那就直接把老师的最终输出文字,当成高质量的训练样本喂给学生做普通的监督微调。这有点像你没法读懂一个专家的思考过程,但可以把他写的文章原文抄下来反复研读、模仿他的表达和论证方式。

这个想法最早在机器翻译领域被系统化——2016 年 Kim 和 Rush 提出的”序列级蒸馏”指出,逐词匹配分布对于生成整段话这种任务并不是最自然的目标,不如直接拿老师解码出来的完整句子当”伪标准答案”训练学生。十年后,这套逻辑几乎原封不动地被用在了 DeepSeek-R1 的蒸馏流程里:不去匹配 R1 每一步的 token 概率分布,而是直接拿 R1 生成的完整解题推理过程(包括它的思考文字)当训练数据,微调 Qwen 和 Llama 系列的小模型。Alpaca、WizardLM 这类”用 GPT-4 输出训练开源小模型”的项目,本质上走的也是这条路。

技术细节(选读)

黑盒蒸馏在数学形式上其实退化成了标准的监督微调损失——对老师生成的文本序列 $y_1, …, y_T$,最大化学生生成同样序列的对数似然:

\[\mathcal{L} = -\sum_{t=1}^{T} \log q_\theta(y_t \mid y_{<t})\]

区别只在于训练数据的来源:$y$ 不是人工标注的真实标签,而是老师模型采样/解码出来的输出。表面上看这跟普通 SFT 没有本质区别——但它依然属于蒸馏范畴,因为训练信号的根源来自另一个模型的”知识”,而不是人类标注。这也是为什么”蒸馏”这个词的边界在实践中越来越模糊:从严格匹配 logits 分布(白盒),到只用生成文本做 SFT(黑盒),中间还有匹配隐藏层激活、匹配注意力模式等各种变体——它们共享的核心,只是”用一个更强模型的输出(无论是分布还是文字)当训练信号”这一个想法。

这意味着什么

绕了这么一圈,我们其实是在回答一个更根本的问题:一个模型的”知识”到底以什么形式存在,又能不能被转移?

Hinton 最初的答案是:知识不只藏在”正确答案”里,更多藏在模型对所有可能答案的相对信心分布里——那些看似”错误”的低概率选项,其实编码着模型学到的相似性结构。这就是为什么单纯给小模型看标准答案不如让它看老师完整的犹豫过程。

但把这个想法搬到 LLM 上时,又冒出了新的复杂性:生成任务的分布是逐词展开、会自我累积误差的,这逼着研究者重新思考”该匹配哪种 KL 散度”、”该不该让学生按自己的路径生成再打分”这些问题。而容量差距的发现又提醒我们,”找最强的老师”不是免费的午餐——学生的表达能力跟不上,反而会学坏。最后,黑盒蒸馏的流行说明,当我们拿不到老师的内部分布时,退回到”直接模仿老师说的话”这种最朴素的做法,依然能work得出奇好——DeepSeek-R1 的六个蒸馏模型就是最新、最有说服力的证据。

值得留一个诚实的注脚:像”反向 KL 天然是模式寻找”这类流传很广的直觉解释,在真实的大模型有限训练步数场景下并不总是站得住脚——2024 年的 AKL 论文就是一次有价值的纠偏。这提醒我们,教科书式的类比帮我们建立直觉,但工程实践中的真实行为,永远值得用实验重新检验一遍。

下一篇预告

蒸馏解决的是”如何把知识从一个模型转移到另一个模型”,而下一个自然的问题是:当一个模型被反复蒸馏、反复微调之后,它内部学到的表征还剩下多少”原创性”?这就引出了另一个正在被密集研究的话题——模型坍缩(Model Collapse):当越来越多的训练数据本身就是 AI 生成的内容时,整个生态系统的知识会不会像一张反复复印的纸,一代比一代模糊?