Hinton大牛的文章,关于如何得到一个又小又好的网络的。文章链接《Distilling the Knowledge in a Neural Network》
—————————— 背景介绍 ——————————
大家都想要得到一个又好又快的模型,但是实际情况往往是模型越小则性能越差。文献[1]中提出了一种策略:大模型学习到的知识可以通过“提取”的方法转移到一个小模型上 。
所以,本文的宏观策略就是先训练一个性能很好的大模型,然后再据此学习得到一个性能不差的小模型。
—————————— 方法介绍 ——————————
因为整体方法比较简单,涉及到的推导和证明也比较少,所以这里直接给出方法步骤:
(1)训练一个大模型
使用普通的SoftmaxWithLoss训练一个性能好但比较复杂的网络,记作A;
(PS. 该方法只适用于softmax分类)
(2)获取soft target label
将A中的softmax替换为下面的新的soft_softmax, 然后将训练集跑一遍,并将每张训练图片的网络输出结果保存下来。
(1)式中T=1时,退化成传统的softmax,T无穷大时,结果趋近于1/C,即所有类别上的概率趋近于相等。T>1时,我们就能获得soft target label。
这里解释两点:
——为什么称之为soft target label?
举一个栗子,假如我们分三类,然后网络最后的输出是[1.0 2.0 3.0],我们可以很容易的计算出,传统的softmax(即T=1)对此进行处理后得到的概率为[0.09 0.24 0.67],而当T=4的时候,得到的概率则为[0.25 0.33 0.42]。
可以看出,当T变大的时候输出的概率分布变得平缓了,这就称之为soft。
PS.不知道怎么算概率的,可以看下我的另外一篇博客caffe层解读系列-softmax_loss
——为什么要使用 soft target label?
通常我们使用softmax进行分类的时候,我们的label都是one shot label,比如我们分三类:猫、虎和猪,那么一张猫的图片它的label就是[1 0 0]。这种标注方式意味着每一类之间都是独立的,完全没有任何联系。但是事实上,猫和虎的相似度应该高于猫和猪的相似度,这种丰富的结构信息,one shot label(hard target)描述不了。此外,正因为one shot label的hard,导致了我们学习得到的概率分布也相对hard。显然对于一张猫的图片强行学习一个[1 0 0]的分布,其难度要比学一个[0.65 0.3 0.05]的分布大得多。
(3)训练一个小网络
重新创建一个小的网络,该网络最后有两个loss,一个是hard loss,即传统的softmaxloss,使用one shot label;另外一个是soft loss,即T>1的softmaxloss,使用我们第二步保存下来的soft target label。
整体的loss如下式:
\(L=\alpha L^{soft}+(1-\alpha)L^{hard}\)
其中
\(L^{soft} = -\sum_{c=1}^{C}y_c^{soft}\log\frac{e^{\frac{x_c}{T}}}{\sum_{c=1}^{C}e^{\frac{x_c}{T}}}\)
\(y_c^{soft}\) 为第二步输出的soft label
PS.由于soft项的残差大致乘以了\(\frac{1}{T^2}\),因此和hard结合时,最好将soft项的残差都放大\(T^2\)倍以此来平衡二者。
—————————— 参考文献 ——————————
《Buciluǎ C, Caruana R, Niculescu-Mizil A. Model compression[C]//Proceedings of the 12th ACM SIGKDD international conference on Knowledge discovery and data mining. ACM, 2006: 535-541.》https://www.cs.cornell.edu/~caruana/compression.kdd06.pdf