知识蒸馏综述:原理 技术和挑战

模型与算力

把知识蒸馏的原理、主流技术和落地难点串成一条线,帮入门研究者分清软标签、特征对齐与自蒸馏各自适合什么场景,并给出可执行的选型与验证步骤。

入门阶段最容易卡在两点:一是把蒸馏和量化、剪枝混成一件事,二是照着论文复现却不知道哪一步在起作用。这篇按「先搞清信号从哪来、再决定对齐什么、最后怎么验证真的涨点」的顺序走一遍,给出对照表和排查顺序,方便你把方法落到自己的数据和算力上。

入门阶段最容易卡在两个地方:一个把蒸馏和量化、剪枝混成一件事,另一个是照着论文复现却不知道哪一步在起作用。这篇按「先搞清信号从哪来、再决定对齐什么、最后怎么验证真的涨点」的顺序走一遍,中间给对照表和排查顺序。

目标不是让你背方法名,而是让你看完能判断:我手上的任务该不该蒸馏、该选哪条路线、跑完怎么确认没白忙。遇到需要查数字的地方,去站内对应页面看当时的数值,别照搬别人文章里的结论。

先划边界:什么算蒸馏,什么只是小模型

判断一个训练流程算不算蒸馏,只看一件事:训练目标里有没有「另一个模型的输出或中间表示」这一项。如果有,不管这个老师是提前训好的还是同时更新的,都算蒸馏;如果没有,即使你训的是一个很小的模型,那也只是普通监督训练,跟蒸馏没关系。

手段动的是什么典型目的
蒸馏训练信号(老师给出的分布或表示)让小模型学到老师的泛化行为
量化数值精度(权重、激活的位宽)压显存、提吞吐
剪枝网络结构(通道、层、注意力头)减少计算量与参数量
从头训小模型数据与超参用更低成本拿到可接受精度
  • 蒸馏动的是训练阶段的信号,推理阶段学生可以完全不知道老师存在,这点和量化、剪枝在部署形态上不一样
  • 三者可以叠加:先蒸馏出结构,再剪枝压结构,最后量化压数值,顺序反过来往往收益更差
  • 量化与剪枝属于「同一个模型变小」的思路,蒸馏属于「换一个模型来学」的思路,不要互相替代
  • 如果老师本身在目标任务上就不强,蒸馏不会凭空造出信息,这种情况下去调蒸馏系数基本是白费

老师信号从哪来:软标签、中间层、注意力

确定了要做蒸馏之后,下一个问题是让学生对齐老师的哪一部分。粗分有三类:输出层的概率分布、中间层的特征表示、注意力图。这三类不是越复杂越好,而是要看老师学生的结构差异和你的算力预算。

输出层软标签
老师对每个类给出的概率分布,比 one-hot 多带了类间相似度信息,适合分类、排序、检索打分这类任务
中间层特征
把某一层的特征图或向量作为对齐目标,适合老师学生层数、通道数比较接近的情况
注意力图
把注意力权重或特征间的相关矩阵作为对齐目标,适合 Transformer 类结构、且希望学生学到「看哪里」的行为
关系型信号
不直接对齐单个样本,而是对齐样本之间或层之间的关系,对结构差异的容忍度更高,但实现更麻烦

什么情况下不适用:老师学生结构差太远时,强行对齐中间层往往收益为负。原因是通道数、空间尺寸对不上,你得先加投影层把两边映射到同一空间,这个投影本身就要学,学不好反而把噪声灌进学生。这种时候退回到只用输出层软标签,通常更稳。

  1. 先对齐输出层把老师冻结,只用软标签项训学生,确认能收敛、能比普通小模型好一点,这是后面所有尝试的基线
  2. 再加中间层只挑一到两层加对齐损失,优先选老师学生结构最接近的那层;每加一层都单独记录验证指标变化
  3. 最后试注意力注意力对齐一般放在特征对齐之后,因为它的实现依赖具体结构;如果前两步都没涨,这一步大概率也不会涨

温度与软化:为什么要把分布摊平

软标签的价值在于那些概率很小的「错误类」。如果不加温度,老师分布里大部分位置都接近零,学生从中学到的信息非常有限;温度的作用就是把这个分布摊平,让这些边缘位置也带上一点可学的信号。所以温度不是为了「让输出更好看」,它直接决定了学生能不能学到类间关系。

