cs231n_cnn_3
Published:
CS231n_cnn: 3. Transfer Learning
太长不看
- 迁移学习的形式:
- 全部froze,作为固定的特征提取器。只改最后一层分类器。
- froze 前面几层,其余的微调。因为早期层特征更通用,深层更加具体于原始数据集。
- 怎样微调:主要取决于数据集的大小,以及与原始数据集的相似程度(内容,类别层面)。
- 新数据集很小,和原数据集相似:避免过拟合,不用微调。预训练网络深层的特征应该也和新数据集相关。只用改一层线性分类器。
- 新数据集很小,和原数据集不同:最好只训练一个线性分类器,但加在网络较早的激活位置,因为深层特征针对原始数据集。
- 实践:
- 不能随意从预训练网络中抽出某个卷积层。
- 由于参数共享,预训练网络可以在不同大小的图像上直接用。
- 相比于训练,微调权重通常用更小的学习率。因为预训练权重已经很好了,不希望改变太快太多(尤其是正在训练新的线性分类器时)。
- 因此考虑分别设置微调和新分类器的学习率。
1. Transfer Learning
实践中很少需要从头开始训练整个卷积网络(随机初始化),因为很少有足够大小的数据集。通常先在一个很大的数据集上预训练(例如 ImageNet,有120万张图片,1000类),然后在下游任务中作为参数初始化或特征提取器。主要有三个方案:
1. ConvNet as fixed feature extractor
- 在ImageNet上预训练,然后去掉最后一个全连接层,把其余部分看成是在新数据集上固定的特征提取器。
- 例如 AlexNet,分类器之前的隐藏层为每个图像计算为 4096 维的激活。将这些特征称为 CNN codes。
- 如果这些特征在训练时被阈值化了,那后续也要加上 ReLU。
- 最终只用在新数据集上重新训练一个线性分类器(SVM 或 Softmax)。
2. Fine-tuning the ConvNet
- 不仅在新数据集上训练新的分类器,还要通过反向传播微调预训练权重。
- 可以微调卷积网络的所有层,也可以固定前面几层(防止过拟合),只微调网络更高层的部分。
- 因为早期特征包含更通用特征,例如边缘或斑点检测,对大部分任务有用。而后续层更加具体于原始数据集中包含的类的细节。
- 例如,ImageNet 包含许多犬种,预训练的卷积网络很大一部分表示能力可能专门用于区分犬种的特定特征。
3. Pretrained models
- 由于现代卷积网络在ImageNet上要训2-3周,因此发布最终模型的 checkpoint,让别人做微调。
2. When and how to fine-tune?
针对新数据集,应该选哪种迁移策略。主要取决于数据集的大小,以及与原始数据集的相似程度(内容,类别层面)。卷积网络本质:特征在早期层更通用,在后期层更针对原始数据集。
1. 新数据集很小,和原数据集相似
- 由于新数据集很小,为了避免过拟合,不适用微调。
- 由于数据相似,卷积网络深层的特征应该也和新数据集相关。
- 因此,最好根据 CNN codes 训练一个分类器。
2. 新数据集很大,和原数据集相似
- 由于有更多数据,因此可以尝试微调整个网络。
3. 新数据集很小,和原数据集不同
- 由于数据少,最好只训练一个线性分类器。
- 由于数据差异大,最好这个分类器不要加在较高层,因为深层特征针对原始数据集。
- 因此,最好在网络较早的激活位置训练SVM分类器。
4. 新数据集很大,和原数据集不同
- 由于数据多,可以考虑从头训练卷积网络。
- 但是实践中,最好还是用预训练权重进行初始化。
- 因此,有足够的数据微调整个网络。
3. 实践技巧
1. 来自预训练模型的约束
- 要考虑模型架构,例如,不能随意从预训练网络中抽出某个卷积层。
- 但由于参数共享,预训练网络可以在不同大小的图像上直接用,因为卷积,池化层和输入大小无关(只要步长合适)。而全连接可以转成卷积。
2. 学习率
- 相比于训练,微调权重通常用更小的学习率。
- 因为预训练权重已经很好了,不希望改变太快太多(尤其是正在训练新的线性分类器时)。
- 因此考虑分别设置微调和分类器的学习率。