18年底谷歌爸爸推出了bert,该模型一经问世就占据了nlp界的统治地位,如今CMU和google brain联手推出了bert的改进版xlnet。在这之前也有很多公司对bert进行了优化,包括百度、清华的知识图谱融合,微软在预训练阶段的多任务学习等等,但是这些优化并没有把bert致命缺点进行改进。xlnet作为bert的升级模型,主要在以下三个方面进行了优化
在下文中,我将会为大家详细介绍这三个优化点
目前主流的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_{
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 ( 3 ∣ x < t ) p(3)=\prod_{t=1}^3p(3|x_{
虽然排列语言模型能满足目前的目标,但是对于普通的transformer结构来说是存在一定的问题的,为什么这么说呢,看个例子,假设我们要求这样的一个对数似然, p θ ( X z t ∣ x z < t ) p_{\theta} (X_{z_t} | x_{z_{
p θ ( X z t ∣ 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_{z_{
其中 h θ ( x z < t ) h_{\theta}(x_{z_{
这就导致模型没法得到正确的表述,为了解决这个问题,论文中提出来新的分布计算方法,来实现目标位置感知
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_{
其中 g θ ( x z < t , z t ) g_{\theta}(x_{z_{
接下来我们就详细来讲解下这个新的表示形式,论文把该方法称为Two-Stream Self-Attention,双流自注意力,该机制需要解决了两个问题
很显然传统的transformer并不满足这样的需求,因此作者采用了两种表述来代替原来的表述,这也是为什么称为双流的原因,我们看下这两种不同的表述
content representation
内容表述,即 h θ ( x z ≤ t ) h_{\theta}(x_{z_{\le t}}) hθ(xz≤t),下文用 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(m−1),KV=hz≤t(m−1);θ)
query representation
查询表述,即 g θ ( x z < t , z t ) g_{\theta}(x_{z_{ 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(m−1),KV=hz<t(m−1);θ)
最后我们看下总的计算过程,首先,第一层的查询流是随机初始化了一个向量即 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由于有一个最长序列的超参数控制其长度,对于特别长的序列就会导致丢失一些信息,transformer-xl就能解决这个问题。我们看个例子,假设我们有一个长度为1000的序列,如果我们设置transformer的最大序列长度是100,那么这个1000长度的序列需要计算十次,并且每一次的计算都没法考虑到每一个段之间的关系,如果采用transformer-xl,首先取第一个段进行计算,然后把得到的结果的隐藏层的值进行缓存,第二个段计算的过程中,把缓存的值拼接起来再进行计算。该机制不但能保留长依赖关系还能加快训练,因为每一个前置片段都保留了下来,不需要再重新计算,在transformer-xl的论文中,经过试验其速度比transformer快了1800倍。
在xlnet中引入片段循环机制其实也很简单,只需要在计算KV的时候做简单的修改,其中 h ~ ( m − 1 ) \tilde h^{(m-1)} h~(m−1)表示的是缓存值。
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(m−1),KV=[h~(m−1),hz≤t(m−1)];θ)
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(dQ⋅KV),在引入相对位置编码后,首先要计算出 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