3.2 使用预训练模型
本书第1章介绍了很多自然语言处理领域的预训练模型,如ELMo、BERT、GPT、XLNet、ALBERT等,这些预训练模型都基于大数据集、深度网络模型,在GPU或TPU上经过长时间训练得到。除自然语言处理领域的预训练模型,还有很多视觉领域的预训练模型,如基于大数据集ImageNet训练的AlexNet、VGG系列、ResNet系列、Inception系列模型等。对这些预训练模型,可以直接使用相应的结构和权重,将它们应用到新任务上,这个过程就是“迁移学习”。
3.2.1 迁移学习简介
何为迁移学习?迁移学习是一种机器学习方法,简单来说,就是把任务A开发的模型作为初始点,重新使用在任务B中,如图3-9所示。比如,任务A可以是识别图片中的车辆,而任务B可以是识别卡车、轿车、公交车等。
图3-9 迁移学习示意图
迁移学习,与我们日常说的“举一反三”“触类旁通”是一个道理,预训练模型犹如“举一”和“触类”,迁移学习的目的就是“反三”和“旁通”。
在机器学习中,迁移学习就是让机器将在已知情况中学到的知识和积累的经验,迁移到其他不同但相关的任务中以解决新的问题。
合理使用迁移学习,可以避免针对每个目标任务构建单独训练模型,从而极大节约计算资源。
在计算机视觉任务和自然语言处理任务中,将预训练好的模型作为新模型的起点是一种常用方法,通常预训练这些模型,往往需要消耗大量的时间和计算资源。而迁移学习就是把预训练好的模型迁移到新的任务上。
迁移学习的基础是预训练模型,那该如何用好预训练模型呢?
3.2.2 使用预训练模型的方法
在学习如何使用预训练模型时,首先要考虑目标模型的数据量及目标数据与源数据的相关性。一般建议根据数据集与预训练模型的数据集的不同相似度,采用不同的处理方法,如图3-10所示。
图3-10 根据数据集大小与数据相似度选择预训练模型
图3-10中的序列,是根据对预训练模型调整的程度来排序的,1对应调整程度最小,4对应预训练模型调整程度最大。接下来就各种方法进行说明。
1. 数据集小,数据相似度高
这种情况比较理想,可以将预训练模型当作特征提取器来使用。具体做法:去掉输出层,然后将剩下的整个网络当作一个固定的特征提取机,应用到新的数据集中。具体过程如图3-11所示,调整分类器中的几个参数,其他模块保持“冻结”即可。这种微调方法,有时又称为特征抽取,因为预训练模型可以作为目标数据的特征提取器。
图3-11 调整预训练模型的分类器示意图
2. 数据集大,数据相似度高
在这种情况下,因为目标数据与预训练模型的训练数据之间高度相似,故采用预训练模型会非常有效。另外,训练系统有一个较大的数据集,采用冻结预处理模型中少量较低层,修改分类器,然后在新数据集的基础上重新开始训练是一种较好的方式,具体处理过程如图3-12所示。
图3-12 调整预训练模型较高层示意图
3. 数据集小,数据相似度不高
在这种情况下,可以冻结预训练模型中较少的网络高层,然后重新训练后面的网络,修改分类器。因为数据的相似度不高,重新训练的过程就变得非常关键。而新数据集大小的不足,则是通过冻结预训练模型中一些较低的网络层进行弥补,具体处理过程如图3-13所示。
图3-13 调整预训练模型更多网络层示意图
4. 数据集大,数据相似度不高
在这种情况下,因为有一个很大的数据集,所以神经网络的训练过程将会比较有效率。然而,因为目标数据与预训练模型的训练数据之间存在很大差异,采用预训练模型不是一种高效的方式。因此最好的方法还是将预处理模型中的权重全都初始化后再到新数据集的基础上重新开始训练,具体处理过程如图3-14所示。
图3-14 重新训练整个预训练模型示意图
以上是微调预训练模型的一般方法,具体操作时,往往会同时尝试多种方法,然后,从多种方法中选择一种最优方案。