Pre-trained Models for Natural Language Processing: A Survey
Summary
关于预训练模型的一篇很好的Survey,总结了从word2vec时代静态的文本表征到目前后BERT时代,PTMs提取出的动态文本表征。PTMs的不同主要体现在模型所用的上下文encoder不同、预训练模型的任务不同、以及PTMs所针对的下游任务等。
Research Objective
关于语言预训练模型的一个survey
Background
Neural Contextual Encoders
神经网络的上下文编码器:
- Covolutional model:通过卷积操作提取局部的上下文信息。优点是非常容易训练,并且能够获取局部信息
- Sequential models:序列模型如RNNs,bi-RNN用于提取上下文信息,但是序列模型的表现经常受到文本中的长距离依赖因素的影响。
- Graph-based model:基于图的模型通常把文本看作是节点,使用一些语言学的结构,如语义结构、句法结构来训练上下文表征。 注意相应的参考文献:《Exploiting
semantics in neural machine translation with graph
convolutional networks》值得一读。
缺点是得到这样的一个语言学结构特别困难,而且也非常依赖一些其他的解析器,如句法依存分析的解析器。实际上的做法是用self-attention,比如Transformer,让model自己去学习这些潜在的语言学结构信息,也就是并不用一些其他显式的做法。
虽然Transformer通过对每个词之间的dependency建模,解决了卷积方法和序列方法的长距离依赖问题,但这又导致Transformer需要很大的训练集,如果训练集小了又容易过拟合。
Overview of PTMs
不同的PTM的区别主要在contextual encoders、pre-training tasks, and purposes,之前的Neural Contextual Encoder一节已经简单介绍过了contextual encoders。
Pre-training Tasks
在CV领域的预训练模型通常是在大规模的监督学习数据集中训练的,如ImageNet。而在NLP领域,除了在machine translation有大规模的有监督数据集,其他nlp领域有监督的数据集匮乏。而其实也有基于MT领域的有监督数据集训练的预训练语言模型CoVe。
- Language Model
表示$x{0:t-1}$用neural encoder$f{enc}(·)$做了上下文嵌入,经过prediction层$g_{LM}(·)$得到下一个单词$x_t$的条件概率。
- Masked Language Modeling(MLM)
BERT的MLM的做法是:
随机mask语料中15%的token,然后预测masked token,那么masked token 位置输出的final hidden vectors喂给softmax网络即可得到masked token的预测结果。
这样操作存在一个问题,fine-tuning的时候没有[MASK] token,因此存在pre-training和fine-tuning之间的mismatch,为了解决这个问题,采用了下面的策略:
80%的时间中:将选中的词用[MASK]token来代替,例如
my dog is hairy → my dog is [MASK]
10%的时间中:将选中的词用任意的词来进行代替,例如
my dog is hairy → my dog is apple
10%的时间中:选中的词不发生变化,例如
my dog is hairy → my dog is hairy
这样存在另一个问题在于在训练过程中只有15%的token被预测,正常的语言模型实际上是预测每个token的,因此Masked LM相比正常LM会收敛地慢一些,后面的实验也的确证实了这一点。
MLM也存在一些变种,如Seq2Seq MLM,主要的预训练模型包括MASS和T5,显而易见,这个Seq2Seq的MLM所训练出来的预训练模型在Seq2Seq的下游任务肯定会有提升,比如说QA,summarization和MT。
Enhanced Masked Language Modeling (E-MLM):RoBERTa把静态的Masking改成了动态的,即一开始把预训练的数据复制10份,每一份都随机选择15%的Tokens进行Masking,也就是说,同样的一句话有10种不同的mask方式。然后每份数据都训练N/10个epoch。这就相当于在这N个epoch的训练中,每个序列的被mask的tokens是会变化的。ERNIE的改进是不是mask一个单词,而是mask一些短语或者说命名实体(我觉得这样的预训练方式可能会对answer-span类型的QA有所改进)
Permuted Language Modeling (PLM)
因为MLM在训练时的一些特殊token如[MASK]在下游任务用于预测的实际文本中是不存在的,这就导致在train和fine-turning之间可能会出现差距。那PLM的做法就是,给定一个句子,从这个句子中随机采样一个排列,接着将排列序列中的一些 token 选定为目标,同时训练模型以根据其余 token 和目标的正常位置(natural position)来预测这些目标。Denoising Autoencoder (DAE)
去噪自编码器(denoising autoencoder,DAE)接受部分损坏的输入,并以重建这些未失真的原始输入为目标。在自然语言处理的下游任务中,常用Transformer来重建文本。在构建训练文本时有一些不同的制造噪声的方式。Contrastive Learning (CTL)
一些文本对在语义上比随机取样的文本更为接近。CTL 背后的原理是「在对比中学习」。相较于语言建模,CTL 的计算复杂度更低,因而在预训练中是理想的替代训练标准。CTL包括
- Replaced Token Detection (RTD)
与Noise-Contrastive Estimation (NCE就相当于word2vec中的负采样) 相同,但RTD会根据上下文语境来预测当前的token是否是被替换过的token。
ELECTRA就是这样一个牛批的预训练模型。ELECTRA在以RTD为训练目标的同时还用了生成对抗模型的思想。ELECTRA和BERT最大的不同应该是在于两个方面:masked(replaced) tokens的选择和training objective。
第一,masked token的选择在BERT中是随机的,这意味着什么呢?比如句子“我想吃苹果”,BERT可以mask为“我想吃苹[MASK]”,这样一来实际上去学它就很简单,如果mask为“我[MASK]吃苹果”,那么去学这个“想”就相对困难了。换句话说,BERT的mask可能会有很多简单的token,去学这些token就算是简单的bilstm都可以做的。这样一来,自然而然的一个想法是,我们不随机mask,去专门选那些对模型来说学习困难的token。怎么做呢?这就是ELECTRA非常牛逼的地方了,ELECTRA有一个生成器和鉴别器,生成器将用来把输入文本做部分词的替换,而鉴别器判断输入句子中的每个词是否被替换。也就是说,这里的生成器的作用是为自动选择tokens来替换成其他token,并且经过训练,生成器会越来越选择 一些比较难的token替换,希望骗过鉴别器。在鉴别器方面,用一个二分类去判断每个token是否已经被换过了。这就把原来BERT的一个DAE(或者LM)任务转换为了一个分类任务(或者序列标注)。这有两个好处:(1)每个token都能contribute to some extent,即每个token对模型都有所贡献;(2)极大程度减少了计算复杂度,原来BERT的复杂度是O(d*V),d是输入文本长度,V是词表大小,那ELECTRA的复杂度就是O(d*2)。
- Next Sentence Prediction (NSP)
训练模型以区分两个输入句子是否为训练语料库中的连续片段。正例是同一个文档的两个连续片段,负例是语料库中的随机两个文档。实际上这个训练目标并不是特别好,因为很容易根据两个句子的主题判断是否是连续的片段,从而可能会错误地引导模型去做主题预测的工作。
- Sentence Order Prediction (SOP)
SOP 使用同一文档中的两个连续片段作为正样本,而相同的两个连续片段互换顺序作为负样本。这样就不存在主题不同的问题了。
Model Analysis
- Linguistic Knowledege (语言知识)
BERT在句法任务中的表现很好,但却在语义和细粒度的句法任务上表现不佳。
- World Knowledge
BERT能够提取文本中的World Knowledge,如一些关系信息和常识。
Extensions of PTMs
- Knowledge-Enriched PTMs
加入了一些额外的信息增强了预训练模型。如改进MLM,在每个词上整合这个词的情感词性所提出的SentiLR;K-BERT显式地把从知识图谱中提取出的关系实体嵌入到BERT当中,使得以一个树形的数据作为BERT的输入;K-Adapter通过对不同的预训练任务训练不同的adapter来对不多种额外的信息做一个合适的整合,等等。
Multi-Modal PTMs
暂且不看Model Compression
Adapting PTMs to Downstream Tasks
尽管预训练模型能够捕获文本的general knowlegde,但怎么样高效的适用于下游任务已让是一个关键的问题。
把PTM适用于下游任务是一个顺序的迁移学习任务,即顺序地学习任务,并且目标任务是带有标签的。
那么如何做预训练模型到下游任务的迁移呢?
- 选择一个合适的预训练任务、模型架构和下游任务训练语料库。
- 选择合适的网络层。可以选择只用BERT的第一层Embedding层,也可以直接在BERT的输出上加一层Top Layer,也可以把每一层的输入做一个加权,作为Encoder的输出。
- fine-tuning的技巧:mult-task learning、使用额外的适配模块进行fine-tuning、gradual unfreezing