给面试官讲知识蒸馏

时间:2024-06-02 13:35:30

知识蒸馏

目的:
模型网络复杂度比较高时,不利于上线,为了使得简单的模型能够有一个较高的复杂度,可以预先训练一个复杂度较高的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的公式,softmaxsoftmax_t(z)=exp(z/t)exp(z/t)t(z)=\frac{exp(z/t)}{\sum exp(z/t)}

取t=5时,再计算下得分转换的概率,为[0.46, 0.32, 0.22],可以看出概率值被平滑了,取t=10时,结果为[0.4, 0.33, 0.27],结果更平滑。从物理意义去解释就是分类器认为这是“猫”,并且还有点像“狗”。

从而,引出一些概念:

t被称为蒸馏温度,t-softmax过程被称为知识蒸馏,得出来的“有点像狗”这一信息被称为暗知识

step3:教师教学生

构建一个网络结构相对简单的分类器,最后一层的得分记作output,记老师蒸馏后的结果为knowledge,真实标签为label。

定义新的损失函数为:Loss=(αt2)KL(logLoss=(\alpha t^2)KL(log_softmax(output/t),knowledge)+(1α)crossEntropy(output,y)softmax(output/t), knowledge)+(1-\alpha)crossEntropy(output, y)

下图很清晰的描述一个知识蒸馏的全过程。(图片来源于B站视频)
给面试官讲知识蒸馏
注:
知识蒸馏中,还有很多变种方法,比如multible-tearchers,用多个teachers的加权蒸馏结果教学生,这样做会淡化每个teacher的特长;又或者每次挑选不同的teacher去教,这样学生可以学会不同老师的多样性特长。

彩蛋:
对于交叉熵损失,Loss=i=1myilog(yi)Loss=-\sum_{i=1}^my_ilog(y_i^{'}),对于真实标签yiy_i来说,只有一个维度是0,因此很多计算是浪费的,因此可以改写为:Loss=log(yyi)Loss=-log(y_{y_i}^{'})