原文链接:https://arxiv.org/abs/1503.02531
第一次接触这篇文章是在做网络结构的时候,对于神经网络加速,知识蒸馏也算是一种方法,当时连同剪纸等都是网络压缩的内容,觉得这些方法涉及数学概念太多,就没有深入了解,直到最近看了几篇增量学习相关的论文,才发现原来知识蒸馏的思想对增量学习也影响那么大,所以再次遇见就决定读一读这篇文章,因为文中做了图像和语音两个方面的实验,这里就作为阅读论文的一些简单记录。
几乎改善所有的机器学习算法最简单的方法就是在相同的数据集上使用不同的方法,最后将它们的预测值取平均。但是使用上述方法往往是很耗时耗力的,之前已经有工作证明可以将知识集压缩到单个的模型,从而更易去应用,这篇文章也是继续探究相关的模型压缩问题,从而提出了知识蒸馏(Knowledge distillation)。
很多昆虫都有幼虫阶段从而更易于从生长的环境中吸收能力和维生素,然后变成另一种不同的形态——成虫,更易于日后的种群迁移和繁衍。 在机器学习算法中,我们大部分也经历了差不多的过程: 在训练阶段(training stage)我们需要从数量大,且存在高度冗余的数据集中提取特征,但是这样的模型并不便于应用阶段(deployment stage)。
在此之前,我们总是将知识(Knowledge) 这一概念等同于机器学习模型中学习到的所有参数,本身部分机器学习算法,尤其是深度学习就是黑箱模型,这样的类比就会让我们很难去探究该如何改变模型的形式但可以保留同样的知识。这里,我们将 知识(Knowledge) 的概念更加抽象化,就是学习如何从输入向量映射到输出向量。
正常的模型学习到的就是在正确的类别上得到最大的概率,但是不正确的分类上也会得到一些概率尽管有时这些概率很小,但是在这些不正确的分类中,有一些分类的可能性仍然是其他类别的很多倍。但是对这些非正确类别的预测概率也能反应模型的泛化能力,例如,一辆宝马车的图片,只有很小的概率被误识别成垃圾车,但是被识别成垃圾车的概率还是比错误识别成胡萝卜的概率高很多倍。(例如一个车,猫,狗3分类的模型识别一张猫的图片,最后结果是:(cat,99%)
; (dog,0.95%)
;(car,0.05%)
错误类别 dog 上的概率仍是错误类别 car 的概率的19倍 )
这里一个可行的办法是使用大模型生成的模型类别概率作为“soft targets”(使用蒸馏算法以后的概率,相对应的 head targets 就是正常的原始训练数据集)来训练小模型,由于 soft targets 包含了更多的信息熵,所以每个训练样本都提供给小模型更多的信息用来学习,这样小模型就只需要用更少的样本,及更高的学习率去训练了。
仍然是上面的错误分类概率的例子,在 MNIST 数据集上训练的一个大模型基本都能达到 99 % 以上的准确率,假如现在有一个数字 2 的图片输入到大模型中分类,在得到的结果是数字 3 的概率为 10e-6, 是数字 7 的概率为 10e-9,这就表示了相比于 7 ,3更接近于 2,这从侧面也可以表现数据之间的相关性,但是在迁移阶段,这样的概率在交叉熵损失函数(cross-entropy loss function)只有很小的影响,因为它们的概率都基本为0。 所以这里,本文提出了 “distillation” 的概念, 来软化上述的结果。
上面的公式就是蒸馏后的 softmax,其中 T 代表 temperature, 蒸馏的温度。那么 T 有什么作用呢?
假设现在有一个数组 x=[2,7,10] ,当T = 1,即为正常的 Softmax函数 输入上式中可得:
T = 1 ——> y=[0.00032,0.04741,0.95227]
可以理解为上述的一个车,猫,狗3分类网络,输入一张猫的图片,预测为汽车的概率为0.00032, 预测为狗的概率为 0.04741, 预测为猫的概率为 0.95227。
下面再看一下改变 T 的值概率的输出:
T = 5 ——> y=[0.11532, 0.31348, 0.5712]
T = 10 ——> y=[0.20516, 0.33825, 0.45659]
T = 20 ——> y= [0.26484, 0.34006, 0.3951]
下面是在(-10,10)之间随机取多个点然后在 不同的 T 值下绘制的图像。
可以看到当 T = 1 是就是常规的 Softmax,而升温T,对softmax进行蒸馏,函数的图像会变得越来越平滑,这也是文中提高的 soft targets
的 soft
一词来源吧。
假设你是每次都是进行负重登山,虽然过程很辛苦,但是当有一天你取下负重,正常的登山的时候,你就会变得非常轻松,可以比别人登得高登得远。我们知道对于一个复杂网络来说往往能够得到很好的分类效果,错误的概率比正确的概率会小很多很多,但是对于一个小网络来说它是无法学成这个效果的。我们为了去帮助小网络进行学习,就在小网络的softmax加一个T参数,加上这个T参数以后错误分类再经过softmax以后输出会变大,同样的正确分类会变小。这就人为的加大了训练的难度,一旦将T重新设置为1,分类结果会非常的接近于大网络的分类效果。
最后将小模型在 soft targets
上训练得到的交叉熵损失函数,加上在真实带标签数据(hard targets)上训练得到的交叉熵损失函数乘以 1/T^2 加在一起作为最后总的损失函数。这里hard targets 上面乘以一个系数是因为 soft targets 生成过程中蒸馏后的 softmax 求导会有一个 1/T^2 的系数,为了保持两个 Loss 所产生的影响接近一样(各 50%)。
假设这里选取的 T = 10;
Teacher 模型:
( a ) 求Softmax(T=10)的输出,生成 “Soft targets”
Student 模型:
( a ) 对 Softmax(T = 10)的输出与Teacher 模型的Softmax(T = 10)的输出求 Loss1
( b ) 对 Softmax(T = 1)的输出与原始label 求 Loss2
( c ) Loss = Loss1 + (1/T^2)Loss2