知识蒸馏 (Knowledge Distillation)综述
目录
0. 导向
关于轻量化网络,目前来说,大致可分成两大块:基于网络架构本身的设计和对模型进行压缩,我自觉网络架构本身设计难于上青天,这块都是Google大佬,facebook大佬等走在最前沿,比如使用NAS的方法去自动寻找对应任务的网络架构,嗯,听起来很玄学。整个轻量型网络目前来说有下面主要工作,直接上图
科学理论只有联系实际才能转化成产品,我们往往更看重知识转化为经济效益。轻量化网络就是将我们模型能够在现有的有限硬件条件下实现落地。好的,举个栗子:
假如你用深度学习模型在服务器上达到了很好的预测效果,实际上是很多网络(Resnet,Vgg等)需要的计算量和计算资源很大,这对硬件的要求很高,你可能需要这样的
然而,你可能只有这样的
在应用服务上,我们很容易见到这些智能产品,要直接把模型算法部署到这些小的设备上是困难的
于是,我们希望从一个大的模型上得到知识转移给小的模型,而小模型能达到跟大模型相当的效果,因此知识蒸馏就诞生了。
1.下面将对知识蒸馏做全面的综述性介绍
1.1 概念
就好像一个有几十年经验的老师(水平高,知识全面,学的快等特点)(相当于大模型),有个刚入学的学生(知识储备能力小,经验不丰富)(相当于小模型)。
但是呢,这个老师知识存储可能过多,存在冗余现象,暂且可以理解为学生为了效率不需要学任务之外的多余的知识,当然老师的老师的水平高低会不会决定学生水平的上限。
下面解释一下知识蒸馏的蒸馏体现在哪里
其中对于每一条数据,原模型产生的logits为
v
i
v_i
vi,新模型logits为
z
i
z_i
zi,对
v
i
v_i
vi和
z
i
z_i
zi进行下面广义的softmax操作
q
i
=
e
x
p
(
z
i
/
T
)
∑
j
e
x
p
(
z
j
/
T
)
;
v
i
=
e
x
p
(
v
i
/
T
)
∑
j
e
x
p
(
v
j
/
T
)
q_i={\frac{exp(z_i/T)}{\sum_jexp(z_j/T)}};v_i={\frac{exp(v_i/T)}{\sum_jexp(v_j/T)}}
qi=∑jexp(zj/T)exp(zi/T);vi=∑jexp(vj/T)exp(vi/T)
T
T
T是一个温度参数,先把
T
T
T调大(相当于升温),这时softmax产生的分布足够软(好比化学蒸馏过程中,混合液体的分子变得活跃起来),测试阶段的时候再把
T
T
T调低至1,从而将原有的知识提取出来.
若存在不理解的地方,详细可参考博文.也可参考李宏毅视频
1.2 研究内容
-
知识种类:knowledge categories
-
训练方法:training schemes
-
教师-学生框架:teacher-student architecture
-
蒸馏算法:distillation algorithms
-
性能对比(蒸馏前后):performance comparison
-
应用:applications
蒸馏的成功依赖于: -
数据几何:data geometry
-
蒸馏目标的优化偏差:optimization bias of distillation objective
-
学生分类器的强单调性:strong monotonicity of student classifer
可扩展的方向: -
标签平滑:label smoothing
-
评估老师的准确性: assessing the accuracy of the teacher
-
获取最佳输出层几何的先验:obtaining a prior for the optimal output layer geometry
衍生的新的方向 -
teacher-student learning
-
mutual learning
-
assistant teaching
-
lifelong learning
-
self-learning
-
knowledge transfer:如 dataset distillation,可以减少训练的负荷
-
adversarial attacks
-
data augmentation
-
data privacy and security
-
dataset compressing
2.知识的种类和蒸馏的种类
知识种类 | 提出时间 |
---|---|
vanilla knowledge | Hinton在2015 |
中间层的activation,neurons ,feature | 2015 |
activation,neurons,样本对之间的关系 | 2017 |
教师模型之间的参数(层之间的联系) | 2019 |
2.1 基于响应的知识
教师网络最后一层的输出,直接模仿教师最后的预测,该方法简单高效
损失函数:
L
R
e
s
(
z
t
,
z
s
)
=
L
R
(
z
t
,
z
s
)
L_{Res}(z_t,z_s) = \mathcal{L}_R(z_t,z_s)
LRes(zt,zs)=LR(zt,zs) 其中
L
R
(
.
)
\mathcal{L}_R(.)
LR(.)代表logits之间的交叉熵
对于分类任务,基于响应的知识最流行的是soft targets,表示为:
p
(
z
i
,
T
)
=
e
x
p
(
z
i
/
T
)
∑
j
e
x
p
(
z
j
/
T
)
p(z_i,T)=\dfrac{exp(z_i/T)}{\sum_jexp(z_j/T)}
p(zi,T)=∑jexp(zj/T)exp(zi/T)
于是,在下面蒸馏模型中
Distillation Loss:
L
R
e
s
D
(
p
(
z
i
,
T
)
,
p
(
z
s
,
T
)
)
=
L
R
(
p
(
z
i
,
T
)
,
p
(
z
s
,
T
)
)
L_{ResD}(p(z_i,T),p(z_s,T)) = \mathcal{L}_R(p(z_i,T),p(z_s,T))
LResD(p(zi,T),p(zs,T))=LR(p(zi,T),p(zs,T))
student Loss:
L
C
E
(
y
,
p
(
z
s
,
T
=
1
)
)
\mathcal{L}_{CE}(y,p(z_s,T=1))
LCE(y,p(zs,T=1))
缺点:依赖最后一层的输出,不能处理教师模型中间层的监督,soft logits是分类概率,基于响应的知识只限于监督学习。
2.2 基于feature的知识
损失函数:
L
F
e
a
D
(
f
t
(
x
)
,
f
s
(
x
)
)
=
L
F
(
Φ
t
(
f
t
(
x
)
,
Φ
s
(
f
s
(
x
)
)
)
L_{FeaD}(f_t(x),f_s(x)) = \mathcal{L}_F(\Phi_t(f_t(x),\Phi_s(f_s(x)))
LFeaD(ft(x),fs(x))=LF(Φt(ft(x),Φs(fs(x)))
Φ
t
\Phi_t
Φt表示如果教师和学生模型的feature map的shape不一样时,把shape变成一样
L
F
\mathcal{L}_F
LF:相似性函数,用于匹配教师和学生模型的feature map
问题:(1)怎么选择合适的hint层;(2)由于hint层和guided层的尺寸不一样,需要研究怎么去研究匹配两者之间的特征表征。
2.3 基于relation的知识
基于relation的知识:在不同层或者数据样本的关系。
FSP 矩阵(Gram 矩阵):通过两个层之间的特征图做内积,总结特征图之间的关系,使用特征图之间的联系作为知识。(2017)
奇异值分解(SVD)KD用来提取键值信息
多教师网络的知识用每个教师模型的logits和feature作为节点做了两个图,通过logits和表征图作为KD的知识
Multi-head graph-based KD
损失函数:
L
R
e
l
D
(
F
t
,
F
s
)
=
L
R
2
(
Φ
t
(
t
i
,
t
j
)
,
Φ
s
(
s
i
,
s
j
)
)
L_{RelD}(F_t,F_s) = \mathcal{L}_{R^2}(\Phi_t(t_i,t_j),\Phi_s(s_i,s_j))
LRelD(Ft,Fs)=LR2(Φt(ti,tj),Φs(si,sj))
3.蒸馏的方法(训练的方法)
根据学生是不是和教师网络同时更新可以分三种
- 离线蒸馏
vanilla 蒸馏,两个步骤:
(1)蒸馏前,在大数据集上预先训练好教师模型
(2)蒸馏时,教师模型以logits或者中间features的形式提取知识,然后指导学生模型进行训练
方法:离线蒸馏方法通常采用单向知识转移和两阶段训练程序。然而,复杂的大容量教师模型训练时间很长是无法避免的,而离线蒸馏的学生模型训练通常在教师模型的指导下是高效的。而且,大老师和小学生之间的能力差距一直存在,学生往往很大程度上依赖于老师。 - 在线蒸馏
在大容量高性能的教师模型不存在的时候,使用在线蒸馏可以提高学生网络性能
方法 在线蒸馏是一种具有高效并行计算的单阶段端到端训练方案。然而,现有的在线方法(例如,相互学习)通常不能解决在线设置中的高容量教师,使得进一步探索在线设置中教师和学生模型之间的关系成为有趣的话题。 - 自蒸馏
在自蒸馏中,教师和学生模型使用相同的网络
方法 - 从更深层蒸馏到更浅层
- 把自己层的注意力图作为蒸馏目标蒸馏到更低层
- 把前epoch得到的网络当作监督的训练过程转移到后面层,后面层模仿前一层
- 标签平滑正则化
3.师生框架
深度神经网络的复杂性主要来自深度和宽度两个维度。通常需要将知识从更深更宽的神经网络转移到更浅更薄的神经网络。
学生网络的选择:
(1)教师网络的简化版本,具有更少的层和每层更少的通道
(2)保留网络结构的教师网络的量化版本
(3)具有高效基本操作的小型网络
(4)具有全局优化过网络结构的小型网络
(5)和教师一样的网络
需要克服的困难
大网络和小网络之间的容量差别使得知识转移有困难
结构差异
方法
- 引入一名教师助理,以缩小教师模式和学生模式之间的训练差距。残差学习进一步缩小了这种差距,
- 网络量化结合到知识蒸馏
- 多层的知识转移到一层中
- block-wise知识转移,同时保存原有感受野
- 教师模型是学生模型的集合,学生模型共享相同的结构
- 深度可分离卷积
- 自适应的方法适应性的师生学习架构是必要的。最近,知识提炼中的神经架构搜索的思想,即在教师模型的指导下对学生结构和知识转移的联合搜索,将是未来研究的有趣主题。
4.师生框架
4.1 对抗蒸馏
motivation:
- 教师模型很难从真实的数据分布中完美学习
- 学生模型只有很小的容量,因此不能准确模仿教师模型
GAN
鉴别器估计一个样本来自训练样本的概率;生成器试图用生成的数据样本去糊弄鉴别器
受GAN的启发,使用GAN的思想去使得教师模型和学生模型对真实的数据分布有一个更好的理解
主要对抗蒸馏方法的不同类别
GAN中的生成器生成训练数据以提高KD性能;老师可能被用作鉴别器
GAN中的鉴别器确保学生(也作为生成器)模仿老师。
教师和学生组成生成器;鉴别器增强了在线知识蒸馏。
GAN中的知识蒸馏损失:
4.2 多教师蒸馏
不同的教师架构可以为学生网络提供他们自己有用的知识。在训练学生网络期间,多个教师网络可以单独地和整体地用于蒸馏。在典型的师生框架中,教师通常有一个大模型或一组大模型。要从多名教师那里传递知识,最简单的方法是使用所有教师的平均作为监督信号
4.3 多模态蒸馏
在训练或测试期间,某些模式的数据或标签可能不可用
由于这个原因,在不同的模态之间传递知识是很重要的。使用跨模态知识转移的几个典型场景回顾如下。
4.4 基于图的蒸馏
大多数知识提炼算法集中于将单个实例知识从教师转移到学生,而一些最近的方法已经被提出来使用图来探索数据内部的关系
序号 | 方法 |
---|---|
1 | 用图形作为教师知识的载体; |
2 | 用图形控制教师知识的信息传递. |
4.4 基于注意力的蒸馏
核心:定义神经网络层中特征嵌入的注意图。 也就是说,关于特征嵌入的知识是使用注意图函数传递的。
4.5 无数据蒸馏
无数据的KD方法用来克服由于隐私、合法性、安全性和保密性问题而导致的数据不可用的问题
数据是新生成的或合成生成的。
4.6 量化蒸馏
网络量化通过将高精度网络(例如32位浮点)转换为低精度网络(例如2位和8位)来降低神经网络的计算复杂度。
4.6 终身蒸馏
它积累了以前学到的知识,也将学到的知识转移到未来的学习。知识蒸馏提供了一种有效的方法来保存和转移所学的知识,而不会发生灾难性的遗忘。
4.7 基于NAS的蒸馏
自动识别深层神经模型,自适应学习合适的深层神经结构。在知识蒸馏中,知识转移的成功不仅取决于教师的知识,还取决于学生的结构。