1. 蒸馏入门
大家好,欢迎来到这门课。我是你们的老朋友,一个在 NLP 和模型压缩领域摸爬滚打了好几年的工程师。
咱们开门见山。今天聊的「知识蒸馏」,说白了就是「大模型教小模型」。你想想看,一个几百亿参数的大模型,推理一次慢得要命,还特别费钱。但它的「知识」——那些从海量数据里学到的规律——能不能传给一个小模型呢?能。这就是蒸馏。
1.1 核心思想:从「标准答案」到「软标签」
传统训练,我们拿的是硬标签。比如情感分类,标签就是「正面」或「负面」。模型学的是:输入 x → 输出 y。但大模型不一样,它输出的是一个概率分布。比如「正面」概率 0.9,「负面」概率 0.1。这个分布里藏着信息——它告诉你,这个样本其实有点接近负面,只是更偏向正面。
这个分布,我们叫它「软标签」。蒸馏的核心,就是让小模型去模仿这个软标签,而不是死磕硬标签。
核心公式(简化版)
蒸馏损失 = α × 学生与教师软标签的 KL 散度 + (1-α) × 学生与硬标签的交叉熵
其中 α 是平衡系数,通常设为 0.7 左右。
为什么软标签更香?我举个例子。假设教师模型对一张图片的预测是:猫 0.8,狗 0.15,车 0.05。硬标签只告诉学生「这是猫」。但软标签告诉学生:「它有点像狗,但更像猫」。这种「类间关系」的信息,硬标签完全丢掉了。
我的经验
我在做 BERT 蒸馏时,发现直接用硬标签训练学生,准确率掉了 5 个点。换成软标签后,只掉了 1.5 个点。差距就在那 3.5% 的「类间关系」信息上。
1.2 为什么需要蒸馏?三个现实痛点
你可能会问:直接训练一个小模型不行吗?行,但效果差很多。原因有三:
- 模型太大,部署不动。BERT-Large 有 3.4 亿参数,在手机上跑一次要几秒钟。用户等不了。
- 数据不够,学不到深层规律。小模型参数量少,拟合能力有限。大模型见过的数据多,它学到的「暗知识」小模型自己学不到。
- 算力成本高。大模型推理一次,电费都心疼。蒸馏后的小模型,推理速度快 10 倍以上。
| 对比维度 | 大模型(教师) | 小模型(学生) | 蒸馏后学生 |
|---|---|---|---|
| 参数量 | 3.4 亿 | 1.1 亿 | 1.1 亿 |
| 推理延迟 | 200ms | 20ms | 20ms |
| 准确率 | 92% | 85% | 90% |
| 部署成本 | 高 | 低 | 低 |
嗯,这里要注意。蒸馏不是万能的。如果教师模型本身就很差,那教出来的学生也好不到哪去。我见过有人拿一个 70% 准确率的教师去蒸馏,结果学生只有 65%。所以,教师模型的质量是天花板。
1.3 三种主要范式:离线、在线、自蒸馏
蒸馏不是只有一种玩法。根据教师和学生模型的训练方式,可以分为三种范式。我画了一张图,帮你快速理解它们的区别。
1.3.1 离线蒸馏(Offline Distillation)
这是最经典的范式。教师模型先训练好,然后固定住。学生模型去模仿教师的输出。教师不再更新。
优点:简单、稳定。教师不会因为学生的干扰而变差。
缺点:教师的能力上限固定了。如果教师不够强,学生也学不到更好的东西。
避坑指南
我曾经在离线蒸馏中犯过一个错:教师模型用的是 BERT-Base,学生用的是 TinyBERT。结果学生学到的全是教师的「偏见」——因为教师本身在某个类别上就表现不好。后来我换了一个更强的教师(BERT-Large),效果立刻提升了。所以,选教师时一定要确认它的能力足够强。
1.3.2 在线蒸馏(Online Distillation)
在线蒸馏里,教师和学生一起训练。教师也在不断更新自己的参数。学生学到的,是教师「当前时刻」的知识。
优点:教师可以持续变强,学生也能跟着受益。
缺点:训练不稳定。教师如果学歪了,学生也跟着歪。而且计算成本高——两个模型同时训练。
我做过一个在线蒸馏的实验,用的是两个 BERT-Tiny 互相学习。结果发现,如果两个模型初始化差距太大,训练很容易崩。后来我让它们共享一部分底层参数,才稳定下来。
1.3.3 自蒸馏(Self-Distillation)
自蒸馏有点意思。没有额外的教师模型。学生自己教自己。怎么做?通常是让模型的深层输出教浅层输出,或者让训练后期的模型教早期的自己。
优点:不需要额外的大模型。适合资源受限的场景。
缺点:提升幅度有限。毕竟教师和学生是同一个模型,知识上限一样。
一个小技巧
自蒸馏时,我建议把教师固定为训练了 80% 步数的 checkpoint,而不是最终模型。因为最终模型可能过拟合了,教出来的学生反而泛化能力差。这是我踩过坑之后总结出来的。
1.4 三种范式的对比总结
| 范式 | 教师状态 | 训练成本 | 效果上限 | 适用场景 |
|---|---|---|---|---|
| 离线蒸馏 | 固定 | 低 | 受限于教师 | 教师已训练好,资源有限 |
| 在线蒸馏 | 动态更新 | 高 | 可能超过教师 | 教师和学生一起从零训练 |
| 自蒸馏 | 自身 | 最低 | 受限于自身 | 无额外教师,模型有层次结构 |
好了,这一章的内容就到这里。你可能会觉得,蒸馏听起来不难嘛。嗯,确实,核心思想很简单。但真正落地的时候,温度系数怎么调、损失函数怎么配、教师和学生怎么对齐——这些才是坑。后面的章节,我会一个一个带你踩过去。