预训练模型 & Fine-tuning

https://blog.csdn.net/weixin_42137700/article/details/82107208

https://zhuanlan.zhihu.com/p/46833276

在实践中,由于数据集不够大,很少有人从头开始训练网络。常见的做法是使用预训练的网络(例如在ImageNet上训练的分类1000类的网络)来重新fine-tuning(也叫微调),或者当做特征提取器。

语言模型来辅助NLP任务已经得到了学术界较为广泛的探讨,通常有两种方式:

  1. feature-based(ELMo)
  • 利用语言模型的中间结果也就是LM embedding, 将其作为额外的特征,引入到原任务的模型中。
  • 通常feature-based方法包括两步:a. 在大的语料A上无监督地训练语言模型,训练完毕得到语言模型,然后构造task-specific model例如序列标注模型,采用有标记的语料B来有监督地训练task-sepcific model,将语言模型的参数固定,语料B的训练数据经过语言模型得到LM embedding,作为task-specific model的额外特征
  1. fine-tuning
  • Fine-tuning方式是指在已经训练好的语言模型的基础上,加入少量的task-specific parameters。例如对于分类问题在语言模型基础上加一层softmax网络,然后在新的语料上重新训练来进行fine-tune
    • 构造语言模型,采用大的语料A来训练语言模型在语言模型基础上增加少量神经网络层来完成specific task。例如序列标注、分类等,然后采用有标记的语料B来有监督地训练模型,这个过程中语言模型的参数并不固定,依然是trainable variables。

常见的两类迁移学习场景

  1. 卷积网络当做特征提取器。使用在ImageNet上预训练的网络,去掉最后的全连接层,剩余部分当做特征提取器(例如AlexNet在最后分类器前,是4096维的特征向量)。这样提取的特征叫做CNN codes。得到这样的特征后,可以使用线性分类器(Liner SVM、Softmax等)来分类图像。
  2. Fine-tuning卷积网络。替换掉网络的输入层(数据),使用新的数据继续训练。Fine-tune时可以选择fine-tune全部层或部分层。通常,前面的层提取的是图像的***通用特征(generic features)***(例如边缘检测,色彩检测),这些特征对许多任务都有用。后面的层提取的是***与特定类别有关***的特征,因此fine-tune时常常只需要Fine-tuning后面的层。

何时以及如何Fine-tune

决定如何使用迁移学习的因素有很多,这是最重要的只有两个:新数据集的大小、以及新数据和原数据集的相似程度。有一点一定记住:**网络前几层学到的是通用特征,后面几层学到的是与类别相关的特征。**这里有使用的四个场景:

  1. 新数据集比较小且和原数据集相似。因为新数据集比较小,如果fine-tune可能会过拟合;又因为新旧数据集类似,我们期望他们高层特征类似,可以使用预训练网络当做特征提取器,用提取的特征训练线性分类器。
  2. 新数据集大且和原数据集相似。因为新数据集足够大,可以fine-tune整个网络。
  3. 新数据集小且和原数据集不相似。新数据集小,最好不要fine-tune,和原数据集不类似,最好也不使用高层特征。这时可是使用前面层的特征来训练SVM分类器。
  4. 新数据集大且和原数据集不相似。因为新数据集足够大,可以重新训练。但是实践中fine-tune预训练模型还是有益的。新数据集足够大,可以fine-tine整个网络

warning

与重新训练相比,fine-tune要使用更小的学习率。因为训练好的网络模型权重已经平滑,我们不希望太快扭曲(distort)它们(尤其是当随机初始化线性分类器来分类预训练模型提取的特征时)。

你可能感兴趣的:(预训练,fine-tuning)