知识类型与迁移策略:从软标签到关系图谱

知识蒸馏的核心问题就一个:老师教什么,学生学什么。但「知识」这个词太宽泛了。我刚开始做蒸馏时,以为就是把老师模型的输出拿过来让学生模仿。后来发现,这远远不够。

你想想看,老师模型在训练过程中积累了大量的「暗知识」——中间层的特征表达、样本之间的相似关系、甚至层与层之间的交互模式。这些信息,光靠一个输出层是装不下的。

所以,我们把蒸馏中的知识分成三大类:基于响应的知识、基于特征的知识、基于关系的知识。每种知识对应不同的迁移策略,适用场景也完全不同。

知识蒸馏三大知识类型与迁移策略 蒸馏知识分类 基于响应的知识 软标签(Soft Label) 温度系数软化概率分布 保留类间相似性信息 硬标签(Hard Label) 直接使用预测类别 适合小模型快速收敛 基于特征的知识 中间层特征图 教师中间层输出作为监督 常用策略:L2损失对齐 需解决维度不匹配问题 注意力迁移(AT) 对齐注意力图而非特征值 基于关系的知识 样本间关系 距离矩阵 / 相似度矩阵 保留样本拓扑结构 层间关系 层与层之间的交互模式 流形学习 / 互信息

一、基于响应的知识:最直接的迁移方式

这是蒸馏领域最早被提出的方法,也是目前工业界用得最多的。说白了,就是让学生模型去模仿教师模型的输出行为。

1.1 软标签(Soft Label)

Hinton 在 2015 年的经典论文里提出了这个概念。教师模型在 softmax 层之前,先除以一个温度系数 T,得到一个「软化」后的概率分布。这个分布里,不仅包含预测类别,还包含了「这个类别和那个类别有点像」的信息。

核心公式:

软标签 = softmax(教师logits / T)
蒸馏损失 = KL散度(学生软输出 || 教师软输出)

我个人的习惯是,T 值一般取 3~8 之间。T 太小,软标签退化成硬标签;T 太大,分布太平坦,信息量反而下降。我在一个图像分类项目里试过 T=20,结果学生模型学了一堆噪声,效果还不如直接用硬标签。

实战技巧:软标签蒸馏通常配合硬标签一起用。损失函数写成:

总损失 = α * 蒸馏损失 + (1-α) * 交叉熵损失

α 一般取 0.7~0.9,具体看任务。我建议先从 0.7 开始调。

1.2 硬标签(Hard Label)

硬标签就是教师模型直接输出的类别预测。比如教师说「这张图 80% 是猫」,硬标签就是「猫」。

你可能会问:那直接用真实标签不就行了?为什么要用教师的硬标签?

嗯,这里有个坑。真实标签是人工标注的,可能存在噪声。而教师模型已经「见过」大量数据,它的硬标签相当于一个去噪后的版本。我在一个医疗影像项目里遇到过,标注数据里有些边界案例标错了,但教师模型的硬标签反而更接近真实分布。

注意:硬标签蒸馏适合学生模型容量很小的情况。因为小模型学不了太细的分布差异,直接学个类别就够了。但如果你用硬标签蒸馏大模型,信息损失会非常严重。

二、基于特征的知识:让中间层也参与教学

只学输出层,相当于只看结果不看过程。教师模型在中间层提取的特征,其实包含了更丰富的语义信息。

2.1 中间层特征图对齐

最直接的做法:把教师和学生某个中间层的特征图拿出来,算一个 L2 损失,让学生特征图尽量接近教师的。

特征蒸馏损失 = || 学生特征图 - 教师特征图 ||²

但这里有个麻烦——教师和学生的特征图维度通常不一样。教师模型宽,学生模型窄。怎么办?

我常用的方案是加一个适配层(Adaptation Layer),用 1x1 卷积把学生特征图升维到和教师一样。或者反过来,用池化把教师特征图降维。

对齐方式 适用场景 缺点
学生升维(1x1 Conv) 学生通道数远小于教师 增加参数量
教师降维(Pooling) 教师通道数过大 可能丢失信息
注意力迁移(AT) 特征图空间结构重要 计算量稍大

2.2 注意力迁移(Attention Transfer)

Zagoruyko 在 2017 年提出,与其对齐特征图的具体数值,不如对齐特征图的注意力分布。因为数值可能受缩放、偏移影响,但注意力分布更稳定。

注意力图计算方式:

注意力图 = sum(特征图², dim=1)  # 通道维度求和后归一化

然后让学生的注意力图去拟合教师的注意力图。

我记得在一个目标检测项目里,用注意力迁移比直接用特征图对齐提升了 2.3 个点的 mAP。原因很简单:检测任务更关注空间位置,注意力图正好抓住了这个关键信息。

三、基于关系的知识:超越单样本的视角

前面两种方法都是「一对一」的——一个样本对应一个输出或一个特征图。但教师模型的知识远不止于此。它内部还编码了样本之间的关系和层与层之间的关系。

3.1 样本间关系

想象一下:教师模型看到两张相似的图片,它在特征空间里会把它们放得很近。这种「远近关系」本身就是知识。

具体做法是:

  1. 取一个 batch 的样本,计算教师特征空间的 pairwise 距离矩阵
  2. 同样计算学生特征空间的 pairwise 距离矩阵
  3. 让两个距离矩阵尽量接近
关系蒸馏损失 = || 学生距离矩阵 - 教师距离矩阵 ||_F

这里的距离可以是欧氏距离、余弦相似度,甚至可以用核方法。我个人的经验是,余弦相似度在大多数任务上表现更稳定,因为它对特征尺度不敏感。

避坑指南:我曾经在一个细粒度分类任务里用欧氏距离做关系蒸馏,结果学生模型学歪了——它把特征向量的模长也学进去了,但模长其实包含了很多噪声。换成余弦相似度后,效果立刻好了很多。

3.2 层间关系

这个方向相对前沿一些。教师模型的不同层之间,存在一种「信息流动」的模式。比如浅层学边缘、中层学纹理、深层学语义。这种层间关系,也可以作为知识迁移给学生。

常见的做法有两种:

  • 流形学习:把各层特征投影到同一个流形空间,然后对齐流形结构
  • 互信息最大化:让学生的层间互信息矩阵接近教师的层间互信息矩阵

说实话,层间关系蒸馏在工业界用得还不多,主要原因是计算量太大。但如果你做的是大模型蒸馏,或者对模型的可解释性有要求,这个方法值得一试。

四、三种知识的对比与选择

知识类型 迁移对象 计算开销 适用场景
基于响应(软标签) 输出概率分布 低 通用分类、小模型蒸馏
基于响应(硬标签) 预测类别 极低 极小型模型、快速部署
基于特征(中间层) 特征图/注意力图 中 检测、分割、细粒度任务
基于关系(样本间) 距离/相似度矩阵 中高 度量学习、检索任务
基于关系(层间) 层间交互模式 高 大模型、可解释性需求

一个重要的提醒:不是所有知识都要迁移。我见过有人把三种知识全用上,结果学生模型训练了三天还没收敛。知识蒸馏的本质是「选择性迁移」——挑最重要的、最相关的知识教给学生。贪多嚼不烂,这个道理在蒸馏里同样适用。