1. 知识蒸馏概述:从“大老师”到“小学生”的传承

大家好,欢迎来到这门课的第一章。

知识蒸馏(Knowledge Distillation,KD),说白了就是让一个小模型去模仿一个大模型的行为。你想想看,大模型(比如 BERT-Large、GPT-3)虽然能力强,但部署到手机或边缘设备上,那简直是“杀鸡用牛刀”,推理慢、内存大、功耗高。小模型呢?跑得快、省资源,但精度往往差一截。

知识蒸馏就是来解决这个矛盾的。它让一个“教师网络”(Teacher)去教一个“学生网络”(Student)。学生学到的不是原始数据,而是教师“消化”后的知识。我在项目中遇到过好几次,直接用小模型从头训练,效果总差那么 2-3 个点。但用了蒸馏,学生模型几乎能无损地继承教师的能力。

1.1 蒸馏的动机与目标

动机其实很朴素:模型太大,跑不动。具体来说,有三大痛点:

  • 推理延迟高:大模型在 CPU 或低端 GPU 上,一次推理可能要几百毫秒,无法满足实时性要求。
  • 内存/显存占用大:比如一个 ResNet-152 模型,参数超过 60M,在移动端根本放不下。
  • 功耗过高:数据中心和边缘设备都扛不住。

蒸馏的目标很明确:在尽量不损失精度的情况下,大幅压缩模型体积和计算量。我个人的习惯是,先看业务场景对延迟和精度的容忍度,再决定要不要上蒸馏。如果精度要求极高(比如医疗影像),蒸馏可能只是辅助手段;但如果是为了上线一个实时推荐系统,蒸馏几乎是必选项。

核心目标公式:

学生模型精度 ≈ 教师模型精度,但学生模型推理速度 × 2~10 倍,模型体积压缩 50%~90%。

1.2 教师-学生网络架构

这个架构听起来高大上,其实结构很简单。教师网络通常是一个预训练好的大模型,参数冻结,不参与训练。学生网络是一个小模型,从头开始训练,或者用教师的部分权重初始化。

训练时,学生不仅要学习真实标签(hard label),还要学习教师输出的软标签(soft label)。软标签里包含了类别之间的相似性信息——比如一张猫的图片,教师可能输出“猫 0.9,狗 0.08,老虎 0.02”。这个分布比 one-hot 标签“猫 1.0”信息量大多了。

我的经验: 学生网络的结构不一定要和教师完全一样。我试过用 3 层 Transformer 的学生去学 12 层 Transformer 的教师,效果依然不错。关键是学生的容量要足够“接住”教师的知识,别太小。

下面这张图展示了教师-学生架构的核心流程:

教师-学生网络架构图 教师网络(大模型) 参数冻结,不参与训练 学生网络(小模型) 从头训练或部分初始化 输入数据(图片/文本) 软标签(Soft Label) 学生预测分布 蒸馏损失(KL散度) 真实标签(Hard Label) 交叉熵损失

1.3 知识蒸馏的三大范式

蒸馏不是只有一种玩法。根据教师和学生训练的方式,业界把它分成了三大范式。我刚开始接触时也容易搞混,后来用一句话总结:看教师和学生谁先训练、谁后训练、谁更新参数。

范式 教师网络 学生网络 典型场景
离线蒸馏 预训练好,完全冻结 从头训练,只学教师输出 大模型压缩、模型部署
在线蒸馏 与学生同步训练,参数更新 与教师同步训练,互相学习 多任务学习、协同训练
自蒸馏 学生自己当自己的老师 同一模型不同阶段或不同深度 轻量化、无额外教师

1.3.1 离线蒸馏(Offline Distillation)

这是最经典、最常用的范式。流程很简单:

  1. 先训练一个大的教师模型,直到收敛。
  2. 冻结教师参数,用教师对训练集生成软标签。
  3. 学生模型同时学习软标签和真实标签。

我个人的习惯是,离线蒸馏适合那种“教师模型已经存在”的场景。比如公司之前已经部署了一个大模型,现在想换小模型,直接用离线蒸馏就行,不需要重新训练教师。

避坑指南: 我曾经在离线蒸馏时犯过一个低级错误——忘了对软标签做温度缩放(Temperature Scaling)。如果不加温度,软标签太平滑(接近均匀分布),学生学不到有效信息。温度一般设置在 3~10 之间,具体要调。

1.3.2 在线蒸馏(Online Distillation)

在线蒸馏里,教师和学生是同时训练的。教师不再是一个固定的“老前辈”,而是和学生一起成长。这种方式的好处是:不需要预先训练一个教师,节省了训练成本。

但问题也很明显:如果教师太弱,学生学不到好东西;如果教师太强,学生跟不上。我建议在在线蒸馏中,教师和学生可以共享一部分底层特征提取器,这样两者能更好地对齐。

1.3.3 自蒸馏(Self-Distillation)

自蒸馏是个很有意思的范式。它不需要额外的教师网络,学生自己就是自己的老师。具体做法是:

  • 在训练过程中,把模型早期 epoch 的输出作为“教师信号”。
  • 或者把模型深层的特征图作为“教师”,去指导浅层特征。

你想想看,这其实是一种自我反思机制。模型在训练后期,用自己早期的“模糊知识”来约束自己,防止过拟合。我在做轻量化模型时特别喜欢用自蒸馏,因为它不需要额外存储教师模型,部署起来特别干净。

一句话总结三大范式:

  • 离线蒸馏:先有老师,再教学生。
  • 在线蒸馏:老师和学生一起上学。
  • 自蒸馏:学生自己当自己的老师。