深度学习方法(十五):知识蒸馏(Distilling the Knowledge in a Neural Network),在线蒸馏

版权声明:本文为博主原创文章,欢迎转载分享,请注明本文出自Bin的专栏:http://blog.csdn.net/xbinworld https://blog.csdn.net/xbinworld/article/details/83063726

Distilling the Knowledge in a Neural Network

这篇介绍一下Hinton大神在15年做的一个黑科技技术,Hinton在一些报告中称之为Dark Knowledge,技术上一般叫做知识蒸馏(Knowledge Distillation)。核心思想是通过迁移知识,从而通过训练好的大模型得到更加适合推理的小模型。这个概念最早在06年的Paper: Model Compression中, Caruana提出一种将大模型学习到的函数压缩进更小更快的模型,而获得可以匹敌大模型结果的方法。

重点idea就是提出用soft target来辅助hard target一起训练,而soft target来自于大模型的预测输出。这里有人会问,明明true label(hard target)是完全正确的,为什么还要soft target呢?

hard target 包含的信息量(信息熵)很低,soft target包含的信息量大,拥有不同类之间关系的信息(比如同时分类驴和马的时候,尽管某张图片是马,但是soft target就不会像hard target 那样只有马的index处的值为1,其余为0,而是在驴的部分也会有概率。)[5]

这样的好处是,这个图像可能更像驴,而不会去像汽车或者狗之类的,而这样的soft信息存在于概率中,以及label之间的高低相似性都存在于soft target中。但是如果soft targe是像这样的信息[0.98 0.01 0.01],就意义不大了,所以需要在softmax中增加温度参数T(这个设置在最终训练完之后的推理中是不需要的)

q i = e x p ( z i / T ) Σ j e x p ( z j / T ) q_i=\frac{exp(z_i/T)}{\Sigma_jexp(z_j/T)}

Loss是两者的结合,Hinton认为,最好的训练目标函数就是这样,并且第一个目标函数的权重要大一些。
L = α L ( s o f t ) + ( 1 α ) L ( h a r d ) L = \alpha L^{(soft)}+(1-\alpha)L^{(hard)}

算法示意图如下[5]:
在这里插入图片描述

1、训练大模型:先用hard target,也就是正常的label训练大模型。
2、计算soft target:利用训练好的大模型来计算soft target。也就是大模型“软化后”再经过softmax的output。
3、训练小模型,在小模型的基础上再加一个额外的soft target的loss function,通过lambda来调节两个loss functions的比重。
4、预测时,将训练好的小模型按常规方式(右图)使用。

在线蒸馏 codistillation

在分布式训练任务下,提出了一种替代标准SGD训练NN模型的方法codistillation,是一种非同步的算法,事实上有很多个Wieght的副本在独立训练,他可以有效“解决”机器增加但线性度不增加的问题,实验中还有一些数据表面可以比标准的SGD收敛更快。

也是distill的思想,但是因为是重头训练,所以什么是teacher model呢?作者提出用所有模型的预测平均作为teacher model,然后作为soft target来训练每一个模型。

在这篇论文中,使用codistillation来指代执行的distillation:

  • 所有模型使用相同的架构;
  • 使用相同的数据集来训练所有模型;
  • 任何模型完全收敛之前使用训练期间的distillation loss。

算法原理如下:
在这里插入图片描述

在这里插入图片描述
distillation loss作者提到了可以是平方距离,或者是KL-divergence,但是作者采用的是cross entropy。

分为两个阶段,第一个是独立的SGD更新阶段,这个阶段是不需要去同步的,因此非常高效。第二阶段是codistill阶段,就是用每一个model的平均预测结果来作为soft target训练每一个独立的model,有趣的是作者说这样会训练出来一堆不同的model(只要求他们表现接近,并不能强求他们的Weight一样),但是这些model在loss上没什么区别。、

在这里插入图片描述

作者也表明,实际上可以和标准的同步SGD来结合,也就是分组——组内用同步SGD训练model副本,然后组间用codistill来训练(只交换预测结果,非常小)。另外,作者表示虽然他们在仿真实现上是传输了所有的模型副本到所有node上,为了得到soft预测结果,但实际上可以只传输预测结果即可(我猜可能是框架支持不方便?)

实验结果:

在这里插入图片描述

重点看下Imagenet,16K Batchsize用两路训练比用一路训练收敛快。

参考资料

[1] Hinton胶囊网络后最新研究:用“在线蒸馏”训练大规模分布式神经网络
[2] G.Hinton Dark Knowledge
[3] 2006, Model Compression
[4] 如何让你的深度神经网络跑得更快
[5] 如何理解soft target这一做法?

猜你喜欢

转载自blog.csdn.net/xbinworld/article/details/83063726
今日推荐