[NLP]XLNet论文理解

论文地址:https://arxiv.org/pdf/1906.08237.pdf

简介

XLNet是一个类似BERT的模型,但是它采用了通用的自回归预训练方法(AR模型),而基于DAEBert模型采用的则是降噪自动编码方法(AE模型)bertAR模型的区别主要是在以下三方面:

1、独立假设:bert中一个序列中会被mask掉不超过15%的单词,但是在预训练时的目标函数是基于mask值彼此独立、互不干扰的假设下进行计算的,而AR模型中不需要设置mask值,预训练时的目标函数也不必设立独立假设。同时,mask的设置会导致预训练-微调的数据上的不统一,这也是Bert的一个缺陷。

2、输入噪声:Bert在预训练时对输入序列进行随机mask,这是一种输入噪声设定,但是在下游任务进行微调时却并没有对输入序列设置输入噪声,即随机mask,这引起了预训练-微调间的差异。与之相反,AR模型不设置输入噪声,因而不会有这种问题。

3、上下文依赖:AR模型只考虑前向信息或者后向信息,而bert要考虑双向信息,结果就是,bert的目标函数允许模型被训练为能够更好地抓取双向信息。

XLNet(AR模型)总体思路

XLNet提出了一种让AR语言模型(单向的输入和预测模式)能够从双向上下文中学习的新方法。这也是XLNet的主要贡献。

XLNet仍然采用两阶段模型训练过程,第一阶段是语言模型预训练阶段,第二阶段是任务数据fine-tuning阶段。它主要改动了第一阶段,即不使用bert那种带mask符号的Denoising-autoencoder的模式,而是采用自回归语言模型。就是说,一个输入序列X依然是从左向右输入,在预测单词T时,既知道它的上文信息context_before,也知道它的下文信息contenx_after,但是,这里不采用bert使用mask符号的方式。于是在预训练阶段,这是一个标准的从左向右过程,在微调阶段也是如此,因此两个过程就统一起来,不会造成两阶段的数据不一致问题[3]。而这里具体的实现方法,就是论文提出的排列语言模型。

训练目标:排列语言模型(Permutation Language Modeling)[3]

PLM的中心思想就是重新排列组合输入序列X。具体的说,假设输入序列X = [x1,x2,x3,x4],我们想要预测x3

1、使用AR模型的常规操作:按照AR模型自左向右的输入X,我们只能看到x3的上文context_before(即x1,x2),而不能看到x3的下文context_after(即x4)。

2、使用PLM的方法:我们需将待预测单词x3固定在它本来的位置上(即Position 3),然后将输入序列X中的元素进行随机排列组合(此例中共会产生24种组合方式),在这24种组合中,抽取一部分(如:x4,x2,x3,x1)作为模型的输入X,则待预测单词x3既能看到上文x1,x2,也能看到下文x4,达到了获取上下文信息的目的,但是在形式上依然是从左向右在预测后一个单词。具体如下图所示:

这里解释一下右上图,即Factorization order:2 -> 4 -> 3 -> 1这张图,可以看出在计算h3(1)时,它只获取了x2,x4mem(0)的信息,即获取了x3的下文信息x4

1由图中可以看出,它并没有更改输入顺序,输入顺序仍然为x1,x2,x3,x4,但是Transformer在获取输入信息时,它只获取了x4x2,这是因为attentionx1 mask掉了,这一过程是在Transformer中实现的,具体描述在下一节中讲述。 

PLM的优势如下:

1、保证预训练-微调两个阶段的一致性,规避了bert模型的劣势(预训练-微调数据不一致以及多个mask之间的独立假设)

2、获取双向信息(AR模型只能获取单向信息)

结构:双流自注意力(Architecture: Two-Stream Self-Attention for Target-Aware Representations )

双流主要是指内容流和查询流,具体介绍如下:

内容流(content stream):指标准的Transformer过程

查询流(query stream)[3]:只保留位置信息,忽略内容信息。具体的说,对于待预测单词x3来说,已知其上文信息x1,x2,因为x3是需要被预测的单词,因此在Transformer的输入端不能输入x3的单词内容,需要将其遮挡掉,bert采用的方法是将x3 mask掉,即使用[MASK]标记符号作为x3的输入内容,但是这引起了预训练-微调数据不一致问题,xlnet既想看不到x3单词的内容,又不想像bert一样引入新的问题,它采取的方式就是使用query流,直接忽略掉x3的单词内容,而只使用x3的位置信息,使用参数w来代表位置的embedding编码。具体的实现过程如下所述:

输入序列依然是x1,x2,x3,x4,但是在Transformer内部,则是针对内容流和查询流分别有遮掩矩阵。就本文例子来说,需要遮掩的是x3,则在下图c中,由于使用的新的排列组合是x3,x2,x4,x1,因此,Query steam对应的遮掩矩阵中第三行中是空,因为没有其他的单词需要被输入。

同理,对于Content stream来说,由于Transformer的输入顺序是x3,x2,x4,x1,因此对于第一行x1来说,它可以将所有的单词都读入,因此矩阵第一行中所有圆点都被标为红色(表示x1,x2,x3,x4的信息都获取);对于第二行x2来说,它只能获取x3的信息以及自己的信息,因此第二个和第三个圆点标为红色(表示x2,x3的信息都获取);对于第三行x3来说,因为它只能读取自己的信息,因此只有第三个圆点标为红色(表示x3的信息被获取);对于第四行x4来说,由于它能获取x2x3以及自己的的信息,因此其第二、三、四个圆点被标为红色(表示x2,x3,x4的信息都获取)

由于Content Stream Query Stream的区别仅在于自己的信息是否能获取,而Query Stream不能获取自己的信息,因此Query Stream的遮掩矩阵中对角线的圆点都为白色,表示不能获取自己的内容信息。

如上图所示,图a表示内容流(content stream),图b表示查询流(query stream),图c是使用了双流自注意力机制的排列语言模型。

Transformer-XLIncorporating Ideas from Transformer-XL

针对Transformer不能很好地处理长文本的问题,论文在预训练架构中使用了Transformer-XL,相比Transformer而言,主要有两点改进:片段循环机制(segment recurrence mechanism)和相对位置编码(relative positional encoding)。具体内容可以查看网址:https://www.cnblogs.com/mj-selina/p/12373636.html

Transformer Transformer-XL的区别主要如下图所示:

  

如上图[4]所示,在计算第l层的表征时,使用的第l-1层的表征同时来源于片段stst-1(也可以设置成来源于前n个片段),所以每增加一层,模型建模的依赖关系长度就能增加2(不知道理解的是否正确,待修改)。在上图中,Transformer-XL建模的最长依赖关系为3*2=6. 

总结

论文中的实验显示,XLNet在长文本的阅读理解类的任务上提升较为明显,因而在机器翻译、文本摘要类的任务中应该具有较好的效果。

参考资料:

[1] https://www.jianshu.com/p/dfc5a77a4f3f

[2] https://blog.csdn.net/u012526436/article/details/93196139

[3] https://zhuanlan.zhihu.com/p/70257427

[4] https://blog.csdn.net/weixin_37947156/article/details/93035607

原文地址:https://www.cnblogs.com/mj-selina/p/12427640.html