Knowledge Distillation
知识蒸馏通过训练小型学生模型模仿大型教师模型的输出或特征,以低得多的计算量保留其大部分准确率。
知识蒸馏是一种模型压缩技术,通过训练较小的“学生”神经网络来复现更大、更准确的“教师”模型的行为。学生除了使用或代替真实标签外,还会从教师的输出概率或内部特征中学习;这些信息更丰富的目标,使学生的准确率高于仅使用标签训练的相同架构。最终得到的模型足够快速且小巧,可以部署在手机、嵌入式板卡及其他边缘 AI硬件上,同时保留教师模型的大部分性能。Buciluǎ、Caruana 和 Niculescu-Mizil 于 2006 年证明,集成模型的知识可以压缩到单个模型中;Hinton、Vinyals 和 Dean于 2015 年将这一方法命名为知识蒸馏,并提出了大多数方法至今仍在使用的温度软化目标。
知识蒸馏的工作原理#
标签只能说明图像中有一只狼。经过训练的教师模型给出的 softmax 输出包含更多信息:图像有点像哈士奇,有一点像猫,但完全不像汽车。这些错误类别的相对概率通常称为暗知识,并以软目标的形式传递给学生。在 softmax 之前,先将 logits 除以大于 1 的温度 T,可以使概率分布更平缓,让较小的概率也具有足够权重,便于模型学习。蒸馏损失是教师与学生软化后分布之间的 Kullback-Leibler 散度,并乘以 T²,使其梯度大小与普通标签损失的梯度大致相当:
import torch
import torch.nn.functional as F
# Logits for one wolf photo over the classes [wolf, husky, cat, car]
teacher_logits = torch.tensor([[6.0, 4.0, 1.0, -2.0]])
student_logits = torch.tensor([[4.0, 1.0, 1.5, 0.0]])
# Dividing logits by a temperature T > 1 softens the teacher's distribution
for T in (1.0, 4.0):
probs = F.softmax(teacher_logits / T, dim=1)
print(f"T={T}: teacher probabilities {[round(p, 3) for p in probs[0].tolist()]}")
# Distillation loss: KL divergence between the softened distributions, scaled by T^2
T = 4.0
soft_targets = F.softmax(teacher_logits / T, dim=1)
student_log_probs = F.log_softmax(student_logits / T, dim=1)
loss = F.kl_div(student_log_probs, soft_targets, reduction="batchmean") * T**2
print(f"Distillation loss at T={T}: {loss.item():.3f}")T=1 时,教师给狼类别的概率为 0.875,而给猫的概率只有 0.006,给汽车的概率为 0.0。T=4 时,同一组 logits 会变成 0.493、0.299、0.141 和 0.067,这向学生表明,狼比猫更像哈士奇,而猫比汽车更像哈士奇。学生会尽量降低这一损失,此处损失为 1.244;通常还会将它与基于真实标签的常规任务损失加权求和。教师模型在整个过程中保持冻结状态,只执行前向传播:
蒸馏类型#
- 基于响应的蒸馏:学生匹配教师的最终输出,如上文的软目标方法;除了 logits 外,学生不需要教师提供任何其他信息。DistilBERT在预训练时将这种方法与语言建模损失和隐藏状态损失结合,使 BERT 的尺寸缩小 40%、速度提高 60%,同时保留 97% 的语言理解能力。
- 基于特征的蒸馏:学生匹配教师的中间特征图,并通过一个较小的学习型投影器来弥合通道数量上的差异。FitNets提出了这些“提示”,并训练出一个参数量约比教师少 10.4 倍、但在 CIFAR-10 上表现优于教师的学生模型。
- 基于序列的蒸馏:语言模型教师生成文本,学生则使用这些输出进行微调。DeepSeek 使用 DeepSeek-R1 筛选的 800,000 个样本,对基于 Qwen2.5 和 Llama 3 的 R1 蒸馏模型进行了微调。
基于特征的蒸馏适用于检测器,因为检测器的输出是数千个边界框和分数,而不是一个类别分布。训练时收到 distill_model 教师模型后,Ultralytics YOLO 会使用这种蒸馏方式:一个冻结的大型 YOLO26 模型会提供三个颈部特征图,这些特征图会输入其检测头;学生通过 1×1 卷积投影器匹配这些特征图,并使用按教师置信度加权的 L2 损失,损失缩放系数为 dis(默认为 6.0)。在 COCO val2017 上,蒸馏后的 YOLO26 nano 模型达到 41.5 mAP50-95,而同一模型在没有教师的情况下训练时为 40.9,且两者的推理成本相同。
from ultralytics import YOLO
# 学生:将要部署的紧凑型 YOLO26 nano 模型
model = YOLO("yolo26n.pt")
# 教师:用于指导训练、之后会被舍弃的较大 YOLO26 检查点
results = model.train(data="coco8.yaml", epochs=5, distill_model="yolo26s.pt")蒸馏与相关术语的比较#
- 迁移学习:将模型自身的权重作为新任务的起点。蒸馏则会训练另一个通常更小的架构,使其在相同任务上模仿某个模型。
- 模型剪枝:从训练好的网络中移除权重、通道或层。剪枝后的模型通常会使用原模型进行蒸馏微调,以恢复准确率。
- 模型量化:以较低精度(如 INT8)存储权重和激活值。量化会缩小相同的架构,而蒸馏则会选择更小的架构;两者可以结合使用。
- 模型集成:在推理时对多个模型的结果取平均。将集成模型蒸馏为一个学生模型,正是这项技术最初的动机。
- 数据集蒸馏:尽管名称相似,它压缩的是数据集而非模型。Wang 等人将 MNIST 的 60,000 张训练图像压缩为 10 张合成图像(每个类别一张);使用固定初始化的网络经过几步梯度更新后,这些图像即可使模型接近原始准确率。










