计算机视觉研究院专栏
作者:Edison_G
ECCV 2020即将要开始,很多互联网络公司都有技术论文中标,腾讯优图就8篇入选,涵盖了目标跟踪、行人重识别、人脸识别等领域。
今天我们先预告下人脸识别相关的技术,我们会详细分析优图的“分布式知识蒸馏损失”应用在人脸识别领域,去较大程度改善了困难样本的技术,希望持续关注我们“计算机视觉研究院”!
1、背景
今天我们“计算机视觉研究院”先给大家讲讲什么是“知识蒸馏”,下一期我们再来深入解读优图的“分布式知识蒸馏损失改善人脸识别困难样本”技术。
知识蒸馏被广泛的用于模型压缩和迁移学习当中。开山之作应该是”Distilling the Knowledge in a Neural Network“。这篇文章中,作者的动机是找到一种方法,把多个模型的知识提炼给单个模型。
文章的标题是Distilling the Knowledge in a Neural Network,那么说明是神经网络的知识呢?
一般认为模型的参数保留了模型反复训练学习到的记忆或知识,因此最常见的迁移学习的方式就是在一个大的数据集上先做预训练,然后使用预训练得到的参数在一个小的数据集上做微调(两个数据集往往领域不同或者任务不同)。
在这篇论文中,作者认为可以将模型看成是黑盒子,知识可以看成是输入到输出的映射关系。因此,我们可以先训练好一个teacher网络,然后将teacher的网络的输出结果作为student网络的目标,训练student网络,使得student网络的结果
接近
,可以将损失函数写成
。这里CE是交叉熵(Cross Entropy),y是真实标签的onehot编码,q是teacher网络的输出结果,p是student网络的输出结果。
但是直接使用teacher网络的softmax的输出结果 ,可能不大合适。因此,一个网络训练好之后,对于正确的答案会有一个很高的置信度。例如,在MNIST数据中,对于某个5的输入,对于5的预测概率会很高,而对于5类似的数字,例如3和7的预测概率为
和
。这样的话,teacher网络学到数据的相似信息(例如数字5和3,7很类似)很难传达给student网络。由于它们的概率值接近0。因此文章提出了softmax-T,公式如下所示:
这里是student网络学习的对象(soft targets),
是神经网络softmax前的输出logit。如果将T取1,这个公式就是softmax,根据logit输出各个类别的概率。如果T接近于0,则最大的值会越近1,其它值会接近0,近似于onehot编码。如果T越大,则输出的结果的分布越平缓,相当于平滑的一个作用,起到保留相似信息的作用。如果T等于无穷,就是一个均匀分布。
小结:
知识蒸馏,可以将一个网络的知识转移到另一个网络,两个网络可以是同构或者异构。做法是先训练一个teacher网络,然后使用这个teacher网络的输出和数据的真实标签去训练student网络。知识蒸馏,可以用来将网络从大网络转化成一个小网络,并保留接近于大网络的性能;也可以将多个网络的学到的知识转移到一个网络中,使得单个网络的性能接近emsemble的结果。
2、知识蒸馏背景
我先从模型压缩开始!各种模型算法,最终目的都是要为某个应用服务。类似地,在工业应用中,除了要求模型要有好的预测以外,往往还希望它的消耗要足够小。具体来说,我们一般希望部署到应用中的模型使用较少的计算资源(存储空间、计算单元等),产生较低的时延。
在深度学习的背景下,为了达到更好的预测,常常会有两种方案:
1.)使用过参数化的深度神经网络,这类网络学习能力非常强,因此往往加上一定的正则化策略(如dropout);
2. )集成模型(ensemble),将许多弱的模型集成起来,往往可以实现较好的预测。
这两种方案无疑都有较大的「支出」,需要的计算量和计算资源很大,对部署非常不利。这也就是模型压缩的动机:我们希望有一个规模较小的模型,能达到和大模型一样或相当的结果。当然,从头训练一个小模型,从经验上看是很难达到上述效果的,也许我们能先训练一个大而强的模型,然后将其包含的知识转移给小的模型呢?如何做到呢?
3、为什么叫「蒸馏」?
目标是让小模型与原模型的softmax输出的分布充分接近。直接这样做是有问题的:在一般的softmax函数中,自然指数先拉大logits之间的差距,然后作归一化,最终得到的分布是一个arg max的近似,其输出是一个接近onehot的向量,其中一个值很大,其他的都很小。这种情况下,这种知识的体现是非常有限的。相较类似onehot这样的硬性输出,我们更希望输出更「软」一些。
一种方法是直接比较logits来避免这个问题。具体地,对于每一条数据,记原模型产生的某个logits是 ,小模型产生的logits是
,我们需要最小化:
文献[Hinton et al., Distilling the Knowledge in a Neural Network, 2015]提出了更通用的一种做法。考虑一个广义的softmax函数:
其中是温度,这是从统计力学中的玻尔兹曼分布中借用的概念。容易证明,当温度
趋向于0时,softmax输出将收敛为一个onehot向量;温度
趋向于无穷时,softmax的输出则更「软」。
因此,在训练小模型的时候,可以使用较高的使得softmax产生的分布足够软,这时让小模型的softmax输出近似原模型;在训练结束以后再使用正常的温度
来预测。具体地,在训练时我们需要最小化两个分布的交叉熵(Cross-entropy),记小模型利用上面公式产生的分布是
,原模型产生的分布是
,则我们需要最小化:
在化学中,蒸馏是一个有效的分离沸点不同的组分的方法,大致步骤是先升温使低沸点的组分汽化,然后降温冷凝,达到分离出目标物质的目的。在前面提到的这个过程中,我们先让温度升高,然后在测试阶段恢复「低温」,从而将原模型中的知识提取出来,因此将其称为是蒸馏,实在是妙。
当然,如果转移时使用的是有标签的数据,那么也可以将标签与新模型softmax分布的交叉熵加入到损失函数中去。
这里需要将上面公式乘上一个,这是为了让损失函数的两项的梯度大致在一个数量级上,实验表明这将大大改善新模型的表现(考虑到加入了更多的监督信号)。
4、与直接优化logits差异相比
由上面多个公式,对于交叉熵损失来说,其对于小模型的某个logit的梯度是:
由于与
是等价无穷小(
时),易知,当
充分大时,有:
假设所有logits对每个样本都是零均值化的,即
则有:
所以,如果:1)非常大;2)logits对所有样本都是零均值化的,则知识蒸馏和最小化logits的平方差是等价的(因为梯度大致是同一个形式)。
实验表明,温度不能取太大,而应该使用某个适中的值,这表明忽略极负的logits对小模型的表现很有帮助(较低的温度产生的分布比较「硬」,倾向于忽略logits中极小的负值)。
5、实验与结论
Hinton等人做了三组实验,其中两组都验证了知识蒸馏方法的有效性。在MNIST数据集上的实验表明,即便有部分类别的样本缺失,小模型也可以表现得很不错,只需要修改相应的偏置项,就可以与原模型表现相当。
在语音任务的实验也表明,蒸馏得到的模型比从头训练的模型捕捉了更多数据集中的有效信息,表现仅比集成模型低了0.3个百分点。总体来说知识蒸馏是一个简单而有效的模型压缩/训练方法。这大体上是因为原模型的softmax提供了比onehot标签更多的监督信号[Kevin Clark et al., BAM! Born-Again Multi-Task Networks for Natural Language Understanding]。
知识蒸馏在后续也有很多延伸工作。在NLP方面比较有名的有Yoon Kim等人的Sequence-Level Knowledge Distillation 等。总的来说,对一些比较臃肿、不便部署的模型,可以将其「知识」转移到小的模型上。比如,在机器翻译中,一般的模型需要有较大的容量(capacity)才可能获得较好的结果;现在非常流行的BERT及其变种,规模都非常大;更不用提,一些情形下我们需要将这些本身就很大的深度模型集成为一个ensemble,这时候,可以用知识蒸馏压缩出一个较小的、「便宜」的模型。
另外,在多任务的情境下,使用一般的策略训练一个多任务模型,可能达不到比单任务更好的效果,文献[Kevin Clark et al., BAM! Born-Again Multi-Task Networks for Natural Language Understanding]探索了使用知识蒸馏,利用单任务的模型来指导训练多任务模型的方法,很值得参考。
✄-------------------------------------
小一期我们就开始详细分析“分布式知识蒸馏损失改善人脸识别困难样本”,请持续关注我们的推送!
我们开创一段时间的“计算机视觉协会”知识星球,也得到很多同学的认可,我们定时会推送实践型内容与大家分享,在星球里的同学可以随时提问,随时提需求,我们都会及时给予回复及给出对应的答复。
如果想加入我们“计算机视觉研究院”,请扫二维码加入我们。我们会按照你的需求将你拉入对应的学习群!
计算机视觉研究院主要涉及深度学习领域,主要致力于人脸检测、人脸识别,多目标检测、目标跟踪、图像分割等研究方向。研究院接下来会不断分享最新的论文算法新框架,我们这次改革不同点就是,我们要着重”研究“。之后我们会针对相应领域分享实践过程,让大家真正体会摆脱理论的真实场景,培养爱动手编程爱动脑思考的习惯!
扫码关注我们
公众号 : 计算机视觉研究院