从Embedding到XLNet:NLP预训练模型简介

机器学习实验室

共 4703字,需浏览 10分钟

 · 2021-05-06

深度学习


Author:louwill

Machine Learning Lab

     

迁移学习和预训练模型不仅在计算机视觉应用广泛,在NLP领域也逐渐成为主流方法。近来不断在各项NLP任务上刷新最佳成绩的各种预训练模型值得我们第一时间跟进。本节对NLP领域的各种预训练模型进行一个简要的回顾,对从初始的Embedding模型到ELMo、GPT、到谷歌的BERT、再到最强NLP预训练模型XLNet。梳理NLP预训练模型发展的基本脉络,对当前NLP发展的基本特征进行概括。


从Embedding到ELMo

词嵌入(Word Embedding,WE)是一种较为流行的词汇表征方法,其中word2vec是最主要的词嵌入工具。本文的主题是NLP预训练模型,词嵌入除了是一种词汇表征方法外,一种语言模型,更是一种标准的预训练过程。很长一段时间以来,词嵌入对于许多下游的NLP任务都大有裨益,例如,计算语义相似度、社交关系挖掘与推荐、向量检索等等。

但词嵌入本身也有很多硬伤。最严重的一个问题是多义词问题。作为自然语言中一种最常见的现象,词嵌入很难处理好这个问题。一个多义词的词嵌入如图1所示。
图1多义词词嵌入示例

图1所示是单词Bear的词嵌入展示,但Bear是个多义词,作为名词是熊的意思,作为动词又是忍受的意思。词嵌入在对Bear进行语义表征时,很难区分这两个含义。即使这两种含义出现在不同的上下文语义中,但是用语言模型进行训练的时候,无论什么样的上下文经过word2vec处理,都只会预测为语义相同单词Bear,而同一个单词占据的是同一行参数空间,这就使得这两种不同的上下文信息都会编码到相同的词嵌入空间中去,所以词嵌入无法处理多义词问题。

所以,对于多义词问题,从语言模型嵌入(Embedding from Language Models,ELMo)给出较好的解决方案。词嵌入的缺点在于静态表示,所谓静态表示就是word2vec在训练完之后每个单词的词向量都固定住了,在使用的时候就比较受限于应用场景。ELMo的思想也很简单,词嵌入有静态表示的缺点,那ELMo就来根据实际应用的上下文来对训练好的词嵌入进行动态调整。具体来说,ELMo先学习一个单词的词向量表示,这时候这个单词的词向量跟原始的词嵌入是一样的,不具备区分多义词的能力。在实际使用的时候,我们根据应用场景的上下文语义来调整单词的词向量表示,经过调整后的词向量就具备区分多义词能力了。

ELMo采用了双层双向的LSTM结构,由一个前向和一个后向语言模型构成,目标函数则取这两个方向语言模型的最大似然。ELMo结构如图2所示,左端的前向双层LSTM表示正方向的编码器,输入的是除目标单词之外的从左到右的上文Context-before,与之对应的右端的逆向双层代表反向编码器的逆序下文Context-after。

图2 ELMo结构

ELMo训练好之后即可根据下游的NLP任务来进行调整。具体就是从预训练网络中提取对应单词的网络各层的词向量作为新特征补充道下游的NLP任务,因为ELMo是以单词特征的形式提供给下游NLP任务的,所以这一类预训练方法也称之为Feature-based Pre-Training,即基于特征的预训练模型。另外一种基于Fine-Tuning的预训练方法下文会说到。


特征提取器:Transformer

一个好的NLP预训练模型,除了有能够适应各种场景的词嵌入表达外,更需要一个特征提取能力强大的网络结构。ELMo采用了双向双层的LSTM结构,但事后证明RNN和LSTM的特征提取能力还远远不够强大。下文要说到的GPT和BERT等超强的预训练模型大多都用到了一种叫Transformer的网络结构。Transformer在那篇著名的“Attention is all your need”的论文中正式提出,也正是在这篇文章里我们了解了注意力机制这样一种设计。传统的RNN或者LSTM的顺序计算机制存在以下两个比较严重的问题。
(1)时间步依赖于时间步时刻的计算结果,这也是RNN并行能力较差的原因;
(2)顺序计算过程中会存在信息丢失现象。

为此,Transformer抛弃了传统的CNN和RNN结构,本质是一种完全由Attention构成的网络。Transformer从结构上看依然是编码-解码架构,由自注意力(Self-Attention)、编码-解码注意力(Encoder-Decoder Attention)和前馈神经网络(Feed Forward Neural Network)构成,一个完整的Transformer结构编码和解码各采用了6层堆叠共12层的编码-解码结构,具体结构如图3所示。

图3 Transformer 结构


Transformer目前已经成功取代RNN和LSTM成为NLP预训练模型的主流的特征提取器,若是ELMo能将双向双层的LSTM结构换成Transformer,想来当时可能就会是另一种反响了。

低调王者:GPT

GPT模型很好的弥补了ELMo留下的遗憾。GPT的全称为“Generative Pre-Training”,意为生成式的预训练模型。在前面ELMo中我们提到NLP的预训练方法分为基于特征的预训练和基于微调的预训练,GPT就是一种基于微调的预训练方法。

