transfer-learning迁移学习
迁移学习
实际上,很少有人重头开始训练整个卷积网络(使用随机初始化),因为拥有足够大小的数据集的人相对很少。相反,通常在一个非常大的数据集上对ConvNet进行预训练,(例如ImageNet,其中包含120万个具有1000个类别的图像),然后使用ConvNet作为所感兴趣的任务的初始化或固定特征提取器。三种主要的迁移学习方案如下:
ConvNet作为固定特征提取器
采用一个在ImageNet数据集上预训练过的ConvNet,删除最后一个全连层(该层的输出是针对像ImageNet这样的不同任务的1000类分数),然后将ConvNet的其余部分视为新数据集的固定特征提取器。在AlexNet中,这将为每张图像计算一个4096维的向量,在分类器之前包含隐藏层激活的图像。我们称这些特征为CNN编码。如果在ImageNet上训练ConvNet时也对这些编码进行了阈值设置(通常是这种情况),那么对这些编码使用ReLU(即阈值为0)对性能很重要。为所有图像提取4096维编码后,为新数据集训练线性分类器(例如,线性SVM或Softmax分类器)。
微调ConvNet
微调不仅是在新数据集的ConvNet上替换和重新训练分类器,而且还要通过继续反向传播来微调预训练网络的权重。可以对ConvNet的所有层进行微调,也可以保持一些较早的层不变(由于过度拟合的问题),只微调网络的一些较高层的部分。这是由于观察到的结果是,ConvNet的前期特征包含更多的通用特征(例如,边缘检测器或色块检测器),这些特征对许多任务有用,但是ConvNet的后面几层逐渐变得更加特定于原始数据集中包含的类的细节。
预训练模型
因为现代的ConvNet通常需要花2-3周时间在ImageNet上使用多个GPU进行训练,为了方便他人使用网络进行微调,人们通常释放他们最后的ConvNet检查点。
何时以及如何进行微调?
如何确定应该在新的数据集上使用哪种迁移学习方法?由几个因素决定,但是最重要的两个因素是新数据集的大小(大或小),以及它与原始数据集的相似性(例如,在图像内容和类别方面类似于ImageNet,或完全不同,例如显微镜图像)。请记住,ConvNet特征在较早的层中更通用,而在较后的层中更特定于原始数据集,以下是一些常见的经验法则,适用于这4种主要场景:
- 新数据集很小,与原始数据集相似。数据量很小,由于过度拟合的问题,对ConvNet进行微调并不是一个好主意。数据与原始数据相似,我们希望ConvNet中的高级特性也与该数据集相关。因此,最好的方法可能是在CNN编码上训练一个线性分类器。
- 新数据集很大,并且与原始数据集相似。由于我们拥有更多的数据,因此,如果我们尝试通过整个网络进行微调,我们将更有信心不会过拟合。
- 新数据集很小,但与原始数据集有很大不同。由于数据很小,因此最好只训练线性分类器。由于数据集非常不同,因此最好不要从网络顶部训练分类器,该网络包含更多特定于数据集的特征。取而代之的是,从网络中较早的某个位置进行激活来训练SVM分类器可能会更好。
- 新数据集很大,并且与原始数据集有很大不同。由于数据集非常大,我们可以期望我们有能力从头开始训练ConvNet。但是,实际上,使用来自预训练模型的权重进行初始化通常仍然是有益的。在这种情况下,我们将有足够的数据和信心来调整整个网络。
数据集 | 相似 | 不相似 |
---|---|---|
小 | 只训练分类器 | 从较早层训练分类器 |
大 | 微调 | 重头训练;使用预训练模型的权重进行初始化 |
实用的建议
在进行迁移学习时,还有一些需要记住的事情:
- 来自预训练模型的约束。注意,如果你希望使用一个预训练的网络,那么在新数据集可以使用的架构方面,你可能会受到一些限制。例如,你不能从预训练好的网络中随意任意取出Conv层。但是,有些直接的更改:由于参数共享,你可以轻松地在不同空间大小的图像上运行经过预训练的网络。这在Conv/Pool层中很明显,因为它们的向前函数与输入体积空间大小无关(只要stride合适即可)。对于FC层,这仍然成立,因为FC层可以转换为卷积层:例如,在AlexNet中,第一层FC层之前的最后一个池化卷大小为[6x6x512]。因此,查看该卷的FC层相当于拥有一个卷积层,感受野大小为6x6,并应用padding为0。
- 学习率。与计算新数据集的类分数的新线性分类器的(随机初始化的)权值相比,通常对经过微调的ConvNet权值使用较小的学习率。这是因为我们期望ConvNet的权值相对较好,所以我们不希望过快地扭曲它们(特别是当它们上面的新线性分类器从随机初始化开始训练时)。