neural network fine-tuning techniques

深度学习中,一般都会基于前人的模型来进行finetune以获得比baseline 更好的model。本文主要融合几篇优秀的相关博文而来。

Transfer Learning

实际研究及生产中,很少有人会从头训练整个深度网络,因为我们通常没有足够大的数据集和时间。常见的是对基于 ImageNet 训练的网络进行 finetune 。或者把该网络用作一个你的任务的 feature extractor。使用迁移学习的主要 4 个场景如下:

  • 用作固定的 feature extractor:基于 ImageNet 获取一个训练好的ConvNet,去掉最后一个全连接层(最后一层是一千个类别的各自的predict score),剩下的网络就可以当做一个固定的 feature extractor。
  • finetune 预训练好的 ConvNet:一般是更改 ConvNet 的顶层为适合你自己的任务。同时 finetune 前面预训练好的 layers 的权重。你可以对 ConvNet 的所有层进行微调,也可以固定前面的几层(由于过度拟合问题)仅对网络中的某些更高层进行微调。这主要是因为前面的layers 的特征是对所有任务都通用的特征(例如边缘或颜色等),而后面 layers 逐渐变得更加深入到原始训练数据集中包含的类的细节。
  • Pretrained models:现在的基于Imagenet 数据集的 ConvNets 需要耗费2-3周的时间去训,而且还得是多显卡,还得是牛逼的显卡!所以通常会看到人们发布最终的ConvNet checkpoints,服务他人。例如caffe library 有一个 Model Zoo。自行谷歌~。
When and how to fine-tune?

做出合适的 finetune 策略是门儿学问。有很多因素需要考量,但是我们这里掐头去尾,有两点你必须考虑到。1. 新数据集的大小 2. 新数据集与 ConvNet 使用数据集的相似性。请记住,ConvNet 前面 layers 中的特征更为通用,后面的 layers 的特征针对性更强。下面介绍四中主要情况:

  • New dataset is small and similar to original dataset:因为数据集很小,考虑到 overfit 的影响,我们不建议finetune ConvNet。又因为新数据集与原数据集相似性很高,我们认为 ConvNet 中的高层特征也与此新数据集相关(有多相关得看俩数据集的相似性)。因此,最好的选择就是在 top layer 单独训练一个 classifier。
  • New dataset is large and similar to the original dataset:现在我们有很大的新数据集(多大算大呢?),不必担心过拟合了,可以试试 finetune 整个网络。
  • New dataset is small but very different from the original dataset:新数据集 very different from 原数据集。肯定不能指望在 ConvNet 的 top layer 上训练个 classifier 了,因为 top layer 的特征对原数据集的针对性太强。这种情况下,用ConvNet 的前面某个中间 layer 的 features (bottleneck features) 来训练 SVM classifier 比较好。SVM 尤其适用于在小数据集上给出决策边界!
  • New dataset is large and very different from the original dataset:尽管同样 different from 原数据集。我们可以从头开始训练一个网络,但是实际中从预训练好的模型上 finetune 还是有好处的。
Practical advice
  • 预训练模型的局限性:一旦你决定使用预训练的模型,你就该想到它的局限性。例如,你不能从预训练 model 中任意去掉 conv 层。
  • 学习率:通常在 finetune 时都会把学习率调小。
  • 固定前几层的参数:freeze the weights of the first few layers  of the pretrained model 也是常见的做法。这是因为前几个层捕捉了与我们的新问题相关的通用特征,如曲线和边等信息。我们希望保持这些权重不变。相反,我们会让网络在后面的 layers 中专注于学习 dataset-specific features。
  • data agumentation

http://cs231n.github.io/transfer-learning/

https://flyyufelix.github.io/2016/10/03/fine-tuning-in-keras-part1.html

Share this to:

发表评论

电子邮件地址不会被公开。 必填项已用*标注