机器不学习:浅谈深度迁移学习
文章:How transferable are features in deep neural networks
代码部分:http://yosinski.com/transfer
这篇文章里的迁移我认为是transductive TL层面上的迁移(transductive TL具体可以看我这篇文章:迁移学习--综述)也就是domain不同,但是task相同。但是transductive TL里面还提到source和target的labeled data可不可得的问题,我感觉在这里都可得,又不那么严格满足transductive TL介绍里提到的情况,anyway分类可能也没有那么死板吧。
1. 背景与简介
这篇文章挺有意思的,我们知道在做深度网络的时候,一开始网络学的是general的特征,之后才越来越细化,越来越specific。那么到底怎么衡量一层是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)即使是用不相似数据集上迁移的参数进行训练,也比随机初始化参数训练的效果要好。
前面提到,作者想到这个是因为曾经有文章提出随机的参数训练的效果和学习后的这些参数训练的效果差不多,为什么这里展示的却是迁移参数训练效果会更好呢?作者分析说,可能就是因为那篇文章里用的数据太少,导致学习后的参数训练时过拟合了,作者在附录中有对这一点进行了实验,不过不是重点,所以就不赘述了。