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 为什么需要蒸馏?三个现实痛点

你可能会问:直接训练一个小模型不行吗?行,但效果差很多。原因有三:

  1. 模型太大,部署不动。BERT-Large 有 3.4 亿参数,在手机上跑一次要几秒钟。用户等不了。
  2. 数据不够,学不到深层规律。小模型参数量少,拟合能力有限。大模型见过的数据多,它学到的「暗知识」小模型自己学不到。
  3. 算力成本高。大模型推理一次,电费都心疼。蒸馏后的小模型,推理速度快 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 三种范式的对比总结

范式 教师状态 训练成本 效果上限 适用场景
离线蒸馏 固定 低 受限于教师 教师已训练好,资源有限
在线蒸馏 动态更新 高 可能超过教师 教师和学生一起从零训练
自蒸馏 自身 最低 受限于自身 无额外教师,模型有层次结构

好了,这一章的内容就到这里。你可能会觉得,蒸馏听起来不难嘛。嗯,确实,核心思想很简单。但真正落地的时候,温度系数怎么调、损失函数怎么配、教师和学生怎么对齐——这些才是坑。后面的章节,我会一个一个带你踩过去。