Distilling the Knowledge in a Neural Network
神经网络中的知识蒸馏。

一、Abstract
(1)面临的现状:
    传统的提高机器学习效果的简单方法一般是在相同的数据上使用不同的模型,最后平均他们的预测结果,这也就是集成模型。但是集成模型十分的笨重,会消耗很多计算资源,并且不适合部署在用户端,特别是当单个网络特别大的时候。

(2)文章的工作
    介绍了知识蒸馏,并使用知识蒸馏在MNIST数据集上,取得了令人惊讶的成就,并且将知识蒸馏运用在语音识别模型中,也取得的很好的效果。最后讲解了专才模型集成(这一部分和知识蒸馏关系不大)。

二、Introduction
(1)类比
    许多昆虫都有幼虫和成虫两个阶段,幼虫阶段对提取能量和营养进行了优化,而成虫阶段对迁徙和繁殖进行了优化。同样,在机器学习中,我们通常可以分为训练模型和部署模型。
    在训练模型中,我们通常需要用它来从非常巨大,冗余的数据中提取结构。它可以使用相当巨大的计算资源,并且我们不需要实时对他进行操作。如果这种笨重的大模型可以更容易提取结构(学习知识),我们就更乐意去采用。这种笨重的模型可以是分离训练后模型的集成,也可以是单个十分复杂的神经网络。
    在部署阶段,对用户的延迟和计算资源有更严格的要求。

(2)方法
    我们可以用一种叫做“蒸馏”的方法,将从笨重的模型中学习到的“知识”转移到更小的模型中,以便这种小模型可以更适合部署。

(3)需要解决的问题
    从概念上有很多问题可以阻止这种非常有期待的目标,
    我们很难用在训练模型中获得的学习参数作为知识。因为如果使用这样的知识,我们很难让学生模型去学习教师模型的知识,毕竟他们的网络结构完全不一样。一个更加抽象的关于知识的解释是,我们可以从任何特定的实例化中解放出来,它是一个从输入向量到输出向量的学习映射。
    传统的区分大量类的繁琐模型的方式,通常是用交叉熵损失函数。但是通常这样会产生一些副产品,这些副产品给错误的类别也为分配一些概率,即使有些很小,也比某些概率大很多,这些产生的错误的概率之间的关系告诉我们复杂模型是怎么泛化的。举个例子,在对于一张宝马图片的识别中,即使把他识别为垃圾车的概率很小,但是这也比把它识别为胡萝卜的概率高很多。

(4)可行的解决途径
    通常来说,训练的目标函数要尽可能的接近实际应用的性能。通常模型能够在训练中取得很好的优化效果,但我们更需要它有比较好的泛化能力。但是这些需要用来进行泛化的正确信息是很难获取,也是很难使用的。当我们在把大模型压缩成小模型的时候,我们可以让小模型和大模型进行一样的泛化。如果繁琐的模型泛化得很好,例如,它是不同模型的大型集合的平均值,那么以相同方式训练泛化的小模型在测试数据上的表现通常会比在用于训练集合的相同训练集上以正常方式训练的小模型好得多。综合来说,这一段是指,我们如果想要获得更好的泛化性能,我们就要定义和量化“知识”,然后让学生网络去学习从教师网络中获得的知识,进行泛化。

(5)如何进行知识蒸馏
    一种明显的迁移大模型的泛化能力到小模型的办法是使用繁琐模型训练中获得的“soft targets”的分类概率。用这样的概率和相同的训练集或者一个分离的转移训练集去训练学生网络。大网络可以是很多小模型的集成,我们可以用算术平均数或者几何平均数去描述“soft targets”。当“soft targets”具有很高的熵时(也就是各个概率差异不会很大,不会有数量级的差距,比如一个为0.5,一个为10^-10这样),它相对于“hard targets”能够提供更多的信息,同时会使得每一个类别的训练梯度不会过于分散,所以小模型可以使用更少的数据进行学习,同时可以提高学习率。

    举个例子来说,对于MNIST数据集,繁琐的模型通常会给予正确答案很高的置信度,但是更多的信息量却蕴含在那些概率很小的“soft targets”里。如果“2”被识别为“3”的概率为1e-6,被识别为"7"的概率为1e-7。这是有价值的信息,它定义了数据上丰富的相似性结构。(也就是说它说明了哪些2像3,哪些2像7)。但是在交叉熵损失函数中,它在训练阶段很难有影响,因为他们的概率趋近于0了,在一些前人的研究中,他们采用的其他的方法作为损失函数(这里之后会说,使用的方式是知识蒸馏的一个特例),通常来说,我们会加入温度这一个变量到知识蒸馏中。我们在用小模型拟合大模型的时候,使用相同的蒸馏温度。

