知识类型与迁移策略:从软标签到关系图谱
知识蒸馏的核心问题就一个:老师教什么,学生学什么。但「知识」这个词太宽泛了。我刚开始做蒸馏时,以为就是把老师模型的输出拿过来让学生模仿。后来发现,这远远不够。
你想想看,老师模型在训练过程中积累了大量的「暗知识」——中间层的特征表达、样本之间的相似关系、甚至层与层之间的交互模式。这些信息,光靠一个输出层是装不下的。
所以,我们把蒸馏中的知识分成三大类:基于响应的知识、基于特征的知识、基于关系的知识。每种知识对应不同的迁移策略,适用场景也完全不同。
一、基于响应的知识:最直接的迁移方式
这是蒸馏领域最早被提出的方法,也是目前工业界用得最多的。说白了,就是让学生模型去模仿教师模型的输出行为。
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 样本间关系
想象一下:教师模型看到两张相似的图片,它在特征空间里会把它们放得很近。这种「远近关系」本身就是知识。
具体做法是:
- 取一个 batch 的样本,计算教师特征空间的 pairwise 距离矩阵
- 同样计算学生特征空间的 pairwise 距离矩阵
- 让两个距离矩阵尽量接近
关系蒸馏损失 = || 学生距离矩阵 - 教师距离矩阵 ||_F
这里的距离可以是欧氏距离、余弦相似度,甚至可以用核方法。我个人的经验是,余弦相似度在大多数任务上表现更稳定,因为它对特征尺度不敏感。
避坑指南:我曾经在一个细粒度分类任务里用欧氏距离做关系蒸馏,结果学生模型学歪了——它把特征向量的模长也学进去了,但模长其实包含了很多噪声。换成余弦相似度后,效果立刻好了很多。
3.2 层间关系
这个方向相对前沿一些。教师模型的不同层之间,存在一种「信息流动」的模式。比如浅层学边缘、中层学纹理、深层学语义。这种层间关系,也可以作为知识迁移给学生。
常见的做法有两种:
- 流形学习:把各层特征投影到同一个流形空间,然后对齐流形结构
- 互信息最大化:让学生的层间互信息矩阵接近教师的层间互信息矩阵
说实话,层间关系蒸馏在工业界用得还不多,主要原因是计算量太大。但如果你做的是大模型蒸馏,或者对模型的可解释性有要求,这个方法值得一试。
四、三种知识的对比与选择
| 知识类型 | 迁移对象 | 计算开销 | 适用场景 |
|---|---|---|---|
| 基于响应(软标签) | 输出概率分布 | 低 | 通用分类、小模型蒸馏 |
| 基于响应(硬标签) | 预测类别 | 极低 | 极小型模型、快速部署 |
| 基于特征(中间层) | 特征图/注意力图 | 中 | 检测、分割、细粒度任务 |
| 基于关系(样本间) | 距离/相似度矩阵 | 中高 | 度量学习、检索任务 |
| 基于关系(层间) | 层间交互模式 | 高 | 大模型、可解释性需求 |
一个重要的提醒:不是所有知识都要迁移。我见过有人把三种知识全用上,结果学生模型训练了三天还没收敛。知识蒸馏的本质是「选择性迁移」——挑最重要的、最相关的知识教给学生。贪多嚼不烂,这个道理在蒸馏里同样适用。