来源:https://zhuanlan.zhihu.com/p/565555312
预训练语言模型是NLP中的核心之一,在pretrain-finetune这一阶段的NLP发展中发挥着举足轻重的作用。预训练语言模型的无监督训练属性,使其非常容易获取海量训练样本,并且训练好的语言模型包含很多语义语法知识,对于下游任务的效果会有非常明显的提升。
本文首先介绍预训练语言模型的里程碑方法,然后进一步介绍学术界针对预训练语言模型中的问题提出的各种改进和创新,包括14个经典预训练语言模型。喜欢追踪最新技术,记得关注、收藏、点赞。
预训练语言模型要从词向量说起。词向量利用文本数据,构造出词之间的共现关系,一般将在一句话中共现的词作为正样本,随机负采样构造负样本,采用CBOW或Skip-Gram的方式进行训练,以此达到让经常共现的词,能够具有相似向量化表示。其本质是NLP中的一个先验:频繁在文本中共现的两个词,往往语义是相近的。然而,词向量的问题也比较明显,同一个词在不同的语境中,含义往往是不同的,而词向量对于某一个词只能生成一个固定的向量,无法结合语境上下文信息进行调整。
_Deep contextualized word representations(ACL 2018)_提出了ELMo模型,利用双向LSTM模型结合上下文语境信息生成词的embedding。ELMo和以往的词向量模型最大的差别是,每个词的embedding都是整个句子的一个函数,即每个词的embedding和这个句子的上下文信息是相关的。ELMo语言模型的模型结构采用了一个正向LSTM和一个反向LSTM联合训练的方式,优化两个方向的语言模型优化目标。在完成训练后,每个单词在每层LSTM都会产生正向、反向两个embedding,对每个单词所有层的embedding拼接在一起,得到这个词在这句话中的embedding。ELMO在使用到下游任务时,会把数据每句话先过一遍ELMo,得到每个词的embedding,然后将ELMo生成的embedding和通过词向量得到的embedding拼接到一起,用于后续任务预测。
此后,语言模型预训练成为NLP中的核心之一。在_Improving Language Understanding by Generative Pre-Training(2018)中提出了GPT模型。相比ELMo,GPT真正意义实现了pretrain-finetune的框架,不再需要将模型中的embedding取出来,而是直接把预训练好的模型在下游任务上finetune,对于不同任务采用不同的输入或输出层改造,让下游任务更贴近上游预训练模型。值得一提的是,在后续的prompt等优化中,又将下游任务向上游任务的贴近更近了一步,即将下游任务的输入和输出逻辑也进行变化去适应上游任务。让下游任务向上游任务对齐,是一个NLP中的发展方向。GPT模型主体采用的是Attention Is All You Need(NIPS 2017)_提出的Transformer模型,使用的优化目标是正向语言模型。
_BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding(2018)_提出了Bert模型,也是目前在NLP中应用最广泛的预训练模型之一。相比GPT和ELMo,Bert采用了一种Mask Language Model(MLM)这一不同的目标,通过随机mask掉输入文本中的某些token,然后利用上下文信息进行预测,实现对数据语义关系的提取。这种MLM相比之前的语言模型优化目标优点是,可以从多个方向同时进行信息抽取来预测当前token,而传统的语言模型(前向后后向)每一次只能从一个方向提取信息。即使将前向和后向结合,也无法实现真正意义上的同时利用前后文信息预测当前token。同时,Bert还引入了Next Sentence Prediction(NSP)任务,在预训练阶段构造了两个文本pair对输入,预测这两个文本的相关性。这个任务相当于是在sentence维度的信息提取,和下游的文本匹配类任务更加契合,这在单纯的语言模型中是难以学到的。
对Bert、GPT、ELMo三者模型结构图的一个简要对比如下,可以帮助更清晰的理解三类模型的差异。
上文介绍了ELMo、GPT、Bert等3个预训练语言模型的代表工作。下面我们梳理一下,在此之后,学术界对这些经典的预训练语言模型进行了哪些方面的改进和创新。
在GPT之后,OpenAI进一步提出了GPT-2、GPT-3,旨在通过更大的模型容量、更多的训练语料进一步提升预训练语言的效果。_Language Models are Unsupervised Multitask Learners(2018)提出了GPT-2。本文相比GPT增加了语料、增大了模型尺寸,模型的基本结构和GPT差不多。GPT-2的核心思想是,任何一个有监督NLP任务,都可以看成是语言模型的一个子集,只要预训练语言模型的容量足够大,理论上就能解决任何NLP任务。任何NLP任务都可以表示成p(output | input, task)的形式,语言模型就是无监督的多任务学习。因此GPT-2的核心就是提升模型的容量和数据多样性,让语言模型能够达到解决任何任务的程度。在随后的Language Models are Few-Shot Learners(2020)_中提出了GPT-3,进一步增大了模型尺寸,模型参数量是GPT-2的100倍。GPT-3的核心思想在于不进行finetune(zero-shot learning)就可以对下游任务生成预测结果,其做法为将下游任务转换为一系列的文本,直接通过语言模型预测出结果。下图为一个例子,对比了finetune方法和GPT-3中提出的zero-shot方法的区别,便于对这种预测方法进行理解。通过增加对任务的描述文本,来让模型知道当前要解决什么任务,进而实现预测。
可以看出,GPT的后续优化思路,建立在不断提升训练语料丰富度和模型容量,使语言模型能够从大量文本中学习到各个NLP任务的解决方法,再通过zero-shot learning的方式实现不进行finetune,而是将下游任务转换成语言模型的输入形式,来让预训练模型直接进行下游任务预测。这种prompt的形式是目前NLP领域的研究热点和发展趋势。
在Bert的基础上,有很多针对其的改进,这里我们主要介绍3个模型。_RoBERTa: A Robustly Optimized BERT Pretraining Approach(2019)_细致的对Bert模型的训练方式进行了对比实验和分析,并基于此总结出了能够提升Bert效果的训练方法。相比Bert,RoBerta的主要改进在于3个方面。首先采用了dynamic mask,即每个文本进入训练时动态mask掉部分token,相比原来的Bert,可以达到同一个文本在不同epoch被mask掉的token不同,相当于做了一个数据增强。其次,分析了训练样本应该如何构造,原来的Bert采用segment pair的形式,训练样本为两个segment组合到一起并使用NSP任务预测两个任务是否相关。RoBERTa发现从同一个document构造输入单句子的输入文本而非pair对,并且不使用NSP任务,效果会有一定提升。最后,RoBERTa增大了batch size以及对BPE(输入文本的分词方法进行了升级。
_ALBERT: A LITE BERT FOR SELF-SUPERVISED LEARNING OF LANGUAGE REPRESENTATIONS(2020)_提出了一个轻量级的Bert模型,以此降低Bert的运行开销。为了减少Bert资源开销,本文主要提出了两个优化:Factorized embedding parameterization以及Cross-layer parameter sharing。Factorized embedding parameterization对输入的embedding进行分解,原始的Bert将token输入的embedding维度E和模型隐藏层维度H绑定了,即E=H,前者表示每个token固有信息,后者表示每个token结合了上下文的动态信息,后者被证明是更重要的。因此本文提出可以让E和H解绑,选择一个较小的E不会影响模型效果,同时显著降低了由于输入词表V变大带来的内存开销上升。具体的,将E变成远小于H的维度,再用一层全连接将输入embedding映射到H维。这样模型embedding部分参数量从VH下降到了VE+E*H。Cross-layer parameter sharing让Bert每层的参数是共享的,以此来减小模型参数量。除了上述两个降低Bert运行开销的优化外,ALBERT提出了inter-senetnce loss这一新的优化目标。原来Bert中的NSP任务可以理解为topic prediction和coherence prediction两个任务。其中topic prediction是一种特别简单的任务,由于其任务的简单性,导致coherence prediction学习程度不足。本文提出将coherence prediction单独分离出来,相比Bert,正样本仍然是一个document相邻的两个segment,负样本变成这两个segment的顺序交换。
_ELECTRA: PRE-TRAINING TEXT ENCODERS AS DISCRIMINATORS RATHER THAN GENERATORS(ICLR 2020)_对pretrain阶段的MLM任务进行了优化。该方法的核心思路采用了GAN的思路。模型包括一个generator 和一个discriminator。输入文本仍然会被随机mask,然后generator会生成被mask掉的token,这里和MLM类似。而discriminator会判断每个位置的token是否是generator生成的(如果generator正好生成了正确的token,也认为其生成的是正确的)。通过这种对抗学习的方式,让discriminator预测被mask掉的token能力逐渐增强,也即从文本中提取信息的能力增强。最终的预训练模型使用的是discriminator部分。ELECTRA的缺点在于由于有了一个单独的Generator,模型整体开销会更大,Generator一般采用一个参数量较少的MLM。
_ERNIE: Enhanced Language Representation with Informative Entities(2019)_从知识增强的角度对Bert进行优化。相比原来的Bert,ERNIE引入了如知识图谱等外部知识信息。这样的好处在于,有一些文本如果不知道某些词组代表一个实体的话,模型是很难学习的,例如一些人名、地名等。如下面的例子,不知道橘子中的这些实体是书名、歌名,就无法识别出作者的职业。
ERNIE在Bert中引入了知识图谱中的实体信息,模型结构如下图。模型主要分为T-Encoder和K-Encoder两个部分。T-Encoder类似Bert,从输入的文本上提取每个token的信息表示。K-Encoder主要是引入知识信息,将输入文本中的实体识别出来,然后获取这些实体的embedding(利用TransE在构造好的知识图谱上预训练得到),然后将token的embedding和实体的embedding进行一个融合,融合方法是将实体embedding添加到对应token序列的位置。每层融合输入上一层的token embedding和entity embedding,生成新的token embedding和entity embedding,公式可以表示为:
此外,ERNIE在预训练阶段增加了token-entity relation mask任务,在20%的entity上,会mask掉token和entity的对齐关系,让模型来预测当前token对应的是哪个entity。
此外,还有一个同名工作_ERNIE: Enhanced Representation through Knowledge Integration(2019)_也使用了类似的思路,希望通过引入外部知识信息提升预训练模型效果。和Bert主要差别在于,本文将MLM任务分成basic-level、phrase-level、entity-level三种类型,在entity-level mask中,mask掉的不是单个token,而是输入文本中某个entity对应的连续多个token,其和Bert的差异如下图。
后面这篇工作后续又推出了2.0版本,ERNIE 2.0: A Continual Pre-Training Framework for Language Understanding(2019)。该工作在pretrain阶段引入了很多task来辅助pretrain阶段的学习。首先构造pretrain阶段的任务,主要是无监督或弱监督的训练数据容易获得的任务,同时也会引入知识图谱中的信息构造一些训练任务。接下来,本文采用continual multitask learning的方式,不断构造新的任务,并且以增量的方式进行多任务学习,每来一个任务都把历史所有任务放到一起进行多任务学习,避免忘记历史学到的知识。本文的核心点在于提出的多种构造预训练任务的方式,包括Knowledge Masking Task(即上一篇ERNIE中的对entity或phrase进行mask)、Capitalization Prediction Task、Token-Document Relation Prediction Task等,感兴趣的同学可以阅读论文深入了解。
在GPT和BERT的启发下,后续涌现了很多其他类型的预训练语言模型,这里主要介绍UniLM、XLNet、BART这3种。
_Unified Language Model Pre-training for Natural Language Understanding and Generation(NIPS 2019)_提出了UniLM预训练语言模型。本文首先总结了之前语言模型的特点:EMLo采用前向+后向LSTM、GPT采用从左至右的单向Transformer、BERT采用双向Attention。虽然BERT的双向Attention取得很好效果,但是这种特性也导致其无法像GPT等使用单向方法的语言模型一样适用于文本生成这种任务。UniLM融合了3种语言模型优化目标,通过精巧的控制mask方式来在一个模型中同时实现了3种语言模型优化任务,在pretrain过程交替使用3种优化目标。下图比较形象的描述了UniLM是如何利用mask机制来控制3种不同的优化任务,核心思路是利用mask控制生成每个token时考虑哪些上下文的信息。
_XLNet: Generalized Autoregressive Pretraining for Language Understanding(NIPS 2019)_提出了XLNet模型,融合了BERT和GPT这两类预训练语言模型的优点,并且解决了BERT中pretrain和finetune阶段存在不一致的问题(pretrain阶段添加mask标记,finetune过程并没有mask标记)。本文将无监督语言模型分成两类,一类是AR自回归模型,如GPT、ELMo这种使用单向语言模型建模概率分布的方法;另一类是AE自编码模型,如BERT这种通过预测句子中token的方法。XLNet融合了AR模型和AE模型各自的优点,既能建模概率密度,适用于文本生成类任务,又能充分使用双向上下文信息。XLNet实现AR和AE融合的主要思路为,对输入文本进行排列组合,然后对于每个排列组合使用AR的方式训练,不同排列组合使每个token都能和其他token进行信息交互,同时每次训练又都是AR的。但是,实现这种模式也存在很多问题,文中针对这些问题提出了解法,由于篇幅原因具体内容我们会在后续相关文章再进行详细介绍。
_BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension(2019)_提出了一种新的预训练范式,包括两个阶段:首先原文本使用某种noise function进行破坏,然后使用sequence-to-sequence模型还原原始的输入文本。下图中左侧为Bert的训练方式,中间为GPT的训练方式,右侧为BART的训练方式。首先,将原始输入文本使用某些noise function,得到被破坏的文本。这个文本会输入到类似Bert的Encoder中。在得到被破坏文本的编码后,使用一个类似GPT的结构,采用自回归的方式还原出被破坏之前的文本。
文中尝试了多种类型的noise function,如token masking、sentence permutation、text infilling等,其中sentence permutation+text infilling的方式取得了最好的效果。Text infilling指的是随机mask某些span。下图展示了文中提出的一些noise function方法。
本文介绍了预训练语言模型的发展历程,包括EMLo、BERT、GPT等经典模型,也包括在此基础上的一些改进创新。预训练语言模型对于NLP来说非常重要,未来的研究趋势也在让下游任务更加去适配预训练模型,以此来最大程度发挥预训练模型的能力。
面向小白的顶会论文核心代码库:https://github.com/xmu-xiaoma666/External-Attention-pytorch
面向小白的YOLO目标检测库:https://github.com/iscyy/yoloair
面向小白的顶刊顶会的论文解析:https://github.com/xmu-xiaoma666/FightingCV-Paper-Reading