当前,人们所提到的预训练主要是指大规模预训练模型,特别是预训练语言模型,但这种理解其实是有一定局限的。在自然语言处理领域,预训练模型确实取得了非常突出的进展,一般是指通过无监督或自监督等技术把人类的语言知识预先学习成一个模型,然后再代入到某个具体任务中进行“微调”。但从广义上来讲,预训练在机器学习中由来已久,在深度学习早期发展中也发挥了重要作用。目前流行的大规模预训练模型,在自然语言处理之外(比如图像)的领域也取得了很多重要进展。
机器学习有两类主要模型,即产生式模型和判别式模型。前者通过对数据的联合分布进行建模,可以做无监督学习、处理缺失信息等,在合理的假设下,这类模型的训练相对容易;而判别式模型直接优化任务目标或其近似(如分类任务中的损失函数及其各种凸替代),在训练数据充分的情况下,判别式模型往往能更好地适应任务,但其训练一般相对复杂。为此,在机器学习领域,一个被广泛研究的问题是如何将产生式模型与判别式模型相融合,其中一种方式是将产生式模型作为“预训练”模型,再结合判别式目标进行微调。例如,对经典的隐马尔可夫模型先做产生式训练(即最大似然估计),再做判别式微调,可以提升识别精度。
2006年,深度学习获得突破,辛顿(Hinton)等人发表了首个成功学习具有多个隐含层的深度模型,称为深度置信网络(Deep Belief Networks,DBN),其核心思想是通过一个逐层训练的贪心算法,进行无监督的“预训练”,然后再将其结果作为一个相对更慢的训练算法(即Wake-Sleep算法)的初始值,进行微调。这种预训练方法对深度学习的早期进展起到了关键作用,例如,辛顿基于逐层无监督预训练技术,通过最小化重建误差微调一个深度的自编码器,取得了比主成分分析(Principal Component Analysis,PCA)方法更好的降维效果,该论文于同年发表在《科学》(Science)杂志上;本吉奥(Bengio)等人对深度模型进行了扩展,适用于更加复杂的场景(例如连续值的输入数据);雅恩·乐昆(LeCun)等人基于类似技术训练卷积网络。这些方法的基本假设是:预训练得到的初始权重落在性能较好的局部极小值周围;而在此之前,对于超过2个隐含层的神经网络,用随机初始化的梯度下降算法并不能提升性能,甚至损害性能。
什么是大规模预训练
大规模预训练模型首先在自然语言处理领域取得突破,逐渐被用到计算机视觉等领域。在自然语言领域,最早的大规模预训练模型主要采用浅层词嵌入的方式,来学习上下文无关的静态词向量,代表工作有NNLM、Word2Vec(CBOW和Skip-Gram)、Glove等。尽管这些经过预训练的词向量可以在一定程度上捕捉词语的语义,但它们却是上下文独立的,无法解决一词多义的问题,也无法理解更高层次的文本概念,如句法结构、语义角色、指代等。针对这一问题,彼得斯(Peters)等人提出基于特征融合的预训练模型ELMo。ELMo首先从大规模语料中训练一个两层双向的长短期记忆网络(LSTM)模型,然后从预训练网络中提取对应词语的网络各层的特征,根据下游任务的不同,学习不同层特征的权重,通过加权求和得到词语上下文相关的融合特征,应用到对应的下游任务中。
在ELMo的基础上,OpenAI提出基于微调的预训练模型GPT,使用Transformer解码器替代LSTM作为网络的架构,先预训练单向的Transformer语言模型,仅依赖于上文预测下一个词语,再针对不同的下游任务,采用有监督的微调方法调整网络参数。它的升级版GPT2采用无监督多任务预训练方法,无须在下游任务上进行微调就能在多项生成任务上取得较好表现。
区别于GPT所使用的单向Transformer语言模型和ELMo所使用的双向LSTM语言模型,BERT基于Transformer编码器,在第一阶段预训练时采用掩码语言模型来达到深层双向联合训练的目的,通过随机掩盖输入语句中的部分词语,基于词语的上下文进行预测。另外,因为许多自然语言处理任务都是建立在理解两个句子之间的关系的基础上,BERT预训练时还采用了下一句预测的二分类任务,来预测某句是否是真正的下一句。第二阶段,BERT针对不同的下游任务微调参数,在多项自然语言任务中效果取得了显著提升。
基于BERT的掩码语言模型的思想,后续很多预训练模型在掩码策略上做了一些改进。例如Ro-BERTa改变了BERT静态掩码的策略,使用动态掩码进行预训练。SpanBERT为了解决BERT中掩码最小单元为词语所导致的强相关词语被割裂开来的问题,使用了片段掩码来随机掩盖一段连续的词,另外增加一个由边界预测掩码词语的任务,利用掩码片段的边界外紧邻的两个词语以及片段内掩码词语的位置预测掩码词语。百度的ERINE引入外部知识,采用三种掩码策略,掩盖词语、短语和实体来预测被掩盖部分。微软的MASS以及谷歌的T5将掩码语言模型引入生成任务,采用Transformer编解码框架,在编码端掩盖词语序列,再在解码端预测被掩盖的词语序列。脸书(Facebook)提出的BART模型同样基于Transformer框架,在编码端对序列采用几种不同的加噪声策略,在解码端生成原始序列。此外,为了克服掩码语言模型的“MASK”等字符导致的预训练与微调之间的不一致以及人为掩盖的词语之间的独立性假设这两个问题,XLNet提出排列语言模型,将因式分解顺序的所有可能排列的期望对数似然最大化,训练时采样一种排列顺序,将末尾一定量的词语遮盖,采用双流自注意力机制依次预测被掩盖掉的词语。
近年来,为了解决大模型在移动和物联网等设备上的部署问题,涌现出多种基于BERT的模型压缩方法,例如ALBERT采用词嵌入参数因式分解、隐藏层参数共享方法减少参数量,并添加句子间顺序的预测任务。TinyBERT使用蒸馏的方法,先在大数据集上微调大模型,再通过小模型学习大模型的词嵌入、注意力层以及隐藏层输出。另外,为了融合多种模态信息进行内容理解,多模态预训练模型也成为近来的研究热点。一般利用图像目标检测技术,将高置信度的物体及其对应的位置关系作为图片侧的输入,再将提取到的图像特征与文本特征做模态间的融合处理,使得模型学习到图文间的关联信息。例如单流的VLBERT,直接将图像和文本特征输入到单个Transformer中做融合;跨流的ViLBERT和LXMERT,以双通道作为输入并进行交叉融合,提取到图文特征后基于注意力机制做模态间交互,将交互后的特征分别通过Transformer得到最终的特征。
在视觉领域,预训练长期以来都是在ImageNet上进行的。ImageNet预训练结合下游任务微调的方式在很多任务中都取得了很好的效果。2017年,谷歌的研究者们第一次把预训练的数据扩展到了更大规模的数据集上,他们介绍了一个更大规模的图像数据集JFT-300M,并且发现更大规模的数据集同样可以提升ImageNet分类及其他下游任务的性能。值得一提的是,JFT-300M并没有开放给社区,因而后续的视觉预训练相关工作主要也是由谷歌完成的。2018年,同样基于JFT-300M这一超大规模的数据集,谷歌提出了BiT这一预训练模型(即用更大的数据集训练ResNet),并详细讨论了BiT对于各下游任务包括小样本情况下的泛化性能,在多项任务上都刷新了当时的最好结果。之后,谷歌又提出了两种新的训练算法NoisyStudent和MetaPseudoLabels,将EfficientNet在ImageNet上的准确率训练到了88.4%和90.2%,这两个分别都是当时的最佳结果,后者也是首个在Ima-geNet上准确率超过90%的模型,也是到目前为止唯一的一个。Facebook在预训练模型领域也有尝试,他们在2018年收集了一个超过35亿张图片的数据集IG-3.5B-17k用以训练模型,但是相比于JFT-300M,这一数据集有更大的噪声。在这之后,他们没有再发基于这一数据集的工作,也没有将其开放出来。
最近,Transformer在视觉领域中的应用也在吸引着业界的关注。2020年谷歌提出了ViT,基于Transformer的骨干网络在很多方面达到甚至超越了传统CNN的架构,使人们意识到用Transformer做预训练的可能性。在训练过程中,他们同样使用了JFT-300M。这之后,有许多改进工作提出,包括CvT、CeiT和SwinTransformer等,他们都尝试将卷积的一些性质和Transformer相结合,并都达到了不错的结果。受限于数据,他们都是在ImageNet-21k上进行的训练。此外,自监督学习也是最近较为热门的方向,这一类方法以MoCo和SimCLR为代表。但是目前的自监督学习大多在ImageNet上进行训练,并没有扩展到更大规模的数据集上,同时现有的效果距离有监督学习的结果还有差距。