知识蒸馏
论文地址:https://arxiv.org/abs/1503.02531
问题:我们的一些网络和模型,都是用海量的数据和算力训练出来的,这些模型都很大很臃肿,而最终的部署应用,一般都是部署在终端设备上,手机、电脑、一些边缘设备等。所以我们需要把大模型压缩成一个小模型,把网络轻量化。
所谓的知识蒸馏就是把大的网络或模型作为教师网络,然后训练一个小的学生网络。教师网络把自己靠着海量数据和算力训练学到的知识教给学生,使得学生网络这个轻量级的网络可以达到类似教师网络的性能。
soft targets
我们先介绍两种标签:hard targets 和 soft targets
比如一个手写数字2,我们把它标记为2,也就是说这个数字是2的概率为1,是其他数字的概率为0,我们把这种标签就称作hard targets。
那么soft targets呢,它会标记该数字是2的概率为0.7,是7的概率是0.3,是1的概率为0.1。会给出这个数字的所有类别判断结果,这就是soft targets。
显然,soft targets比hard targets包含了更多的信息,它不光知道这个数字是2,还知道它和哪个相似,相似程度有多大。一般我们标记的数据集都是hard targets,我们把数据输入一个网络,训练得到的结果是soft targets,那么既然soft targets包含更多的信息,我们如果用一个大网络得到了soft targets拿去给一个小网络学习,会不会效果更好呢?
但是呢,在这之前,还要进行一个操作,我们用大的网络(教师网络)训练出来的soft targets还是不够“ soft ”,我们还想把这些差别更明显的映射出来,这就要引入一个蒸馏温度
蒸馏温度T
我们经过网络得到的soft targets ,有的网络结果还是不够soft,所以想让它变的更平滑。
那么做过分类任务的同学都知道softmax函数,它将多个神经元的输出映射到(0,1)区间之内,可以看作预测的概率。softmax函数如下:
我们设置蒸馏温度为T,把公式改成这样:
这个公式里面,如果T=1的话,那就等同于softmax,如果T等于别的数的时候,可以将概率变得更加”soft“
注意,T=100的时候,这个线几乎变水平了。也就是各个类别概率基本接近了。
知识蒸馏过程
这个蒸馏过程如图所示。首先我们有一个训练好的教师网络,还有一个没训练(或者预训练)的学生网络。我们把数据喂给教师网络和学生网络,将他们的结果用一个带蒸馏温度T=t的softmax输出,然后把他们俩的结果做一个损失函数,也就是说我们希望学生网络的结果和教师网络接近。同时,我们还把学生网络的输出再设置一个蒸馏温度T=1,也就是不做处理,让这个结果与标记的hard targets做一个损失函数,这里相当于正常训练,希望学生网络从hard targets里面学到知识,
那么最终的两个loss值,我们分别乘上参数,加到一起。我们的目标就是使得最终的这个loss最小,也就是使得那两个loss都最小。训练过程还是我们常用的反向传播,梯度下降等方法。
实验结果可以看原论文。
总结
知识蒸馏原理并不不复杂,是一个很好的压缩模型的方法,训练出来的学生网络有以下优点: 1)性能与教师网络差不多,规模比教师网络小 2)由于用教师网络训练学生网络,所以可以出现零样本学习,就比如学生网络没见过猫,数据集里面没有猫,但是教师网络认识猫,那么训练出来的学生网络输入猫的时候,而也可以被识别。 3)数据量比较小的时候,我们的训练容易出现过拟合。但是我们使用soft targets训练网络可以很好的解决这种过拟合。
|