在现实中,几乎没有人从无到有后(随机初始化)的训练一个完整的卷积神经网络,因为拥有足够大的数据集是相当稀有的。然而,很常见的是在一个非常大的数据集上预训练一个ConvNet,并且使用这个ConvNet作为一个初始化或者一个固定特征的提取器在感兴趣的任务上。下面是迁移学习的主要三个阶段:
- ConvNet作为一个固定特征提取器。用一个ConvNet在ImageNet上pretrained,移除最后的全连接层(这层的输出是1000个类的划分对于不同的任务,例如ImageNet),然后将、ConvNet的其他层作为一个特征提取器对于新的数据集。在AlexNet上,将会计算一个4096-D的向量对于每一张图像,包含隐藏层的激活在分类器之前。称这些特征是CNN codes。如果ConvNet也被设定阈值在ImageNet上训练ConvNet期间,对于性能,这些codes被ReLUd是非常重要的(阈值在zero点)。之前你提取的的4096-D的codes对于所有图像,训练一个线性的分类器针对新的数据集。
- 微调ConvNet。第二个阶段不仅更换和重新训练分类器在ConvNet的顶部在新的数据集上,还通过持续的反向传播微调预训练网络的权重。微调ConvNet的所有的层是有可能的,或者保持一些层固定(归因于过拟合的关注)并且只是微调网络中一些高层次的部分。这种激发通过观察ConvNet包含多种对许多任务有用的特性的早期特征,但是在新的数据集中,ConvNet的新层变的对分类的详细信息具有更多的细节。将ImageNet作为一个例子,其中包含了许多狗的种类,在狗种类之间具有明显的特征信息。
- 预训练的模型。因为现在的ConvNet需要花费2-3周的时间通过大量的GPU在ImageNet上训练,所以通常看到人们分享他们最终的ConvNet的checkpoints的好处,对于其他人使用这个网络进行微调。举个例子,Caffe的库有一个Model Zoo 分享人们的网络权重。
什么时候和怎样去微调?你是如何决定你应该执行什么类型的迁移学习在新的数据集上?这是一个函数的几个因素,但是有两个重要的是新的数据集的尺寸和与原始数据集的相似性(例如ImageNet-图像和类的与显微镜下的图像的信息是非常不同的)。记住ConvNet的特征是更具普遍性的在前面的层中并且更多的原始数据集的细节在后面的层,有一些通用的规则针对4个主要的场景:
- 新的数据集小并且相似于原始数据集。因为数据比较小,但是不是一个好的idea去微调ConvNet归因于过拟合的关注。因为数据相似于原始数据,我们期待ConvNet的高水平的特征与这个数据集相关。因此,最好的idea可能是在CNN codes上训练线性分类器。
- 新的数据集大并且相似于原始数据集。因为我们偶更多的数据,所以我们有更多的信心防止过拟合当我们在微调整个网络的时候。
- 新的数据集小但是不同于原始数据集。因为数据少,但是最好的可能是训练一个线性分类器。因为数据集不同,可能不适合训练网络顶端的分类器,包含更多数据的详细特征。然而,它可能更适合在网络中某处的前面的activationgs训练SVM的分类器。
- 新的数据集大并且不同于原始数据集。因为数据集比较大,我们可能期望我们足够训练一个ConvNet从无到有。然而,实际上经常初始化带权重的预训练模型仍然受益。在这种情况下,我们将会有足够的数据和信心微调通过这个网络。
- 来自于预训练模型的约束。如果你希望使用一个预训练的模型,你可能稍微的受到结构上的约束对于新的数据集。举个例子,你不能随意的拆分卷积层从预训练的模型中。然而,一些改变是直接的:由于参数的分享,你能够更容易的运行一个pretrained的网络在不同空间尺寸的图像上。在Conv/Pool层比较清晰明显是因为他的前馈函数的输入空间尺寸是独立的。在FC层,仍然保持正确因为FC层能够转换到一个卷积层:几个例子,在AlexNet上,最后的池化空间在第一个FC层之前试6*6*512.因此FC层看这个空间是独立的有一个卷积层有一个感受野是6*96,并且应用0的填充。
- 学习率。通常使用小的学习率在ConvNet的权重进行微调。对比(随机初始化)新的线性分类器的权重,计算你的新的数据集类的比例。这是因为我们希望ConvNet的权重是相当好的,所以我们不希望改变的太快和太多(特别是新的线性分类器被训练从随机的初始化中。)
本文仅是翻译原文,水平有限,仅供娱乐参考,请勿较真。