abstract
我们介绍啦一个新的技术用来从一个预训练的深度神经网络迁移知识到另一个DNN。考虑到DNN通过一层一层的网络实现从输入空间到输出空间到匹配,我们定义蒸馏的知识以流的形式在层之间传播,这个流是通过计算两层之间的特征的内积得到的。当我们比较学生DNN和原始的具有和学生DNN一样大小但没有老师指导训练的网络时,以流的形式迁移知识的方法显现出三个重要的现象:
- 学习过蒸馏的知识点学生模型训练比原始模型快好多。
- 学生模型的表现超过了原始的DNN模型。
- 学生模型能从训练来解决不同任务的老师模型学习知识,并且表现会超过从0开始训练的原始DNNm模型。
Introduction
在过去的几年里,不同的深度学习模型在从计算机视觉到自然语言处理等不同任务上都有着优越的表现。最近有一些在知识迁移技术方面的研究。Hinton首先通过引入老师的软输出,提出了在老师-学生框架上的知识蒸馏的概念。虽然KD训练能实现在不同的数据集上的准确率的提升,这个方法仍然有点局限性,比如说在优化非常深的网络时会比较困难。为了提高KD在训练比较深的网络时的表现,Remero设计了一个hint-based training方法,使用预训练的老师的中间层hint layer和学生的被指导的层guided layer。这方法使得拥有较少参数的深的学生网络的准确率同原始的宽的老师模型相比更好。
知识蒸馏的表现对被蒸馏的知识的定义很敏感。蒸馏的知识能够从预训练好的dnn中的不同的特征中取出。考虑到一个真正的老师会教学生解决问题的流程,我们将高层蒸馏知识定义为解决问题所需要的流。因为一个DNN使用了很多连续的层来实现从输入空间到输出空间的映射,这个解决问题的流可以被定义为来自两层的特征之间的关系。
Gatys使用Gramian矩阵来表示输入图像的texture信息。因为grammian矩阵是通过计算特征矩阵的内积产生的,它包含了特征之间的方向性,这个方向性就可以被看作是texture信息。同Gatys相似的,我们用包含了两层的特征的内积的gramian矩阵来表示解决问题的流。gatys用的Gramian矩阵和我们的区别在于我们计算的是层间的矩阵,而gatys计算的是层内的特征的内积。图1展示了我们提出的迁移知识的方法的概念图。从两个层中提取出来的特征图被用来产生解决步骤流的矩阵(FPS flow of solution precedure)。学生DNN模型被训练来使他的FSP矩阵尽量和老师DNN的相似。
对很多任务来说,蒸馏知识都是一个很有用的技巧。在这个研究中,我们用三个任务验证了已经提出的蒸馏方法的有效性。第一个是快速优化。一个理解解决问题的流的DNN能具有一个比较好的对应主要问题的初始权重并且比普通的DNN学习更快。快速优化是一个非常有用的技巧。研究员们不仅通过使用厉害的学习率调整技巧来实现快速优化,也通过找一个比较好的初始权重。我们的方法是基于初始权重方法的,所以我们只和别的初始权重方法进行比较。我们同其他技巧比较训练迭代次数和表现。
第二个任务是提高小网络的表现,小网络指的是具有更少的参数的浅层网络。因为小网络会从老师模型中学习蒸馏的知识,所以它会比没有老师帮助训练的学生模型的效果更好,我们比较原始模型的表现和使用了不同知识蒸馏方法训练的网络的表现。
第三个任务是迁移学习。一个新的任务可能只提供一个小的数据集,迁移学习能够利用在巨大数据集上训练的又大又深的DNN模型的优点。因为我们提出的方法能够将蒸馏的知识迁移到小的DNN模型上,这小的网络会和大的网络具有相似的表现。
我们的论文有以下几点贡献:
- 我们提出了一个新的知识蒸馏方法。
- 这个方法对快速优化比较有用
- 使用蒸馏方法来确定小模型的初始权重可以提高小模型表现
- 即使学生DNN是训练于不同的任务,这个方法也能提高它的表现。
Related Work
Knowledge Transfer 具有很多参数的深度网络通常在计算机视觉任务上表现很好。人们会选择提升框架的深度来提高模型的表现。深度学习最初开始的时候,Alexnet只有五个卷积层,然而最近的比较出名的网络比如GoogleNet有22个卷积层,而ResNet则有152个卷积层。
一个有很多参数的深度网络在训练和测试时都需要繁重的参数。这些深度网络和在日常生活应用中使用的是不同的,因为一个普通的电脑不能处理这些工作,更别说移动设备了。因此,很多研究者都在尽力使神经网络在保证表现的情况下变得更小。一个典型的方法是从训练好的深度网络中蒸馏知识,并把知识迁移到不需要繁重的存储和计算的小网络。最近,Hinton基于dark knowledge这个概念的模型压缩方法,它使用了软化版本的老师模型的最终输出来教授小的学生网络知识。使用了这个步骤后,一个小的网络能学会压缩版本的大网络如何学习给定的任务。Romero不仅使用最终输出也使用了中间隐藏层的值来训练学生问那个落,并且发现使用中间层可以提升更深更窄的学生网络的表现。Net2Net也使用一个老师-学生网络,根据老师网络的参数来初始化学生网络的参数。
Fast Optimization 一个深度卷积神经网络需要用一段比较长的时间才能达到它的全局最优或者比较好的局部最优。在小的数据集比如MNIST或者CIFAR10上训练是比较简单的。在用了大数据集的情况,比如ILSVRC数据集,然而,一个大的网络需要用几周的时间来训练。因此快速优化最近成为了一个重要的研究课题。这里有几个不同的方法来快速优化,比如找到好的初始权重或者用不同的技巧(而非单纯的SGD)来寻找最优点。
在之前,使用0均值单位方差的高斯噪声初始化权重是非常流行的,另外一些初始化技巧比如Xavier初始化也是广泛使用的。然而,这些简单的初始化对在非常深的网络上训练并不能起到什么作用。因此,一些基于数学的新的方法出现了。使用好的初始化,如果训练在一个合适的位置开始,那么参数就能很快地到达全局最优。
优化算法也随着深度学习的发展一起进步。传统地,SGD算法通常作为baseline使用,然而,使用SGD会很难从马鞍坡中爬出来。出于这个问题,有更多的别的算法被提出,这些算法能够帮助走出马鞍层并迅速到达全局最优。
Transfer Learning 迁移学习是一个简单的修正已经训练过的网络的参数以使它适应新的任务的方法。起到特征提取作用的input-side层是从已经训练好的网络中拷贝过来的,然后保持不动或者进行微调,而针对新任务的分类器则随机初始化然后以较慢的学习率进行训练。微调的效果通常比从0开始训练号,因为预训练的模型已经有了很多的信息。比如说,很多研究员最近使用ILSVRC数据集上的预训练的模型来从图片中提取特征,然后进行微调来提升在最终任务上的准确率。很多其他的比如识别和分割的任务也适用ImageNet预训练模型作为初始值,因为ILSVRC数据集对泛化很有帮助。我们的方法也能使用微调的技巧在我们的初始化方法中。
Method
我们提出的方法对主要概念是如何定义老师DNN模型的重要信息,并把蒸馏的知识传递给别的DNN。这个部分被分为四块来介绍我们的方法。第一块介绍了我们在研究中使用的有用的蒸馏知识,第二块介绍了我们提出的知识的数学表达。基于这个设计,我们设计了损失项。最后一块介绍了整个学习步骤。
Proposed Distilled Knowledge
DNN模型一层一层地生成特征。越高的层的特征越接近完成主要任务需要的有用特征。如果我们把DNN的输入看作问题,输出看作答案,我们能把DNN中间层生成的特征看作解决问题的步骤的中间解。就是按照这个思路,Romero提出的知识迁移技巧就是让学生DNN简单地模仿老师DNN的中间层结果。在DNN的亲开心,有很多方法解决从输入生成输出的问题。从这个意义上来说,模仿老师模型生成的特征对学生DNN来说是一个硬约束。
从人的角度看,老师解释了一个问题的解题步骤,然后学生学习这个解题步骤的流程。学生DNN模型。在某些问题下,学生DNN模型并不需要学习中间层输出,但是仍可以学习解决问题的方法。我们相信解释清楚问题的解题步骤会比单纯的教中间层结果带来更好的泛化能力。
Mathematical Expression of the Distilled Knowledge
解决步骤的流能用两个中间层结果的关系来定义。在DNN的情况下,这个关系可以被当作两层的特征的方向。我们设计了一个FSP矩阵来表示解决步骤的流。FSP矩阵$G\in R^{m\times n}$是用来自两层的特征生成的。一个选中的层生成特征图$F^1\in R^{h\times w\times m}$其中$h,w,m$分别表示高度宽度和通道数。另一个选中的层生成特征图$F^2\in R^{h\times w\times n}$。FSP矩阵按以下公式计算:
$$ G_{i,j}(x;W)=\sum_{s=1}^h\sum_{t=1}^w\frac{F^1_{s,t,i}(x;W)\times F^2_{s,t,j}(x;W)}{h\times w} $$
x和W表示输入图像和DNN的权重。我们准备了在cifar-10上训练过的分别有8,26,32层的残差网络。残差网络中有三个部分的空间大小变化了。我们选了几个部分来生成FSP矩阵。
Loss for the FSP Matrix
为了帮助学生网络,我们将来自老师模型的知识进行迁移。就像之前描述的,蒸馏的知识以包含了解决步骤的流的信息的FSP矩阵的形式表达。我们能假设这里有老师矩阵产生的n个FSP矩阵$G^T_i,i=1,...,n$,和学生矩阵产生的n个FSP矩阵$G^S_i,i=1,...,n$。在这个学习中,我们只考虑老师模型和学生模型之间的具有同样空间大小的一对FSP矩阵。我们使用L2损失。损失函数可以表示为:
$$ L_{FSP}(W_t,W_s)=\frac{1}{N}\sum_x\sum^n_{i=1}\lambda_i\times|G_i^T(x;W_t)-G^S_i(x;W_s)|^2_2 $$
其中$\lambda_i$和$N$代表每个损失项的权重和数据点的数量。我们假设每个损失项都一样重要。因此我们使用一样的权重值。
Learning Procedure
我们的前一方法使用老师模型产生的蒸馏的知识。为了更清楚地解释老师模型,我们定义了两个条件。首先老师模型需要在一些数据集上预训练过。这个数据集和学生模型用的一样不一样都可以。在迁移学习任务中,老师模型用的是不一样的数据集。第二,老师模型可以比学生深或者浅。在这里我们用和学生模型一样或者更深的模型。
学习步骤包含了两个训练阶段。首先我们最小化损失函数$L_{FSP}$去使得学生模型的FSP矩阵和老师模型的尽可能相似。完成第一阶段后学生模型再按照主要任务损失在第二阶段进行训练。因为我们用分类任务来验证我们的方法的有效性,我们使用softmax交叉熵损失$L_{ori}$作为主要任务损失。