知识蒸馏(Knowledge Distillation,KD) 是一种模型压缩技术,通过让小模型(学生)学习大模型(教师)的"暗知识",提升小模型的性能,使得小模型能够接近大模型的准确率,同时保持小模型推理快、内存占用小的优势。
知识蒸馏的核心思想:用一个训练好的大模型(教师模型)来指导小模型(学生模型)训练,让小模型不仅学习原始标签,还学习教师模型输出的软分布中包含的知识。
例如,在图像分类中,模型判断一张猫的图片:"猫"概率90%,"狗"概率5%,"虎"概率3%。这个分布告诉我们猫和狗、虎在特征空间上比较相似,这些信息是硬标签没有的。
标准的知识蒸馏损失是硬损失和软损失的加权组合:
Loss = α * Loss_hard(y_true, y_student) + (1-α) * Loss_soft(p_teacher, p_student)其中:
Loss_hard:学生预测和真实标签之间的交叉熵Loss_soft:学生输出的软标签和教师输出的软标签之间的交叉熵α:超参数,权衡两种损失为了让软标签的分布更平滑,通常会引入温度T对logits进行缩放:
p_i = exp(z_i / T) / Σ exp(z_j / T)蒸馏训练时用T,推理时T恢复为1。温度越高,越能提取教师模型的暗知识。
最经典的知识蒸馏:
在知识蒸馏基础上加入对抗训练,让学生分布更接近教师分布,提高鲁棒性。
最常见:最小化学生logits和教师logits之间的MSE或者KL散度。
不仅匹配输出,还匹配中间层特征,让学生学习教师的分层特征表示。FitNets就是这种方法。
不匹配单个样本的特征,匹配样本对之间的关系。让学生学习样本间的相对关系,而不是绝对特征。
蒸馏Transformer中的注意力权重分布,让学生学习教师的注意力模式。TinyBERT用到了这个。
这是最常见的应用:
将ChatGPT的对齐知识蒸馏到开源 base 模型:
将多个模型集成的知识蒸馏到单个学生模型,用单个模型达到集成效果,推理时只用一个学生模型。
知识蒸馏是模型压缩方法之一,常见的模型压缩加速方法:
| 方法 | 原理 | 作用 |
|---|---|---|
| 知识蒸馏 | 大模型教小模型 | 压缩模型,保持性能 |
| 剪枝 | 删除冗余参数/神经元 | 减少参数量,加速推理 |
| 量化 | 将32位浮点转为8位整数/16位浮点 | 减少内存占用,加速推理 |
| 低秩分解 | 将大权重矩阵分解为两个小矩阵 | 减少参数量和计算 |
| 权重共享 | 多个神经元共享相同权重 | 减少参数量 |
**什么是知识蒸馏?讲讲基本原理 知识蒸馏是模型压缩技术,用一个训练好的大模型(教师)指导小模型(学生)训练,让学生不仅学习硬标签,还学习教师输出的软标签,软标签中包含类别相似性等暗知识,帮助学生更好学习,最终小模型能达到接近大模型的准确率,同时保持小模型速度快、占地小的优势。
**什么是软标签?为什么软标签比硬标签好? 硬标签是one-hot,只有正确类别是1,其他都是0,只告诉学生哪个对,不告诉为什么对,也不告诉类别之间的关系。软标签是教师模型输出的概率分布,它包含了不同类别之间的相似性信息,比如猫的图,狗概率比车高,说明猫更像狗不像车,这些暗知识能帮助学生更好学习泛化。
**温度参数T的作用是什么?为什么要用T? 温度T用来软化教师输出的概率分布,T越大分布越平滑,原本概率小的类别概率变大,使得这些类别包含的暗知识更容易被学生学习。如果T=1,正确类别概率接近1,其他接近0,就和硬标签差不多了,失去了暗知识。所以蒸馏需要较大的T来提取暗知识。推理时T改回1。
**离线蒸馏和在线蒸馏的区别? 离线蒸馏:教师预训练好冻结,只训练学生,简单稳定,最常用。在线蒸馏:教师和学生一起训练,不需要预训练教师,有时候可以互相学习,适合半监督场景,但训练更复杂。
**自蒸馏是什么? 自蒸馏是教师和学生来自同一个模型,比如用训练到一半的模型蒸馏后续训练,或者用训练好的模型蒸馏自己,甚至相同结构蒸馏后准确率更高。自蒸馏不需要额外训练教师,方便,还有一定正则化效果。
**为什么知识蒸馏能提升小模型的性能? 因为大模型学到的知识不仅仅是哪个正确,还包含输入空间中类别之间的关系、泛化边界等暗知识,这些信息编码在软输出中,小模型通过学习软标签,能更好地学到这些泛化信息,因此性能比只用硬标签训练更好。
**知识蒸馏一定需要大模型比小模型大吗?可以多个教师蒸馏一个学生吗? 通常教师比学生大,大模型知识多效果好。但也可以多个教师一起蒸馏一个学生,集成多个教师的知识,效果比单个教师更好。
**知识蒸馏和数据蒸馏有什么区别? 知识蒸馏是模型压缩,大模型教小模型。数据蒸馏是选择信息量大的样本训练,减少训练数据量,不是一回事。
**在大语言模型中,知识蒸馏有哪些应用?
**模型压缩有哪些方法?知识蒸馏和剪枝、量化的区别? 常见模型压缩方法:知识蒸馏、剪枝、量化、低秩分解、权重共享。
**FitNets和原始Hinton蒸馏的区别是什么? 原始Hinton蒸馏只蒸馏输出层的logits。FitNets不仅蒸馏输出层,还蒸馏中间层的特征,让学生匹配教师的中间特征,迁移更细粒度的知识,能训练更深更小的学生,效果更好。
**知识蒸馏一定能提升效果吗?什么情况下效果不好? 如果教师模型本身准确率很低,蒸馏效果肯定不好。如果教师和学生差距太大,学生学不会教师的复杂知识,效果也会打折扣。蒸馏是锦上添花,不是雪中送炭,教师好才能教出好学生。