简介

18年底谷歌爸爸推出了bert,该模型一经问世就占据了nlp界的统治地位,如今CMU和google brain联手推出了bert的改进版xlnet。在这之前也有很多公司对bert进行了优化,包括百度、清华的知识图谱融合,微软在预训练阶段的多任务学习等等,但是这些优化并没有把bert致命缺点进行改进。xlnet作为bert的升级模型,主要在以下三个方面进行了优化

  • 采用AR模型替代AE模型,解决mask带来的负面影响
  • 双流注意力机制
  • 引入transformer-xl

在下文中,我将会为大家详细介绍这三个优化点

AR与AE语言模型

目前主流的nlp预训练模型包括两类 autoregressive (AR) language model 与autoencoding (AE) language model,AR模型的主要任务在于评估语料的概率分布,例如,给定一个序列 X = ( x 1 , . . . , x T ) X=(x_1,...,x_T) X=(x1,...,xT),AR模型就是在计算其极大似然估计 p ( X ) = ∏ t = 1 T p ( x t ∣ x < t ) p(X) = \prod_{t=1} ^T p(x_t|x_{<t}) p(X)=t=1Tp(xtx<t)即已知 x t x_t xt之前的序列,预测 x t x_t xt的值,当然也可以反着来 p ( X ) = ∏ t = 1 T p ( x t ∣ x > t ) p(X) = \prod_{t=1} ^T p(x_t|x_{>t}) p(X)=t=1Tp(xtx>t)即已知 x t x_t xt之后的序列,预测 x t x_t xt的值,看完之后相信你也能发现AR模型的缺点,没错该模型是单向的,我们更希望的是根据上下文来预测目标,而不单是上文或者下文,之前open AI提出的GPT就是采用的AR模式,包括GPT2.0也是该模式,那么为什么open ai头要这么铁坚持采用单向模型呢,看完下文你就知道了。

AE模型采用的就是以上下文的方式,最典型的成功案例就是bert。我们简单回顾下bert的预训练阶段,预训练包括了两个任务,Masked Language Model与Next Sentence Prediction,Next Sentence Prediction即判断两个序列的推断关系,Masked Language Model采用了一个标志位[MASK]来随机替换一些词,再用[MASK]的上下文来预测[MASK]的真实值,bert的最大问题也是处在这个MASK的点,因为在微调阶段,没有MASK这就导致预训练和微调数据的不统一,从而引入了一些人为误差,我觉得这应该就是为什么GPT坚持采用AR模型的原因。

在xlnet中,最终还是采用了AR模型,但是怎么解决这个上下文的问题呢,这就是本文的一个重点。

排列语言模型

为了解决上文提到的问题,作者提出了排列语言模型,该模型不再对传统的AR模型的序列的值按顺序进行建模,而是最大化所有可能的序列的排列组合顺序的期望对数似然,这句话可能有点不好理解,我们以一个例子来详细说明,假如我们有一个序列[1,2,3,4],如果我们的预测目标是3,对于传统的AR模型来说,结果是 p ( 3 ) = ∏ t = 1 3 p ( x t ∣ x < t ) p(3)=\prod_{t=1}^3p(x_t|x_{<t}) p(3)=t=13p(xtx<t),如果采用本文的方法,先对该序列进行排列组合,最终会有24种排列方式,下图是其中可能的四种情况,对于第一种情况因为3的左边没有其他的值,所以 p ( 3 ) p(3) p(3)可以用其先验概率来表示,第二种情况3的左边还包括了2与4,所以得到的结果是 p ( 3 ) = p ( 2 ) ∗ p ( 4 ∣ 2 ) ∗ p ( 3 ∣ 2 , 4 ) p(3)=p(2)*p(4|2)*p(3|2,4) p(3)=p(2)p(42)p(32,4),后续的情况类似,通常我们会使用第三种排列的方法,因为可以考虑到所有的上下文。聪明的你一定发现了,这样处理过后不但保留了序列的上下文信息,也避免了采用mask标记位,巧妙的改进了bert与传统AR模型的缺点。
在这里插入图片描述

基于目标感知表征的双流自注意力

虽然排列语言模型能满足目前的目标,但是对于普通的transformer结构来说是存在一定的问题的,为什么这么说呢,我们先看下AR模式下的likelihood

