知识蒸馏
目的:
模型网络复杂度比较高时,不利于上线,为了使得简单的模型能够有一个较高的复杂度,可以预先训练一个复杂度较高的Teacher Network,然后用Teacher Network去教一个复杂度较低的Student Network,使得Student Network也有一个不错的效果,然后用Student Network 去上线。
推荐:
推荐大家看一下B站的一个短视频,这个up主比较浅显得讲出了最基本的知识蒸馏的流程。
流程:
step1:构建复杂的教师网络
以一个三分类(猫、狗、鸡)为例,最后一层FC未经过Softmax的输出为[4.2, 2.3, 0.5],可以看成是各个类的得分,那么得分倾向于分为“猫”类。
step2: 知识蒸馏
上一步的得分经过softmax后,转换为概率输出为[0.85, 0.13, 0.02]
改造一下softmax的公式,_
取t=5时,再计算下得分转换的概率,为[0.46, 0.32, 0.22],可以看出概率值被平滑了,取t=10时,结果为[0.4, 0.33, 0.27],结果更平滑。从物理意义去解释就是分类器认为这是“猫”,并且还有点像“狗”。
从而,引出一些概念:
t被称为蒸馏温度,t-softmax过程被称为知识蒸馏,得出来的“有点像狗”这一信息被称为暗知识。
step3:教师教学生
构建一个网络结构相对简单的分类器,最后一层的得分记作output,记老师蒸馏后的结果为knowledge,真实标签为label。
定义新的损失函数为:_
下图很清晰的描述一个知识蒸馏的全过程。(图片来源于B站视频)
注:
知识蒸馏中,还有很多变种方法,比如multible-tearchers,用多个teachers的加权蒸馏结果教学生,这样做会淡化每个teacher的特长;又或者每次挑选不同的teacher去教,这样学生可以学会不同老师的多样性特长。
彩蛋:
对于交叉熵损失,,对于真实标签来说,只有一个维度是0,因此很多计算是浪费的,因此可以改写为:。