目录
1. Transfer learning
在实践中,由于很少有足够大的数据集,所以很少有人会选择从头开始训练网络。常见的方法是:在一个非常大的数据集上预训练一个CNN(例如:ImageNet,包含1.2 million的图像,1000个类别),再使用这个预训练的网络作为初始化网络后进行微调、或者作为特征提取器。常见的两类的迁移学习场景:
-
卷积神经网络作为一个特征提取器。使用在ImageNet上预训练的CNN,去除最后的全连接层(即:最后用来分类的层),然后将剩余的部分作为一个特征提取器。例如:如果使用AlexNet,则去除最后的全连接层后,输出的是4096维的向量。我们把这些特征叫做CNN codes。提取到这些特征后,可以训练一个线性分类器(如:Linear SVM和Softmax)对其进行分类。
-
Fine-tuning CNN。替换掉网络的输入层(数据),使用新的数据继续训练。Fine-tune过程可以选择对神经网络全部层进行精调,也可以选择对部分层的参数进行精调(保持浅层的参数不变,只对高层的参数进行精调)。之所以会有对部分层进行精调的想法,是因为:通过观察CNN的浅层的特征是比较通用的特征(generic feature),可以应用于很多场景中;但是深层的特征则更具有针对性,与原始数据集包含的类别有关。
Pre-trained model预训练模型:在ImageNet上训练一个CNN网络,在使用多GPU的前提下也要花费2~3周的时间。因此人们通常共享预训练好的网络,这样有利于其他人再去使用。例如,Caffe有预训练好的网络地址Model Zoo。
When and how to fine-tune?
如何选择使用哪种类型的迁移学习取决于多个因素,其中最重要的两个因素是:1. 新数据集的大小 2. 新数据集与原始数据集的相似程度。需要注意的一点是:CNN的浅层的特征更具有通用性,深层的特征更有针对性。下面是四种主要的迁移学习场景:
- 新数据集比较小,并且和原始数据集相似程度较高。由于数据集较小,出于过拟合的考虑不建议对CNN进行Fine-tune。另外由于数据集与原始数据集比较相似,所以我们可以假设两个数据集在深层网络的特征也会比较相关。因此,这种情况下,建议使用预训练的CNN作为特征提取器,再以此训练一个线性分类器。
- 新数据集比较大,并且和原始数据集相似程度较高。由于新数据集足够大,可以fine-tune整个网络。
- 新数据集较小,并且和原始数据集差异很大。由于数据集很小,所以最好是训练一个线性分类器。又因为数据集与原始数据集不相似,因此最好是不要使用网络深层的输出作为特征来训练线性分类器,因为深层的网络包含的特征具有针对性,最好的方式是从预训练网络的浅层输出作为特征训练一个线性分类器。
- 新数据集比较大,并且和原始数据集差异很大。因为新数据集足够大,可以重新训练网络。但是实践中fine-tune预训练模型还是有益的。新数据集足够大,因此通常可以用预训练的模型进行初始化,然后fine-tine整个网络。
实践建议
- 预训练模型的限制。使用预训练模型,会导致受限于其网络架构。例如,你不能随意从预训练模型取出卷积层。但是好处是由于参数共享,可以输入任意大小图像;卷积层和池化层对输入数据大小没有要求(只要步长stride fit),其输出大小和属于大小相关;全连接层对输入大小没有要求,输出大小固定。
- 学习率。与重新训练网络相比,在fine-tune时,需要使用较小的学习率。因为训练好的网络模型权重已经平滑,我们不希望太快和过大的改变它们,尤其是当随机初始化线性分类器来分类预训练模型提取的特征时。
2. Additional References
- CNN Features off-the-shelf: an Astounding Baseline for Recognition基于ImageNet预训练模型提取特征训练SVM分类器
- DeCAF2013年报告了类似发现
- How transferable are features in deep neural networks? 详细介绍了迁移学习的性能adaptations。