一、摘要
- 因为拥有双向建模的能力,降噪的自编码预训练模型(如BERT)通常会比基于自回归的语言模型拥有更好的效果。
- 但是BERT模型也存在缺陷,如忽略了masked位置之间的依赖关系、预训练和微调之间存在差异(预训练有mask标签,应用在下游任务的时候没有mask标签)。
- 本文提出的XLNet,整合了两大类模型的优点,改进了各自的缺点,主要改进:
- 通过最大化所有可能的分解顺序的排列的期望可能性去学习双向的文本依赖。
- 克服了BERT模型的缺点
- 融合了Transformer-XL的思想
- 在BERT论文使用的20个数据集中都取得了较大的进步
二、介绍
- 比较成功的预训练模型可以分为两大类:
- 自回归模型(AR)
- 自编码模型(AE)
- AR语言模型是利用自回归模型来估计文本的概率分布。具体地,对于一个序列x=(x1,…,xT),AR语言模型会将可能性分解为乘积的形式
(前向分解)
(后向分解)
- 因为**AR语言模型只能单向进行编码(前向或后向)**,所以无法获取文本双向的信息,这是造成AR模型和高质量的预训练模型差距的主要原因。
- ==AE模型则不需要计算文本的概率分布,它的主要方法是从损坏的数据中恢复原始数据。==例如BERT模型就是尝试将被masked的标签恢复成原始的标签。因为BERT不需要计算概率分布,所以可以轻松地学习文本的双向信息。
- 但是BERT模型假设了需要被预测的标签在给定未masked标签的情况下,它们是相互独立的。
- 因此本文提出的XLNet模型融合了两大模型的优点,并消除了缺点,主要做出了以下的改进:
- XLNet最大化序列(all possible permutations of the factorization order)所有可能的分解顺序的排列。基于这些排列操作,使得模型能够先学习上下文的信息。
- 作为一个AR语言模型 ,XLNet不需要去损坏数据,因此就不会造成预训练和微调之间的差异。与此同时,也**不需要像Bert模型一样假设被masked的标签相互独立**。
- XLNet借鉴Transformer-XL中的思想,融合了segment循环机制和相对位置编码到预训练模型中。
- 单纯使用Transformer-XL无法使得基于排列的模型工作,因为**会造成预测目标位置模糊的问题,所以提出了two-stream attention(双流注意力)机制来实现valid target-aware prediction distribution(目标感知预测)**。
- 上面提到的permutations of the factorization order(分解顺序的排列)不是说输入序列中的标签可以被随机排列,而是通过masked机制来实现不同的分解顺序。
三、背景
-
给定一个文本序列x=(x1,…,xT),AR语言模型通过最大化下面这个似然函数(前向)来实现预训练:
- 其中hθ(x1:t−1)代表神经网络模型产生的context representation(文本表示),如RNNs或传统的Transformer架构。e(x)表示x的embedding。
- 注意:这里的语言模型只能看到之间的时刻,因此记号是hθ(x1:t−1)。
-
BERT模型则是首先挑选文本序列中15%的token进行mask,得到一个损坏的序列 x ^ \hat{x} x^,然后尝试将 x ^ \hat{x} x^恢复成原始序列 x ‾ \overline{x} x,训练的目标如下:
- 其中mt=1代表xt被masked。Hθ(x)是一个Transformer Layer,它把长度为T的序列x映射为隐状态的序列Hθ(x)=[Hθ(x)1,Hθ(x)2,…,Hθ(x)T]
- 注意:因为BERT模型能够看到整个句子所有的token,因此记号是Hθ(x)。
-
两种模型优点和缺点的对比如下:
- 独立假设:第二式子是约等号,因为BERT模型假设了被mask的token之间是独立的,而AR模型就不存在这种问题,所以是等号。
- 输入噪音:因为BERT模型中加入了masked标签,所以会造成模型预训练和微调出现不一致的情况。而AR模型不存在这种问题。
- 文本依赖:AR模型只能看到hθ(x1:t−1),而BERT模型能够看到Hθ(x),因此BERT模型能够学习双向的依赖关系,而AR模型不能。
四、基于排列的语言模型
-
为了解决AR模型无法捕捉双向的上下文依赖问题,引入了permutations of the factorization order。具体来说,**对于一个长度为T的文本序列,那么就会有T!种有效的分解方式。**如果在不同的分解顺序中,模型的参数是共享的,这样模型就可以学习双向上下文信息。
-
例如,假设x=x1x2x3,那么总共用3!=6种分解方法:
p(x)=p(x1)p(x2|x1)p(x3|x1x2) 1->2->3
p(x)=p(x1)p(x2|x1x3)p(x3|x1) 1->3->2
p(x)=p(x1|x2)p(x2)p(x3|x1x2) 2->1->3
p(x)=p(x1|x2x3)p(x2)p(x3|x2) 2->3->1
p(x)=p(x1|x3)p(x2|x1x3)p(x3) 3->1->2
p(x)=p(x1|x2x3)p(x2|x3)p(x3) 3->2->1
-
注意p(x2|x1x3)指的是第一个词是x1,并且第三个词是x3的条件下,第二个词是x2的概率,也就是说原来词的顺序是保持的。如果理解为第一个词是x1并且第二个词是x3的条件下第三个词是x2,那么就不对了。
-
-
这里**定义几个记号**。ZT用来表示长度为T的序列的所有排列组成的集合。z∈ZT是一种排列方法。我们用zt来表示排列的第t个元素,而z<t表示z的第1到t-1个元素。
- 举个例子,假设T=3,那么ZT共有6个元素,我们假设其中之一z=[1,3,2],则z3=2,而z❤️=[1,3]。
- z可以理解为位置顺序,如[1,3,2],代表先1后3后2。
-
基于此,训练目标可以表示成下面的式子:
- 上面的式子其实就表示:从所有排列ZT中选取其中一种排列z,然后根据这个排列来计算条件概率的乘积,最后加起来。
-
因此不同排列之间模型的参数是共享的,所以就能够捕捉双向上下文信息。
-
我们保持原始序列顺序,使用与原始序列相对应的位置编码,并依靠transformer中注意力的mask来实现因子分解顺序的排列。
五、排列的语言模型存在的问题
现在我们讨论一个问题,假设输入的句子是“I love New York”,并且一种排列是[1,3,4,2]。我们假定要计算z3=4,那么根据公式会得到:
我们假设x是“York”,也就是pθ(X4=x)代表第4个词是York的概率。用普通话讲就是:当第一个词是I,第三个词是New的情况下,第四个词是York的概率是多少。
另外,我们再假设一种排列z’=[1,3,2,4]。我们假定要计算z3=2,那么根据公式会得到:
也就是上式代表第2个词是York的概率。用普通话讲就是:当第一个词I,第三个词是New,第二个词是York的概率是多少。
显然第一种情况的概率会更大,“New York”出现的概率明显会比“York New”大,但是上面两个的计算公式却是完全一样的,两个式子得出的概率是完全一样的。
上面问题的==关键就在于模型并不知道要预测的词在原始序列中的位置==。虽然Transformer中会有位置编码,但是这个时候是无法知道“York”在第四个位置的,如果能够知道,那都不用进行预测了。
为了方便后面的讨论,给出模型的一般形式。排定排列z,要计算pθ(Xzt|xz<t=x),那么就会使用如下的公式:
根据上面的讨论,原始的公式在进行预测的时候无法知道要预测的到底是哪个位置的词。为了解决问题,那么就**把位置信息zt加入到模型中。**,得到如下:
gθ(xz<t,zt)表示一个新的模型。
六、双流自注意力
-
虽然上面的模型中gθ(xz<t,zt)加入了位置信息,但是依然存在如何设定gθ(xz<t,zt)的问题。上面的模型中存在两个矛盾的需求:
- 为了去预测xzt,我们希望gθ(xz<t,zt)只能使用位置zt,而不能使用内容xzt,否则就等于知道答案了。
- 为了去预测xzj,其中j>t,也就是去预测t时刻后面的词,我们又希望gθ(xz<t,zt)携带内容xzt,这样才能获得完整的信息。
但是这两个需求是相互矛盾的。
-
为了解决上面这个问题,提出了使用两个隐藏层的方法。
- 内容隐状态hθ(xz<=t):简写为hzt。它的作用类似于普通Transformer中的隐藏状态。既能编码上下文(context),也能编码xzt。
- 查询隐状态gθ(xz<t,zt):简写为gzt。它只能编码上下文和要预测的位置zt,但是不包含xzt。
-
第一层的查询隐状态被定义为一个可训练的向量,gi(0)=w,第一层的内容隐状态被定义为hi(0)=e(xi),e代表embedding。
-
对于每一个self attention layer m=1,…,M,双流注意力的更新方式如下:
-
特别注意gzt不包含xzt,而hzt既包含zt,还包含xzt。
-
两个流分别使用自己的query向量gzt和hzt。但是Key和Value向量都是使用hzt,因为hzt是内容。
-
更新规则和标准的自注意力模型一致,所以在进行微调的时候,我们可以移除掉查询隐状态。最后在计算结果的时候我们可以用最上面一层的Query向量g(M)zt。
-
-
双流注意力的使用展示在下面这张图:
- 首先假设选取的分解排列顺序:3 -> 2 -> 4 -> 1
- 图(a)是计算内容流注意力的。现在假设计算z4=1的隐状态,可以看到h1(0)既被当做Q,也被当做K和V。并且能够获取上下文。
- 图(b)是计算查询流注意力的,同样假设计算z4=1的隐状态,可以看到g1(0)只被当做Q,没有被当做K和V,因为不能获得当前要预测位置的内容。K和V则是来自于其他上下文h。
- 图(c)是对整个计算过程的完整阐述。从下往上看,首先h和g分别被初始化为e(xi)和W。然后,内容流注意力和查询流注意力分别进行计算得到输出h(1)和g(1),然后计算第二层…依次类推。
- 我们仔细看图©中右边的Content stream,第一行全是红点,说明第一个位置能够看到所有的上下文。第二行的第2和第3个位置是红点,代表第二个位置只能看到第3个位置的内容和它自己的内容。依次类推。
- 我们仔细看图©中右边的Query stream,实际上和Content steam中的差不多,只是少了对角线的红点。因为查询流无法看到zt的内容。
七、部分预测
因为每个序列的分解排列顺序有很多种,所以计算量会很大,导致模型很难收敛。因此我们会尝试选择后面的一些位置进行预测。我们将排列z分为z<=c(非目标序列)和z>c(目标序列)。我们的目标函数就是y非目标序列对目标序列进行预测:
-
我们通常会定义一个超参数K来划分要预测的位置和不用预测的位置。
八、融入Transformer-XL的思想
-
XLNet融合了Transformer-XL中的两方面内容:相对位置编码和segment循环机制。
-
现在假设有两个segment, x ~ \tilde{x} x~=S1:T 和 x=ST+1:2T,产生两个排列 z ~ \tilde{z} z~和z。然后我们根据 z ~ \tilde{z} z~计算出每一层的内容隐藏状态 h ~ \tilde{h} h~(m),然后接着就可以将这些内容隐藏状态用到下一个segment的计算中去了。
- […,…]代表沿着序列维度方向进行concat
- 注意:因为位置编码是原始序列位置的编码。所以在计算第二个segment时,我们只需要知道隐状态 h ~ \tilde{h} h~(m)就可以了,而并不需要知道它是通过哪个排列 z ~ \tilde{z} z~计算出来的。这样我们在cache前一个segment时不用考虑它的排列。 期望上,模型可以从之前的segment的隐藏状态中获取所有排列方式的信息。
九、建模多个Segment
-
对于多个输入片段,和bert模型一样,XLNet采用[CLS, A, SEP, B, SEP]的方式来进行分割。但是XLNet没有整合NSP任务,因为消融实验发现对于模型并没有改进。
-
在XLNet模型中,采用了相对位置编码。给定序列中的第i个和第j个位置,如果i和j来自于同一个segment,那么就使用片段编码 sij=s+,否则sij=s-。
-
换句话说,我们只关心两个位置是否来自于同一个segment,而不需要关心它们具体来自于哪个segment。
-
当i attend j的时候,可以通过下面的公式计算注意力分数。
- qi代表标准注意力模型中的query向量,b是可以学习的偏置向量,sij则代表segment encoding。计算出aij之后在加到普通的注意力分数中去。
十、BERT和XLNet的不同
这一小节讨论了BERT和XLNet在预测单词时的区别。
假设输入的句子是[New, York, is, a, city],并且使用BERT和XLNet来对[New, York]来进行预测。并且我们假设XLNet中的其中一种排列xz=[is, a, city, New, York]。那么两种方式的区别就在于:
可以看到Bert忽略了New和York之间的关系。
十一、实验
-
XLNet和BERT采用相同的超参数进行比较,得到如下结果:
-
XLNet和RoBERTa模型进行比较:
十二、消融实验
实验结果如下:
span-based prediction代表首先选定长度L∈[1,…,5],然后随机地选择连续的长度为L的子序列(target)来进行预测
十三、双流注意力的内部实现
十四、总结
XLNet主要创新点就是解决了自回归模型不能编码双向上下文的问题,并且根据自回归本身的特点规避了Bert模型的缺陷。
XLNet整合双流注意力机制和分解排列顺序组合的方式来实现编码双向上下文,并融合了Transformer-XL中的思想。