Distilling the Knowledge in a Neural Network
神经网络压缩
ensemble太笨重,实际应用中难以部署。提出了压缩成一个模型的方法。一种新的ensemble,包含一个大模型和很多个小的定制化模型。定制化模型可以同时训练。
由昆虫的例子我们可以这样理解神经网络:一个复杂的网络结构模型是若干个单独模型组成的集合,或者是一些很强的约束条件下(比如dropout率很高)训练得到的一个很大的网络模型。一旦复杂网络模型训练完成,我们便可以用另一种训练方法:“蒸馏”,把我们需要配置在应用端的缩小模型从复杂模型中提取出来。知识迁移
对于知识,有一种更加抽象的看法:从输入向量到输出向量的映射(学习而得)
做复杂网络的训练时,目标是将正确答案的平均对数概率最大化,但这引入了一个副作用(这里是有用的side-effect):这种网络也为所有错误答案分配了概率,即使这些概率非常小,其中一些也会比其他的大很多。
不正确答案的相对概率告诉我们这个大模型的泛化能力。(因为告诉了我们更多的知识)
我们将复杂模型转化为小模型时需要注意保留模型的泛化能力,一种方法是利用由复杂模型产生的分类概率作为“软目标”来训练小模型。在转化阶段,我们可以用同样的训练集或者是另外的“转化”训练集。当复杂模型是由简单模型复合而成时,我们可以用各自的概率分布的代数或者几何平均数作为“软目标”。当“软目标”的熵值较高时,相对“硬目标”,它每次训练可以提供更多的信息和更小的梯度方差,因此小模型可以用更少的训练数据和更高的学习率进行训练。
像MNIST这种任务,复杂模型可以给出很完美的结果,大部分信息分布在小概率事件的比值中。比如一张2的图片被认为是3的概率为0.000001,被认为是7的概率是0.000000001。另外一张可能完全相反。这类信息定义了数据之间的结构相似性,但是对CE cost function没有影响,因为太小了。Caruana用logits(softmax层的输入)而不是softmax层的输出作为学习小模型的目标。他们目标是是的复杂模型和小模型分别得到的logits的平方差最小。而我们的“蒸馏法”:第一步,提升softmax表达式中的调节参数T,使得复杂模型产生一个合适的“软目标” ; 第二步,采用同样的T来训练小模型,使得它产生相匹配的“软目标”。匹配logits其实是一种蒸馏的特例。
“转化”训练集可以由未打标签的数据组成,也可以用原训练集。我们发现使用原训练集效果很好,特别是我们在目标函数中加了一项之后。这一项的目的是小模型在预测实际目标的同时尽量匹配“软目标”。要注意的是,小模型并不能完全无误的匹配“软目标”,而正确结果的犯错方向是有帮助的。
softmax层的公式中
T就是调节参数,一般设为1。T越大,分类的概率分布越“软” 。(1,0,0)是硬的,而(0.7,0.2,0.1)是软的。
“蒸馏”最简单的形式就是:以从复杂模型得到的“软目标”为目标(这时T比较大),用“转化”训练集训练小模型。训练小模型时T不变仍然较大,训练完之后T改为1。
当已知所有或部分传输集的正确标签时,此方法可能非常显著地通过训练蒸馏模型以产生正确的标签来改进。一种方法是使用正确的标签来修改软目标,但我们发现更好的方法就是简单地使用两个不同目标函数的加权平均值。第一个目标函数是软目标交叉熵,并使用相同的高温计算该交叉熵。第二个目标函数是具有正确标签的交叉熵。这是计算的在蒸馏模型的softmax中使用完全相同的logits,但温度为1.我们发现通常通过在第二个目标函数上使用可忽略不计的较低重量来获得最佳结果。由于软目标产生的梯度的大小为1 / T2将它们乘以T2是很重要的使用硬目标和软目标时。这确保了如果使用温度改变,硬和软目标的相对贡献大致保持不变。