3. 特征迁移理论基础
特征迁移,说白了就是让教师网络「教」学生网络怎么提取更好的特征。不是简单教答案,而是教思路。
我刚开始做知识蒸馏时,总觉得直接拿 logits 蒸馏就够了。后来发现,很多场景下学生网络学到的特征图跟教师差得远,泛化能力上不去。这才意识到,特征层面的迁移才是真正的「授人以渔」。
这一章,我们把这四种核心方法掰开揉碎讲清楚。
3.1 特征图对齐:最直接的模仿
特征图对齐是最朴素的想法——让学生网络中间层的特征图,尽量接近教师网络的对应层。
具体做法很简单:
- 选取教师网络某个中间层的输出特征图 F_t
- 选取学生网络对应层的输出特征图 F_s
- 计算两者之间的差异,作为损失函数的一部分
最常用的损失函数是均方误差(MSE):
L_feat = (1 / (N * C * H * W)) * ||F_t - f_adapt(F_s)||²
这里有个坑——教师和学生网络的通道数往往不一样。我遇到过好几次,学生网络通道数只有教师的一半,直接算 MSE 维度都不匹配。
特征图对齐的优点是实现简单,效果稳定。但缺点也很明显——它强制学生去匹配教师的具体数值,忽略了特征之间的相对关系。
3.2 注意力迁移:关注该关注的地方
特征图对齐太死板了。换个思路——我们不要求学生模仿具体的特征值,而是模仿教师的「注意力分布」。
注意力迁移的核心思想:教师网络知道该关注图像的哪些区域,学生网络也应该学会这种关注能力。
具体实现上,常用的是基于注意力图的损失:
L_att = ||A_t / ||A_t||₂ - A_s / ||A_s||₂||₂
其中 A_t 和 A_s 分别是教师和学生的注意力图。注意力图可以从特征图的通道维度上求和得到:
A = sum(F², dim=1) # 对通道维度求平方和
为什么要平方?我个人的理解是——平方操作放大了高响应区域,抑制了低响应区域,让注意力分布更「尖锐」。
| 方法 | 对齐目标 | 优点 | 缺点 |
|---|---|---|---|
| 特征图对齐 | 具体数值 | 实现简单,收敛快 | 过于严格,忽略相对关系 |
| 注意力迁移 | 空间分布 | 更灵活,泛化性好 | 可能丢失通道维度信息 |
注意力迁移在图像分类、目标检测任务中效果都不错。我做过一个实验,用注意力迁移训练的学生网络,在遮挡场景下的鲁棒性明显优于特征图对齐的方法。
3.3 关系知识蒸馏:学关系,不学数值
前面两种方法都是「点对点」的模仿。关系知识蒸馏换了个角度——让学生网络学习教师网络内部样本之间的关系。
举个例子:假设有三个样本 A、B、C。教师网络认为 A 和 B 的特征更接近,A 和 C 的特征更远。学生网络也应该学到这种远近关系。
关系知识蒸馏的典型实现:
- 从教师网络中提取一批样本的特征向量
- 计算样本之间的相似度矩阵(比如用余弦相似度)
- 对学生网络做同样的操作
- 最小化两个相似度矩阵之间的差异
L_rel = ||S_t - S_s||²
# S_t 和 S_s 分别是教师和学生的样本间相似度矩阵
我记得在一个跨架构蒸馏任务中(ResNet-50 蒸馏到 MobileNet-V2),特征图对齐的效果很差,但关系知识蒸馏却取得了不错的结果。原因就是两个网络的特征空间差异太大,点对点对齐根本行不通。
3.4 互信息最大化:信息论视角
互信息最大化是这四种方法里理论最深的。它从信息论的角度出发,目标是最大化教师特征和学生特征之间的互信息。
互信息衡量的是两个变量之间的依赖程度。互信息越大,说明学生特征包含的教师特征信息越多。
数学上,互信息的定义是:
I(X; Y) = KL(P(X,Y) || P(X)P(Y))
直接计算高维特征的互信息非常困难。实际中常用的是互信息下界估计方法,比如 InfoNCE 损失:
L_infoNCE = -log( exp(sim(z_t, z_s)) / sum(exp(sim(z_t, z_neg))) )
其中 z_t 和 z_s 是教师和学生的特征,z_neg 是负样本特征,sim 是相似度函数。
四种方法各有适用场景。我一般这样选:
- 教师和学生网络结构相近 → 特征图对齐
- 需要空间注意力能力 → 注意力迁移
- 跨架构蒸馏 → 关系知识蒸馏
- 小样本或数据稀缺 → 互信息最大化
当然,实际项目中往往是多种方法组合使用。我习惯用特征图对齐做基础,再加上关系知识蒸馏做补充,效果比较稳定。
这四种方法构成了特征迁移的理论基础。实际项目中,我建议先从特征图对齐入手,跑通流程后再逐步加入其他方法。别一上来就搞太复杂,容易出问题。