(6)使用知识蒸馏的另一些好处
    这一段主要是说,使用知识蒸馏后的模型对一些未标注模型也可以通过调整模型偏置项等方法,使得最后也有很良好的识别结果。也就是说使用知识蒸馏,我们可以进行一些零样本学习。

三、distilling
在这里插入图片描述
    Zi表示各个类别的分数(是在最后一层线性分类层后,接一个soft,target得到的分数),T是蒸馏温度,T=1的时候就等于softmax,T>1的时候就完成了蒸馏。
在这里插入图片描述
    学生模型要和教师模型在训练阶段有同样的蒸馏温度T,在预测阶段不需要加入蒸馏我呢度,我们在训练中既要有soft也要有hard target,最后我们的损失可以是hard target 和 soft target加权的结果。具体的蒸馏过程见上图,论文这一段就是在描述这一张图。

(1)直接拟合均方误差是知识蒸馏的一个特例。
    假设,我们直接让学生网络训练后的logit和教师网络训练后的logit做均方误差,我们可以通过推论得知,这是知识蒸馏的一个特例
在这里插入图片描述
    qi是学生网络的后验概率,pi是教师网络的后验概率。
在这里插入图片描述
    当温度足够大的时候,我们使用泰勒公式进行展开。
在这里插入图片描述
    假设对于不同样本, logit的均值为0。

    所以当logit均值为,且T足够的大的时候,知识蒸馏就等价于最小化 1/2(zi − vi)^2。
从以上我们还可以看出,当我们的蒸馏温度比较高的时候,我们等于是拉平了各个样本的差异性,使得很小的logit也能通过蒸馏获得很高的softmax,这样就会产生”噪声“。同理,如果我们的蒸馏温度比较低,较小的logit所产生的softmax会趋近于0,没有权重,对后续的优化很难产生积极的作用。如何调整温度参数的大小,是一个经验上的问题。

四、Preliminary experiments on MNIST
(1)初步训练
    这一部分主要是讲了在MNIST数据集上使用知识蒸馏进行了初步的实验。
    首先,总共使用60000个训练数据进行训练。其次,对于训练网络,采用一个单独的神经网络,其中有两个隐藏层,每个隐藏层有1200个神经元,同时这个网络使用了dropout等方法,使得网络进行了强正则化(也就是说模型相对很复杂,dropout可以有效防止过拟合)。同时对输入图像进行了处理,进行了一些上下值抖动等数据增强。
    对于学生网络,其中有两个隐藏层,每一层有800个神经元,没有使用正则化方法。
    从结果上来说,教师网络犯了67个错误,而学生网络犯了146个错误。
    如果我们采用上述的,使用教师网络的soft target进行训练,且把蒸馏温度设定成20,则学校网络犯的错误降低为74个。
    这就证明知识蒸馏是有效的,也就是说,知识蒸馏将知识传递给了学生网络,同时,也能将平移等学生网络不可能学习到的信息进行了传递(学生网络中的图片没有进行平移等数据增强),这也就是上述所说的零样本学习。

(2)进一步测试
    这里主要是说明了,如果学生网络每一个隐藏层的神经元大于300,则蒸馏温度最好要>8。如果每一个隐藏层的神经元为30,则蒸馏温度最好是2.5-4。也就是说明了温度的选取很重要。

(3)零样本学习的测试
    在训练学生网络的时候,我们将训练数据中的”3“这一个数字的所有数据全部抹除。对于学生网络来说这是一个完全没有见过的数据。在最后的测试结果中,学生网络一共错误了206个数据,其中133个是”3“这个数据,但是在测试数据中,一共有1010个”3“。这可以说明效果还是不错的。
    这其中大多数错误造成的原因是因为,”3“这一项的偏置项太小导致的,当调高偏置项3.5时,结果是犯了109个错误,其中只有14个是“3”。这样的结果已经完全达到的要求,这也就是说如果调整合适的偏置项,蒸馏后的模型对于“3”这个数据的正确率高达98.6,即使它在训练阶段从来没有见过“3”长什么样子。
    如果训练数据中只有“7”和“8”,模型的正确率为47.3,如果减少“7”,“8”的偏置项7.8的大小,测试的正确率为86.8。
    综上所述,如果没有这个样本,那就提高这个样本的偏置项的大小,如果这个只有或者这个样本含量很高,那就降低这个样本的偏置项的大小,这样能取得更好的结果。

五、Experiments on speech recognition
    这一部分主要是讲了,将知识蒸馏运用在语音识别里,暂时不看。

六、 Training ensembles of specialists on very big datasets,
Soft Targets as Regularizers,
Relationship to Mixtures of Experts

    这一部分主要是讲了,将知识蒸馏运用在专才识别里,暂时不看。

七、Discussion
    这里是主要讲了知识蒸馏的未来发展趋势。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