但温度不是越大越好。调得太大,分布接近均匀,等于把信号变成噪声;调得太小,分布接近硬标签,蒸馏退化成普通监督。合理做法是在验证集上扫一遍温度区间,而不是照抄某篇论文里的系数。

  • 温度和学习率、批大小一样属于要扫的超参,不同数据集合适的区间差别很大
  • 温度和蒸馏损失权重会互相影响,建议固定一个扫另一个,不要同时动两个
  • 分类任务里温度通常有意义;多标签、回归、排序里输出不是标准 softmax 分布,温度这个旋钮往往失效
  • 判断温度是否合适的标准不是训练损失下降,而是学生在你留出的验证集上的表现

主流方法地图:离线、在线、自蒸馏各管什么

按「老师怎么来」可以把主流方法分成三大家族。入门建议从离线开始,因为它的每一步都是可控的;等你把基线跑通了,再考虑在线或自蒸馏这些更复杂但可能更省资源的路线。

家族老师状态适合场景主要代价
离线蒸馏提前训好、冻结有现成强老师;入门与快速验证老师质量决定上限,差老师会把学生带偏
在线蒸馏与学生同时更新没有现成老师,愿意一次训到底训练不稳定,显存和调参成本更高
相互蒸馏多个模型互学多个同量级模型想一起提升工程复杂度高,收益依赖模型间差异
自蒸馏同模型不同层或不同轮次只有数据算力、没有强老师信号强度有限,容易出现自我强化偏差

在线与相互蒸馏省掉了「先训一个老师」这一步,但代价是训练过程更抖。如果你只想验证蒸馏这件事在你数据上有没有用,不要一上来就上在线;先把离线跑出可信的对照数字,再决定要不要为在线方案多花算力。

  • 离线蒸馏的工程门槛最低:老师一次训好,学生可以反复换结构、反复调参
  • 在线蒸馏适合老师本身也需要被训、或者你根本没有额外算力单独训老师的场景
  • 自蒸馏适合数据量大、但缺少公开强老师的领域;它的效果对数据质量比对方法设计更敏感
  • 不确定选哪条路线时,先去站内模型库看看同任务里有哪些可用结构,再决定老师和学生的容量差距

损失怎么配:硬标签损失和蒸馏损失的比例

总损失通常是「硬标签损失 + 权重 × 蒸馏损失」的形式。入门的经验做法是:硬标签损失保底,蒸馏损失加成。先让硬标签这条路单独跑通、能收敛、指标正常,再逐步把蒸馏项加进去,而不是一开始就上大权重。

权重也不是一成不变好用。比较常见的排法是:训练前段多依赖老师信号快速确定方向,后段把权重降下来,让模型回到真实标签上收敛。具体怎么排没有标准答案,要看你数据和任务。

  1. 基线先跑硬标签只用真实标签训学生,记录验证指标。这一步不通过,后面所有蒸馏实验都没有意义
  2. 加小权重蒸馏项从很小的权重开始,观察验证指标是否稳定上升;如果一加就掉,先别调权重,看学习率
  3. 扫权重区间在几个量级上扫蒸馏权重,画出验证指标曲线,选一个稳定且不依赖巧合的点
  4. 记录消融每次只改一个变量:关掉温度、关掉蒸馏项、换对齐层,各自单独记录,不要只报一个总成绩

落地难点:为什么不涨点甚至掉点

蒸馏落地最常见的结果不是「涨很多」,而是「不涨」或者「稍微掉一点」。这不一定是方法错,多数时候是几类具体原因叠加。按出现概率从高到低排查,比盲目换方法高效得多。

  • 老师与学生容量差距过大:学生太小、表达力不够,学不动老师的分布,这时候要么换大一点的学生,要么先精简老师的输出
  • 对齐层选错:中间层对齐收益对层号非常敏感,选错层基本不涨甚至掉点,要靠消融定位
  • 蒸馏权重过大:学生被老师的错误带偏,尤其老师本身在困难样本上也不准的时候
  • 数据不匹配:老师在自有数据上训、在目标域评估,跨域时下降明显,换域前先做小样本一致性检查
  • 评估口径问题:只比单一指标容易误判,要同时看任务指标、推理成本和真实业务样例

什么情况下不适用:如果你的目标任务标签很干净、数据量又特别大,普通监督训练已经能榨干这个数据量,蒸馏带来的额外信号会非常有限,这时候把精力放在数据清洗或结构调优上回报更高。反过来,标签噪声大、标注稀缺的场景,蒸馏往往更值得试。