GPT本质上跟ELMo较为类似,但有两点关键的区别:一是我们上面说的弥补了ELMo的遗憾,采用了Transformer取代了LSTM作为特征提取器,二是相对于ELMo的双向模型,GPT采用的是单向的语言模型。所谓单向,指的是相对于双向的预测目标词同时使用上下文信息来说只使用Context-before上文信息来做预测,不使用Context-after的下文信息。当然,单向模型相较于双向模型还是有一定的信息损失的,这也是GPT的一个缺点。GPT结构如图4所示。

图4 GPT结构

图中4左边是GPT使用的Transformer结构作为预训练,右边是如何根据具体的NLP任务来对GPT进行Fine-Tuning。使用了Transformer结构的GPT模型效果也非常惊艳,在基础的12个NLP任务里有9个达到了State of the Art。要说GPT有什么美中不足,那大概就是单向语言模型了。即使是后来的GPT-2,也只能算是放大版的GPT,仍然没有对单向语言模型进行修改。

封神之作:BERT

有了前面的积累,大名鼎鼎的BERT其实也就是水到渠成的事了。当初BERT横空出世,刷爆各种NLP记录榜,让人以为BERT会有什么里程碑式的结构创新。其实不然,正是有了ELMo、GPT和Transformer等研究工作的积累,才成就了今天的BERT。跟ELMo和GPT一样,BERT仍然是基于Finetune的预训练方法。

BERT的全称为Bidirectional Encoder Representations from Transformers,可以理解为基于Transformer的双向编码器表征,顾名思义,BERT的两大关键点就都有了:双向结构和Transformer特征提取器。BERT本质上就是双向的GPT,若是当初GPT把单向语言模型改成双向语言模型,估计后来也就没BERT什么事了。所以说,我们可以把BERT理解为一种以往研究的集成。BERT结构如图5所示。
图5 BERT结构

同样的两阶段模型,左图是BERT的预训练阶段,采用双向的Transformer结构进行特征提取,在Fine-Tuning阶段直接根据具体的NLP任务进行调整即可。到这里,我们基本上梳理清楚了ELMo、Transformer、GPT、和BERT之间的关系。

虽说BERT没有太大创新,只是做了一些集成工作,但架不住实际效果太好,一经面世就在各种NLP任务上刷出State of the Art,所以BERT依然是一项具有里程碑意义的工作。关于GPT和BERT本文还有很多像Masked语言模型等细节问题没有提到,感兴趣的读者可以把相关论文找出来仔细研读。

持续创新:XLNet

XLNet是一个类似BERT的模型。是一种通用的自回归预训练方法。正式介绍XLNet前,我们先来看两个概念。一个是自回归语言模型(Autoregressive LM),就是根据上文内容来预测下一个可能出现的单词,或者是反过来用下文来预测前文单词,这种语言模型就是自回归语言模型。我们前面提到的ELMo和GPT都是典型自回归语言模型。另一个概念是自编码语言模型(Autoencoder LM),关于自编码器我们会在本书的最后几章进行介绍,基于自编码器的语言模型是基本思想就是在输入序列中随机地抹去(Mask)掉一些单词,然后在预训练的时候预测这些被Mask掉的单词,通过自编码器的角度看,被Mask掉的这些单词可以视为向输入添加的噪声,BERT就是这种自编码语言模型的代表。

自编码语言模型和自回归语言模型正好相反。自编码语言模型能够比较好的融入双向模型,但输入端使用Mask使得预训练阶段和Fine-Tuning阶段会存在不一致的情况,因为在Fine-Tuning阶段被Mask掉的单词是没有标记的。所以BERT就存在这样的缺点。

为了解决BERT的这个问题,XLNet应运而生。相较于BERT的自编码语言模型,XLNet又用回了自回归语言模型,但与ELMo和GPT不一样的是XLNet采用一种新的方法来实现双向编码,这种方法叫作乱序语言模型(Permutation Language Model)。怎么个乱序法呢?具体如图6所示。假设输入序列X由X1、X2、X3和X4四个单词构成,现在要输入的单词ti为X3,位置是P3,我们想要它在上文Context-before中,也就是P1或者P2的位置看到位置P4的单词X4。乱序方法如下:先固定住X3所在位置P3,然后对序列的全部四个单词进行随机排列组合,从这个排列组合里选择一部分作为语言模型的输入X。假设随机选择的是X4,X2,X3,X1这样的组合,此时X3就能同时看到上文X2和下文X4的内容了。这种乱序的操作是XLNet的主要思想。
图6 XLNet乱序

为了捕捉更长距离的信息,XLNet采用了超长版本的Transformer特征提取器transformer-XL。一系列改进的结果就是XLNet在20个NLP任务上都以较大优势超越了此前的BERT,并且在18个任务上达到了State of the Art。

以上就是本文介绍的主要内容,基于深度学习的NLP目前正是一个变革巨大、发展迅速的领域,本文仅对一些重要的预训练模型进行一个简单的概览,很多细节方面还需要大家去进一步的学习。

往期精彩:

【原创首发】机器学习公式推导与代码实现30讲.pdf

【原创首发】深度学习语义分割理论与实战指南.pdf

 谈中小企业算法岗面试

 算法工程师研发技能表

 真正想做算法的,不要害怕内卷

 算法工程师的日常,一定不能脱离产业实践

 技术学习不能眼高手低

 技术人要学会自我营销

 做人不能过拟合

求个在看

浏览 40
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报