CS231n第八节:迁移学习 传送门:Transfer Learning and Fine-tuning Convolutional Neural Networks 本系列文章基于CS231n课程,记录自己的学习过程,所用视频资料为 2017年版CS231n,阅读材料为CS231n官网2022年春季课程相关材料
1. 什么是迁移学习
实际上,很少的人会训练整个卷积神经网络(使用随机的初始化),因为相对来说,很少有足够大的数据集可以用于训练。作为代替,常见的方式是在一个很大的数据集中预训练一个卷积神经网络(比如ImageNet,120万张1000类别图片),然后或者将这个训练后的网络参数作为初始化参数,或者直接作为一个特质提取器用于所关注的任务。三种常见的迁移学习类型如下所示:
1.2 作为固定的特征提取器
获取一个使用ImageNet预训练的卷积神经网络,移除最后一个全连接层(这一层输出1000个类别得分),然后将剩余的卷积神经网络视为一个用于新数据集的特征提取器。在AlexNet中,这将为每张图像计算一个4096维的向量,其中包含紧接分类器之前的隐藏层的激活项。我们称这些提取得到的特征为 CNN code。 如果这些代码在ImageNet上训练的过程中也被阈值化(通常是这样),那么这些 CNN code 也需要进行ReLU,这对性能是很重要的。一旦你提取出了 4096维的结果,你就可以为这个新的数据集训练一个线性分类器(如线性SVM,Softmax分类器等)。
1.3 对卷积神经网络调优
第二种策略是不仅在新的数据集上替换和重新训练卷积神经网络最后一层的分类器,而且还通过继续反向传播对预训练网络的权重进行微调。我们可以对卷积神经网络的所有层进行微调,也可以将前面的一些层固定下来(出于过拟合的考虑),只对网络的一些高层部分进行微调。这是由于通过观察发现,卷积神经网络的前面几层提取的特征包含更多的通用特征(如边缘特征或色块特征),这些特征对许多任务都有用,具有通用性。而网络的后面的层能对原始数据集中类别的细节特征进行更具体的提取。以ImageNet为例,它包含许多狗的品种,卷积神经网络的很大一部分表现力可能被用于区分狗的品种的具体特征。
1.4 预训练模型
由于现在的卷积神经网络一般需要2-3周的时间在多个GPU上进行训练,所以人们会发布他们的模型参数,以利于其他人使用这些网络进行微调。例如,Caffe库有一个模型Zoo,人们在那里分享他们的网络权重。
2. 如何调优
如何决定你应该在一个新的数据集上执行什么类型的迁移学习?这是由几个因素共同决定的,但最重要的两个因素是新数据集的大小(小或大),以及它与原始数据集的相似性(例如,在图像内容和类别方面类似于ImageNet,或非常不同,如显微镜图像)。考虑到卷积神经网络在前面的层中提取的特征比较通用,而在后面的层中提取的特征比较针对特定数据集,这里有一些通用的经验法则:
- 新的数据集很小,与原始数据集相似。由于数据很小,出于过拟合的考虑,对卷积神经网络进行微调并不是一个好主意。由于数据与原始数据相似,我们希望卷积神经网络中更高层次的特征也能与这个数据集相关。因此,最好的办法可能是将模型作为特征提取器训练一个线性分类器。
- 新的数据集很大,与原始数据集相似。由于我们有更多的数据,我们可以有更多的信心能在对网络微调的时候使得其不会发生过拟合,所以我们可以使用微调的方案。
- 新的数据集很小,但与原始数据集有很大不同。由于数据很小,最好只训练一个线性分类器。由于新数据集与预训练的数据集非常不同,最好不要训练网络最后面一层的分类器,因为它包含了很多预训练时采用的数据集中的特定的特征。相反,从网络的靠前的几层就开始训练SVM分类器可能效果更好。
- 新的数据集很大,而且与原始数据集有很大不同。由于数据集非常大,我们是可以对卷积神经网络进行从头训练的。然而,在实践中,用预训练过的模型的权重进行初始化,往往还是有好处的。在这种情况下,我们会有足够的数据来对整个网络进行微调。
3. 实用的建议
- 来自预训练模型的约束: 请注意,如果你想使用预训练的网络,你可能会在新数据集的架构方面受到一些限制。例如,你不能随意改变网络的结构,比如从预训练的网络中取出某个卷积层。然而,有些变化是可以的:由于参数共享,你可以很容易地在不同空间大小的图像上运行同一个预训练的网络。这在使用卷积层和池化层的情况下是很明显的,因为它们的前向函数与输入数据的大小无关(只要步长 "合适")。在使用全连接层的情况下,这一点仍然成立,因为全连接层可以被转换为卷积层。
- 学习率: 与用于计算新数据集的类别分数的线性分类器的(随机初始化的)权重相比,对正在微调的卷积神经网络的权重使用较小的学习率是比较好的。这是因为我们认为目前的卷积神经网络的权重已经相对够好了,只需要进行微调即可,所以我们不希望太快、太多扭曲它们(尤其是当新线性分类器正在从随机初始化开始训练时)。