转载于:https://www.zhihu.com/topic/20079475/top-answers
https://blog.csdn.net/vvnzhang2095/
代码部分:http://yosinski.com/transfer
最初发表于NIPS 2014的《How transferable are features in deep neural networks?》。其实说是经典,也才2014年,很近了。但是神经网络发展太快,14年的就已经算经典了!本篇论文的作者是Jason Yosinski博士(当时是康奈尔大学的博士生),Uber AI联合创始人。值得注意的是论文的第三作者是深度学习大牛Yoshua Bengio,所以论文的质量和档次是可以信赖的。(能和这种级别的大牛合作,我想也算是一个博士生的最好经历了吧!)
多说一句,为什么说这个论文经典:1)本文在当年NIPS上是oral presentation(1.2%哦);2)本文目前引用数600多次,要知道现在火得一塌糊涂的Goodfellow的GAN文章也才800多!3)要很好地研究深度迁移学习,首先要高清楚一些基本的结论。所以这篇论文很重要!
背景和动机
随着AlexNet在2012年的ImageNet大赛上获得冠军,深度网络开始在机器学习的研究和应用领域大放异彩。尽管取得了很好的结果,但是神经网络本身就像一个黑箱子,看得见,摸不着,解释不好。由于神经网络具有良好的层次结构,很自然地就有人开始关注,能否通过这些层次结构来很好地解释网络?于是,有了我们熟知的例子:假设一个网络要识别一只猫,那么一开始它只能检测到一些边边角角的东西,和猫根本没有关系;然后可能会检测到一些线条和圆形;慢慢地,可以检测到有猫的区域;接着是猫腿、猫脸等等。
这表达了一个什么事实呢?概括来说就是:前面几层都学习到的是通用的特征(general feature),随着网络的加深,后面的网络更偏重于学习特定的特征(specific feature)。这非常好理解,我们也都很好接受。那么问题来了:我们怎么知道哪些层是general/specific?更进一步:如果应用于迁移学习,如何决定该迁移哪些层固定哪些层?这种转变到底是突然在某一层发生的,还是慢慢渐变式地发生的呢?这种转变是在哪个部分发生的,开始、中间、还是最后一层?研究这些问题,是因为这些问题对研究迁移效果很有帮助,因为我们进行迁移,本质就是要找出source和domain里的共同点,所以要在general层面上进行迁移。因此,找出哪一层是general的,哪一层是specific的,也就显得至关重要了。
一般的迁移学习是这样的:训练好一个网络(我们称它为base network)→把它的前n层复制到target network的前n层→target network剩下的其他层随机初始化→开始训练target task。其中,在做backpropogate(反向传播)的时候,有两种方法可以选择:(1)把迁移过来的这前n层frozen(冻结)起来,即在训练target task的时候,不改变这n层的值;(2)不冻结这前n层,而是会不断调整它们的值,称为fine-tune(微调)。这个主要取决于target数据集的大小和前n层的参数个数,如果target数据集很小,而参数个数很多,为了防止overfitting(过拟合),通常采用frozen方法;反之,采用fine-tune。
而这篇文章通过实验设计,分析了深度网络里不同层在不同设置下的迁移效果,比较了在相似的数据集之间和不同的数据集之间迁移的效果,另外发现了用迁移特征初始化比随机初始化更好。
2. 主要贡献
2.1. 定义了深度网络里面的层到底什么时候是general的,什么时候是specific的。
A和B:两个task,可以分割为两个相似的数据集(random A/B splits)和不相似的数据集(man-made and natural)
设定:ImageNet分类类别为1000个,可以分割为两个分别有500个类别的数据集,也可以分割为分别有645000个样本的数据集。
层数总共为8层,为了更好地举例子,我们对上面所说的“前n层”里面的n取n=3,把这个第n层称为example layer。但是n=3只是这里为了更直观地举例子,之后实验中我们仍然用未知数n来标记,即BnB、AnB等。
base A:A上训练的神经网络
base B:B上训练的神经网络
selffer B3B:前3层从base B里面的前3层得到,且前3层是frozen的;后5层随机初始化,并在B上进行训练。这个网络有啥用呢?它可以作为之后要提到的迁移网络的对照组;
transfer A3B:前3层从base A里面的前3层得到,且前3层是frozen的;后5层随机初始化,且在B上进行训练。重点来了,如果A3B和baseB的效果差不多,说明第3层对B来说仍然是general的;如果差多了,那第3层就是specific to A的,不适合迁移到B;
selffer B3B+:和B3B一样,只不过它不用frozen前3层,而是会学习所有层数,即它是fine tune的;
transfer A3B+:和A3B一样,只不过它不用frozen前3层,而是会学习所有层数,即它是fine tune的。
2.2. 比较了深度网络里不同层次迁移效果,展示了不使用fine-tune时,迁移效果下降的原因可能有两个:
一是特征本身specificity的问题,就比如现在已经到了网络稍深一点的层次了,网络学的已经是specific的特征,这时候去迁移效果会不好。解决方法就是选出general的层,进行迁移;
二是把一个特征之间是co-adapted(耦合)的网络分割了的问题。这一个我的理解可能是和frozen相关,就是本来网络里的特征是耦合的、紧密联系的,但是因为我们把前n层frozen了,相当于把网络割成了两部分,这样可能会导致效果不好。解决方法就是fine tune。
2.3. 展示了相似数据集之间的迁移效果优于不同数据集之间的迁移效果。
2.4. 展示了训练网络时,使用迁移的weights(权重)去初始化的效果会比随机初始化的效果要好,无论是在相似的数据集上迁移还是在不相似的数据集上迁移。
作者之所以想到这个的初衷是因为曾经有文章提出随机的convolutional filters(卷积过滤器)、rectification(修正)、pooling(池化)、local normalization(局部正则化)训练的效果和学习后的这些参数训练的效果差不多,但是它是在很小的数据集上进行的,在很大的数据集上会怎样呢?
2.5. 无论使用多少层的迁移特征对网络进行初始化,在fine tune之后效果都会变得很好。
3. 实验
3.1. 展示贡献2.1、2.2、2.5的实验:这个实验是用两个相似的数据集(random A/B splits)训练的。实验分别在baseB、BnB、BnB+、AnB、AnB+上进行。(同理也可以换成baseA、AnA、AnA+、BnA、BnA+)
直接上图可以看结论:
可以看到这么几个结论:
(1)baseB(白色)完全没有copy任何网络的前n层,所以n=0。训练结果大概为0.625,这个作为一个基准。
(2)BnB(深蓝色)在前两层还好好的,也就是当frozen第一层然后训练剩下层数时,以及frozen前两层然后训练剩下层数时,都表现不错;但是n取3,4,5,6的时候就不同了,效果下降,尤其是4和5层下降尤为厉害;然后第6层已经接近回到baseB的水平了,最后慢慢回归到正常水平。
文章推测,这是因为在连续layer之间,feature是co-adapted的(即紧密联系的),而frozen使得这种co-adaptation没办法被学习。一开始,梯度下降还是可以找到比较好的解的,但是后来越来越多层无法被一起训练的时候,就没办法找到很好的解了;而后来为啥又好了呢?可能是因为对于梯度下降来说,relearn一两层很容易就能找到一个好的解,也就是说,6、7层的特征之间和7、8层的特征之间的co-adaptation比较低,因此效果又提升了。
(3)BnB+(浅蓝色)一直都和base case的效果差不多,说明fine-tuning可以改善BnB中效果下降的情况;
(4)AnB(深红色)在前两层效果都很不错,说明前两层特征都是general的;但是在第三层的时候效果开始变差,4-7层的时候变得尤其差。正如在2.1中提到的,这时候BnB就起到对照作用了。回顾一下,2.2提到效果下降有两个原因,一个是feature的specific问题,一个是co-adpated丢失的问题。可以看到在第3、4、5层时,BnB的效果也是下降的,所以这里主要是co-adaptation的问题;而在第6和7层时,BnB的效果已经恢复了,所以已经没有co-adapted丢失的问题,因此这时候主要就是feature的specific导致的了。【此处展示了2.1和2.2】
此外,这里也展示了在某一个层上迁移比在所有层(n=8时)上直接训练的效果要好,所以这里的贡献有:一是从每一层的层面上量化了什么时候迁移效果会最好;二是展示了迁移效果变差的两个原因(即feature的specific问题和co-adapted问题)轮流主导了迁移效果的变差。
(5)AnB+(浅红色)展示了fine tune的惊人效果,fine tune之后的迁移效果甚至比直接在target数据集上训练的效果要好,哪怕是在大的数据集上。而且同样的训练时间下BnB+无法呈现这么好的效果。此外,可以看到无论n取值多少,AnB+的效果都是差不多的,所以迁移多少层似乎对效果也没什么影响,下表也展示了这一点。【此处展示了2.5】
把上面的结果合并就得到了下面一张图:
3.2. 展示贡献2.3的实验:其实就是在不相似的数据集(man-made and natural)上做实验,然后把它和前一个实验的效果对比。
由于数据集A和B发生了改变,首先要先看看baseA和baseB的效果,它的效果和前一个实验中的baseA和baseB的效果是差不多的,这样在后续展示迁移效果下降的时候才有说服力(不然别人会challenge说有可能是数据集本身就导致了效果变差,而不是迁移效果变差)。
下图中上面那条是baseB(白色点)和AnB(橙色点)的效果,下面是baseA(白色点)和BnA(橙色点)的效果,可以看到随着n变大,它们效果的下滑都要比上述实验中的要厉害,展示了在不相似的数据集之间迁移效果会比相似数据集之间迁移效果要差。
至于这两条线的差别,文章指出可能只是因为A和B数据集包含类别个数不同的原因,不是关注重点。
3.3. 展示贡献2.4的实验:通过对比随机初始化weight的实验结果和用迁移过来的weight初始化的实验结果得出结论。
作者分别在相似数据集(random A/B splits)和不相似数据集(man-made and natural)上进行AnB的实验,并在相似数据集(random A/B splits)上实验,并且都减掉了base level performance,这样它们在n=0的时候都是0,方便比较。
可以看到:(1)不相似数据集之间迁移的效果确实比相似数据集之间迁移效果下降得快,再次佐证了2.3;(2)即使是用不相似数据集上迁移的参数进行训练,也比随机初始化参数训练的效果要好。
前面提到,作者想到这个是因为曾经有文章提出随机的参数训练的效果和学习后的这些参数训练的效果差不多,为什么这里展示的却是迁移参数训练效果会更好呢?作者分析说,可能就是因为那篇文章里用的数据太少,导致学习后的参数训练时过拟合了,作者在附录中有对这一点进行了实验,不过不是重点,所以就不赘述了。
这个图说明了什么呢?简单:随着可迁移层数的增加,模型性能下降。但是,前3层仍然还是可以迁移的!同时,与随机初始化所有权重比较,迁移学习的精度是很高的!
结论
虽然该论文并没有提出一个创新方法,但是通过实验得到了以下几个结论,对以后的深度学习和深度迁移学习都有着非常高的指导意义(杨强教授非常赞赏该论文的工作):
- 神经网络的前3层基本都是general feature,进行迁移的效果会比较好;
- 深度迁移网络中加入fine-tune,效果会提升比较大,可能会比原网络效果还好;
- Fine-tune可以比较好地克服数据之间的差异性;
- 深度迁移网络要比随机初始化权重效果好;
- 网络层数的迁移可以加速网络的学习和优化。