现象优先检查判断标准
完全不涨学生是否学过硬标签基线基线正常再谈蒸馏
训练涨、验证掉蒸馏权重是否过大降低权重后验证是否回升
跨域后掉点老师与学生训练数据是否同分布小样本一致性检查是否通过
延迟没降是否只对比了精度拿真实请求实测延迟与吞吐

验证与上线:怎么确认真的值得用

蒸馏的价值要同时看两件事:目标任务的指标、以及推理侧的实测成本。只看精度容易得出「蒸馏有用」的结论,但上线后发现延迟没降、成本没省,等于白做。所以验证环节要提前把这两条线都设计进去。

  1. 固定三份数据老师训练用的、学生训练用的、只用于最终对比的,三者不要混;混了之后所有对比都不可信
  2. 做消融对照同一份学生结构,分别跑硬标签基线、只加输出层蒸馏、再加中间层对齐,横向比同一验证集指标
  3. 实测推理成本在同一批请求下测延迟和吞吐,而不是只看理论参数量;参数量小不等于实际更快
  4. 并行跑一段时间蒸馏版本和普通小模型版本并行,按任务分层决定切流比例,出问题能整体切回

回退预案不是可选项。蒸馏引入了一个强耦合的假设:老师的判断在学生结构上仍然成立。这个假设在数据分布变化时会失效,所以线上要留出能快速切回普通版本的路径。切流比例可以先小后大,按分层指标决定,而不是一次性全量。

入门路线与检查清单

把上面几节压成一条入门路线:先跑通最简流程,再做消融,最后才碰复杂方案。这条顺序能让你在每一步都知道自己在验证什么,而不是堆一堆技巧看总成绩。

  • 第一步跑通离线输出层蒸馏:用一个现成的老师加一个明显更小的学生,确认流程能收敛、指标不低于硬标签基线
  • 第二步做消融:分别关掉温度、关掉蒸馏项、换对齐层,看每一项各自的贡献,而不是只报一个总成绩
  • 第三步再考虑在线蒸馏或特征对齐这类复杂方案,它们对算力和调参经验的要求更高
  • 每一步都留一份只用于最终对比的数据,别拿训练时看过的验证集下结论
  • 不确定术语和结构时,到站内模型资料库对照,避免用错名字或选错容量

如果你现在只有一个模糊想法、还没确定老师是谁,建议先到站内模型库按任务类型扫一遍,看看有哪些结构可以直接当老师、哪些适合当学生,再回来定方案。这比先看论文再找结构省时间。

下一步把术语、结构和价格都对齐到同一份资料上,再开始做实验,能少走很多弯路。

常见问题

知识蒸馏和模型蒸馏是不是一回事?

日常讨论里基本混着用,但严谨说模型蒸馏是一大类做模型压缩或迁移的方法,知识蒸馏更强调「迁移老师学到的知识」这个训练机制。如果你想分清两者的边界和各自包含哪些做法,可到站内基础概念词典对照一下术语定义,再回来看技术路线会顺很多。

没有强老师模型,还能做蒸馏吗?

可以,走自蒸馏或自训练路线:用同一个模型的不同层、不同训练轮次,或者用集成后的输出当老师。代价是信号质量不如一个真正更强的老师,收益通常也更小。如果连一个明显更强的模型都拿不到,优先考虑把数据和标签做干净,效果往往比硬套蒸馏框架更实在。

蒸馏出来的小模型能商用吗?

关键不在蒸馏这个动作,而在老师模型的许可证。老师本身禁止商用或禁止生成衍生模型时,蒸出来的学生同样受约束。上生产前把老师的许可条款读一遍,再对照站内开源权重的许可证与商用边界那类页面确认一遍,别默认「我自己训的就能随便用」。

蒸馏一定比直接训小模型好吗?

不一定。数据量足够大、标签质量高、任务本身不复杂时,直接训小模型可能追平甚至更好,还省掉一整套师生流程。蒸馏更容易见效的场景是:老师明显更强、标注数据偏少、任务需要类间关系信息。判断方法是两条路都跑一遍,用同一份验证集比。

蒸馏和量化、剪枝应该先用哪个?

先看瓶颈在哪:显存不够先量化,结构冗余先剪枝,任务效果不够再上蒸馏。三者叠加时的顺序通常是先训好再做压缩,压缩完再评估,别在同一轮里同时动三个变量。具体档位取舍可到站内量化相关页面看当时的对照,再结合自己的硬件定。

本文依据各平台公开文档与官方公告整理,只做中文归纳;具体做法、参数与限制以官方文档为准。