模型蒸馏:把大模型的知识压进小模型
什么是模型蒸馏
知识蒸馏(Knowledge Distillation)由 Hinton、Vinyals 与 Dean 在 2015 年的论文《Distilling the Knowledge in a Neural Network》(arXiv:1503.02531)中系统提出。其核心思想是:训练一个体积小、推理快的「学生模型」(student),让它去模仿一个已经训练好的、能力强但笨重的「教师模型」(teacher)的输出行为,从而把教师模型里蕴含的知识「蒸馏」到小模型中。
传统监督学习只用硬标签(hard target),例如一张图标注为「猫」。但硬标签丢失了大量信息:模型并不能知道这张图「有几分像狗、几分像狐狸」。教师模型的输出分布则暴露了这些类间相似性,是更丰富的监督信号。
软标签与温度 softmax
蒸馏的关键技巧是「软标签」(soft targets):不直接用教师模型 argmax 后的硬类别,而是用它在 softmax 之后、经过「温度」调节的概率分布作为监督。温度 softmax 公式为:
q_i = exp(z_i / T) / Σ_j exp(z_j / T)
其中 z_i 是教师模型倒数第二层(logits)的第 i 个输出,T 为温度系数。T 越大,输出分布越平滑,那些「非正确答案」类之间的相对概率(例如狗比狐狸更像猫)被放大,学生模型能学到更多类间结构信息。训练学生时,同样用温度 T 的 softmax 计算其输出,并用 KL 散度对齐教师软标签;推理阶段再把温度设回 1(标准 softmax)即可。
软标签相比硬标签的另一个好处是「信息量大、梯度方差小」,因此即便用少量数据训练,学生模型也较容易收敛到接近教师的水平。
代表工作 DistilBERT
DistilBERT(Sanh 等人,arXiv:1910.01108)是把知识蒸馏用到预训练语言模型的代表。它在 BERT 的预训练阶段就用蒸馏,让一个参数量更小的模型学习原版 BERT 的行为。论文给出三组关键数据:模型体积减少 40%,在语言理解能力上保留约 97%,推理速度提升约 60%。
其损失函数由三部分组成:语言建模损失(language modeling loss)、蒸馏损失(distillation loss,对齐教师软标签)、以及余弦距离损失(cosine distance loss,拉近师生隐层表示)。DistilBERT 说明了「在预训练阶段蒸馏」就能得到通用、可微调的小模型,而不必为每个任务单独蒸馏。
蒸馏 vs 量化
蒸馏和量化(quantization)都能让模型更适合部署,但作用层面不同。
蒸馏改变的是「模型结构与参数本身」:它训练出一个新的、更小的网络,用教师分布当监督。量化不改变网络结构,而是把权重和激活从高精度(如 FP32)压缩到低位宽(如 INT8),降低存储与计算开销。
简单说,蒸馏是「训练一个小模型来替代大模型」,量化是「把同一个模型用更少的比特表示」。二者不冲突,常结合使用:先用蒸馏得到小模型,再量化进一步压缩,最终在手机、嵌入式等边缘设备上线。
实践与局限
实践中,蒸馏流程一般为:选好教师模型,定义软标签温度与损失组合,用师生同分布数据训练学生。温度 T 是重要超参,过小则软标签退化为硬标签、失去意义,过大则信号过平、难学。
局限方面:蒸馏依赖一个已经很强的教师,若教师本身有偏,学生也会继承;训练学生需要额外算力与调参;对于某些任务,学生很难追平教师上限,存在明显的「容量天花板」。因此蒸馏更适合「教师已定型、要降本部署」的场景,而非替代从零训练。
小结
知识蒸馏用「软标签 + 温度 softmax」让小模型模仿大模型的输出分布,是低成本部署大模型的关键技术。DistilBERT 证明预训练阶段蒸馏即可在体积减 40% 的同时保留约 97% 能力。它与量化互补:蒸馏换小模型,量化压比特,二者叠加是把大模型搬上边缘设备的常用路径。
参考与延伸阅读
- Hinton G., Vinyals O., Dean J. Distilling the Knowledge in a Neural Network. 2015. arXiv:1503.02531. https://arxiv.org/abs/1503.02531
- Sanh V., Debut L., Chaumond J., Wolf T. DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter. 2019. arXiv:1910.01108. https://arxiv.org/abs/1910.01108
- Hugging Face DistilBERT 官方模型与文档:https://huggingface.co/distilbert