p θ ( X z t = x ∣ x z < t ) = e x p ( e ( x ) T h θ ( x z < t ) ) ∑ x ′ e x p ( e ( x ′ ) T h θ ( x z < t ) ) p_{\theta} (X_{z_t}=x | x_{z_{<t}}) = \frac{exp(e(x)^Th_{\theta}(x_{z_{<t}}))}{\sum_{x'} exp(e(x')^Th_{\theta}(x_{z_{<t}}))} pθ(Xzt=xxz<t)=xexp(e(x)Thθ(xz<t))exp(e(x)Thθ(xz<t))

其中 h θ ( x z < t ) h_{\theta}(x_{z_{<t}}) hθ(xz<t)表示的是由模型得到的上文表示, e ( x ) e(x) e(x) x x x的embedding,这里的 h θ ( x z < t ) h_{\theta}(x_{z_{<t}}) hθ(xz<t)并不依赖于其要预测的内容的位置信息,这就会导致预测出来的结果没有考虑到位置信息,我们看个例子

假如我们有两个序列ABCD与ABDC,这两个序列的排列组合的结果都是一样的,假如我们要预测C取的排列方式是:ABCD,那么采用AR的方式就只会考虑AB作为上文,最终模型得到的结果就是一样的,但实际上我们预测C的时候,第一种情况的C在第三个位置,第二种情况的C在第四个位置,应该是不一样的结果才对。

因此如果不考虑目标的位置信息,就会导致排列组合后的结果一样,或者说transformer输出的结果一样。这就导致模型没法得到正确的表述,为了解决这个问题,论文中提出来新的分布计算方法,来实现目标位置感知

p θ ( X z t = x ∣ x z < t ) = e x p ( e ( x ) T g θ ( x z < t , z t ) ) ∑ x ′ e x p ( e ( x ′ ) T g θ ( x z < t , z t ) ) p_{\theta} (X_{z_t}=x | x_{z_{<t}}) = \frac{exp(e(x)^Tg_{\theta}(x_{z_{<t}},z_t))}{\sum_{x'} exp(e(x')^Tg_{\theta}(x_{z_{<t}},z_t))} pθ(Xzt=xxz<t)=xexp(e(x)Tgθ(xz<tzt))exp(e(x)Tgθ(xz<tzt))

其中 g θ ( x z < t , z t ) g_{\theta}(x_{z_{<t}},z_t) gθ(xz<tzt)是新的表示形式,并且把位置信息 z t z_t zt作为了其输入。

接下来我们就详细来讲解下这个新的表示形式,论文把该方法称为Two-Stream Self-Attention,双流自注意力,该机制需要解决了两个问题

  • 如果目标是预测 x z t , g θ ( x z < t , z t ) x_{z_t},g_{\theta}(x_{z_{<t}},z_t) xztgθ(xz<tzt)那么只能有其位置信息 z t z_t zt而不能包含内容信息 x z t x_{z_t} xzt
  • 如果目标是预测其他tokens即 x z j , j > t x_{z_j}, j>t xzjj>t,那么应该包含 x z t x_{z_t} xzt的内容信息这样才有完整的上下文信息

我们详细看下这两种不同的表述

  • content representation内容表述,即 h θ ( x z ≤ t ) h_{\theta}(x_{z_{\le t}}) hθ(xzt),下文用 h z t h_{z_t} hzt表示,该表述和传统的transformer一样,同时编码了上下文和 x z t x_{z_t} xzt自身

h z t ( m ) = A t t e n t i o n ( Q = h z t ( m − 1 ) , K V = h z ≤ t ( m − 1 ) ; θ ) h_{z_t}^{(m)} = Attention(Q=h_{z_t}^{(m-1)},KV=h_{z \le t}^{(m-1)};\theta) hzt(m)=Attention(Q=hzt(m1),KV=hzt(m1);θ)
在这里插入图片描述

  • query representation查询表述,即 g θ ( x z < t , z t ) g_{\theta}(x_{z_{<t}},z_t) gθ(xz<tzt),下文用 g z t g_{z_t} gzt表示,该表述包含上下文的内容信息 x z < t x_{z_{<t}} xz<t和目标的位置信息 z t z_t zt,但是不包括目标的内容信息 x z t x_{z_t} xzt,从图中可以看到,K与V的计算并没有包括Q,自然也就无法获取到目标的内容信息,但是目标的位置信息在计算Q的时候保留了下来,

g z t ( m ) = A t t e n t i o n ( Q = g z t ( m − 1 ) , K V = h z < t ( m − 1 ) ; θ ) g_{z_t}^{(m)} = Attention(Q=g_{z_t}^{(m-1)},KV=h_{z < t}^{(m-1)};\theta) gzt(m)=Attention(Q=gzt(m1),KV=hz<t(m1);θ)
在这里插入图片描述

最后我们看下总的计算过程,首先,第一层的查询流是随机初始化了一个向量即 g i ( 0 ) = w g_i^{(0)}=w gi(0)=w,内容流是采用的词向量即 h i ( 0 ) = e ( x i ) h_i^{(0)}=e(x_i) hi(0)=e(xi),self-attention的计算过程中两个流的网络权重是共享的,最后在微调阶段,只需要简单的把query stream移除,只采用content stream即可。

在这里插入图片描述

集成Transformer-XL

除了上文提到的优化点,作者还将transformer-xl的两个最重要的技术点应用了进来,即相对位置编码与片段循环机制。我们先看下片段循环机制。

片段循环机制

transformer-xl的提出主要是为了解决超长序列的依赖问题,对于普通的transformer由于有一个最长序列的超参数控制其长度,对于特别长的序列就会导致丢失一些信息,transformer-xl就能解决这个问题。我们看个例子,假设我们有一个长度为1000的序列,如果我们设置transformer的最大序列长度是100,那么这个1000长度的序列需要计算十次,并且每一次的计算都没法考虑到每一个段之间的关系,如果采用transformer-xl,首先取第一个段进行计算,然后把得到的结果的隐藏层的值进行缓存,第二个段计算的过程中,把缓存的值拼接起来再进行计算。该机制不但能保留长依赖关系还能加快训练,因为每一个前置片段都保留了下来,不需要再重新计算,在transformer-xl的论文中,经过试验其速度比transformer快了1800倍。

在xlnet中引入片段循环机制其实也很简单,只需要在计算KV的时候做简单的修改,其中 h ~ ( m − 1 ) \tilde h^{(m-1)} h~(m1)表示的是缓存值。

h z t ( m ) = A t t e n t i o n ( Q = h z t ( m − 1 ) , K V = [ h ~ ( m − 1 ) , h z ≤ t ( m − 1 ) ] ; θ ) h_{z_t}^{(m)} = Attention(Q=h_{z_t}^{(m-1)},KV=[\tilde h^{(m-1)},h_{z \le t}^{(m-1)}];\theta) hzt(m)=Attention(Q=hzt(m1),KV=[h~(m1),hzt(m1)];θ)

相对位置编码

bert的position embedding采用的是绝对位置编码,但是绝对位置编码在transformer-xl中有一个致命的问题,因为没法区分到底是哪一个片段里的,这就导致了一些位置信息的损失,这里被替换为了transformer-xl中的相对位置编码。假设给定一对位置 i i i j j j,如果 i i i j j j是同一个片段里的那么我们令这个片段编码 s i j = s + s_{ij}=s_+ sij=s+,如果不在一个片段里则令这个片段编码为 s i j = s − s_{ij}=s_{-} sij=s,这个值是在训练的过程中得到的,也是用来计算attention weight时候用到的,在传统的transformer中attention weight = s o f t m a x ( Q ⋅ K d V ) softmax(\frac{Q·K}{d}V) softmax(dQKV),在引入相对位置编码后,首先要计算出 a i j = ( q i + b ) T s s j a_{ij}=(q_i+b)^Ts_{sj} aij=(qi+b)Tssj,其中 b b b也是一个需要训练得到的偏执量,最后把得到的 a i j a_{ij} aij与传统的transformer的weight相加从而得到最终的attention weight。

预训练

预训练阶段和bert差不多,不过去除了Next Sentence Prediction,作者发现该任务对结果的提升并没有太大的影响。输入的值还是 [A, SEP, B, SEP, CLS]的模式,A与B代表的是两个不同的片段。

总结

在作者的实验中发现,xlnet更多还是在长文本的阅读理解类的任务上提升更明显一些,这也很符合上文中介绍的这些优化点,在实际工业场景中,机器翻译、本文摘要类的任务应该会有更好的效果,当然在其他的文本分类、自然语言推理等任务上xlnet也有一定的效果提升。

nlp领域的模型目前已经完全采用了pretrain+fine tuning的模式,GPT2.0的单向模式在增大训练语料的情况下效果就已经超越了bert,可想而知该领域的研究还有很大的上升空间,未来nlp模型到底还会有哪些突破呢,那就让我们拭目以待吧。

最后给一下官方的源码,目前仅有英文的预训练模型,中文版本作者表示正在考虑,希望能尽快提供出来,我只想做个白嫖怪啊~~~~

参考文献

XLNet: Generalized Autoregressive Pretraining for Language Understanding

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