Transformer-XL及XLNet论文笔记

之前谈到的很多Transfomer模型,例如GPT、GPT-2、BERT及RoBERTa,存在一些显著的问题,例如无法有效建模超长文本、MLM存在的Pre-training和Fine-tuning不一致、训练测试比较慢等问题。2019年以来,很多学者在研究如何让Transformer变得更优秀、更加实用。这一篇文章将要介绍的Transformer-XL和XLNet,是其中比较好的研究结果。

Transformer-XL

论文地址:Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context

代码地址:https://github.com/kimiyoung/transformer-xl

短评:由CMU团队提出,针对RNN和传统Transformer模型无法有效建模超长文本的问题,提出引入循环机制,使用相对位置向量,得到的Transformer-xl能够处理超长文本,而且极大加速训练过程。比较遗憾的是,没有和BERT/GPT等进行实验对比,不知道真正应用效果如何。

简介

出发思想比较直接,就是奔着现有序列模型对于超长文本建模不足的问题而来。

  • RNN:主要面临梯度消失或爆炸(gradient vanishing and explosion),解决方法集中在优化方法、初始化策略、辅助记忆单元的研究上。
  • vanilla Transformer:最长建模长度是固定的,无法捕捉更长依赖关系;等长输入序列的获取通常没有遵循句子或语义边界(出于高效考虑,往往就是将文本按长度一段段截取,而没有采用padding机制),可能造成上下文碎片化(context fragmentation)。

为了解决上述问题而提出Transformer-XL(extra long),这其中最关键的两项技术是:

  • 引入循环机制(Reccurrence,让上一segment的隐含状态可以传递到下一个segment)。
  • 提出一种新的相对位置编码方法,避免绝对位置编码在循环机制下的时序错乱。

模型框架

直接上图比较两者在训练和测试阶段的不同(特别注意,看图时,我们应该假定要处理的文本时超过vanilla Transformer的固定长度的超长文本,这种情况才能更好体会两者的不同。另外这里的vanilla Transformer是用的Decoder来做示例,比如GPT,而不是BERT,因因为图中的依赖关系都是L2R的。):

image-20190804115850322

image-20190804115942867

Segment-Level Recurrence with State Reuse

设第\tau-th的segment的第n层隐含状态序列为h_{\tau}^{n} \in R^{L\times d},其计算如下(重点对照图2-a):

\widetilde{h}_{\tau + 1}^{n-1}=[SG(h_{\tau}^{n-1})\circ h_{\tau + 1}^{n-1}], \\ q_{\tau + 1}^{n},k_{\tau + 1}^{n},v_{\tau + 1}^{n}=h_{\tau + 1}^{n-1}W_{q}^{T},\widetilde{h}_{\tau + 1}^{n-1}W_{k}^{T},\widetilde{h}_{\tau + 1}^{n-1}W_{v}^T, \\ h_{\tau + 1}^{n}=TransformerLayer(q_{\tau + 1}^{n},k_{\tau + 1}^{n},v_{\tau + 1}^{n})

SG(\cdot)表示梯度不回传(stop-gradient,fixed and cached),[h_u\circ h_v]表示向量在length维度拼接,这里其实就是将上一segment的内容考虑进来。另外,值得注意的一点是,这里和RNN的循环是在水平维度扩展不同(same-layer),这里是在垂直维度进行树的构建(between-layers),所以最大依赖长度和层深是线性关系,比如O(N\times L),可以对照图2-b。论文说这和以前训练RNN-LMs的truncated BPTT长的比较像,其实我觉得更像去年提出的TCN(时间卷积网络),我很怀疑是不是从那里得到的启发,网络图太像了,后边找机会介绍一下TCN,在语音合成方面有很好的应用。多说一下,这里说的相像,都是网络图上的相似,但实际上是很不同的,包括这里的梯度不回传,和马上说到的相对位置编码。

可以看到,利用这种方法,不仅能够捕捉更长序列,解决了fragmentation的问题,还使得测试评估过程更加快。

Relative Positional Encodings

注:这小节参考了这篇CSDN博客,致谢。

如果还是采用之前的绝对位置编码(absolute positional encodings),模型没有办法区分两个segment相同位置x_{\tau , j}x_{\tau + 1 , 1}的位置差异。因此提出相对位置编码,根据两个词之间的相对位置而非绝对位置进行编码。在vanilla Transformer中,第一层(其他层已经没有位置信息的相加)的查询q_i和键k_j之间的attention分数为:

A_{i,j}^{abs}=\underbrace{E_{x_i}^TW_{q}^TW_kE_{x_j}}_{(a)} + \underbrace{E_{x_i}^TW_q^TW_kU_j}_{(b)}+\underbrace{U_i^TW_q^TW_kE_{x_j}}_{(c)}+\underbrace{U_i^TW_q^TW_kU_j}_{(d)}

其中E\in R^{V\times d}是词向量矩阵,U\in R^{L_{max}\times d}是绝对位置编码矩阵,上式其实就是Transformer中标准计算的展开。而在Transformer-XL中,转为相对位置的计算,而且在每一层进行:

A_{i,j}^{ref}=\underbrace{E_{x_i}^TW_q^TW_{k,E}E_{x_j}}_{(a)}+\underbrace{E_{x_i}^TW_q^TW_{k,R}R_{i-j}}_{(b)}+\underbrace{u^TW_{k,E}E_{xj}}_{(c)}+\underbrace{v^TW_{k,R}R_{i-j}}_{(d)}

对比来看,主要有3点变化(集中在键的相对位置及尤其引起的其他变化):

  • (b)(d)两项中,将所有绝对向量U_j转为相对位置向量R_{i-j},和vanilla Transformer一样,这是个固定的编码向量,不需要学习。
  • (c)项,将查询的U_i^TW_q^T向量转为一个需要学习的参数向量u,因为在考虑相对位置的时候,不需要查询的绝对位置i,因此对于任意的i,都可以采用同样的向量。同理,在(d)这一项中,也将查询的U_i^TW_q^T向量转为另一个需要学习的参数向量v,区分对待主要是和第3点结合。
  • 将键的权重变换矩阵W_k分为W_{k,E}W_{k,R}两个矩阵,分别得到content-based的键向量、location-based的键向量,更加细致。

在新的计算形式下,每一项都有了更加直观的意义,如下:

  • (a)表示基于内容的寻址,即没有考虑位置编码的原始分数
  • (b)表示内容相关的位置偏差,即相对于当前内容的位置偏差
  • (c)表示全局的内容偏置,从内容层面衡量键的重要性
  • (d)表示全局的位置偏置,从相对位置层面衡量键的重要性

2018年Shaw et al提出过类似的相对位置编码,相比这里的方案,主要少了(c)(d)两项,另外也不是采用Transformer最初提出来时的固定编码(正余弦)方案,而是使用一个可训练学习的矩阵R代替W_kR。后面实验时,会比较这两种方法。

此外,直接按照公式算的话,复杂度是O(length^2),实际上i-j的取值范围为0\sim length,可以先计算好这length个向量,然后在计算A矩阵时直接取用就好。详情见论文。

实验分析

在多份数据集上进行了语言模型的建模实验,在word-level或character-level,short-term dependency或long-term dependency,基本上都取得SOTA效果,证明了其良好性能(泛化)。

消融实验(Ablation Study)主要分析了recurrence机制和相对编码方案的优势,结果如下表:

image-20190805092904739

第1个Block,我觉得挺奇怪的,最后1列Attn Len(没有严格控制变量,比如红框处,不过可以看PPL init,这个用的是同样的Attn Len),好像难以比较,有知情的同学欢迎留言评论,我个人是觉得结果有点不严谨🤔。我根据自己的理解,将作者想要对比的一些点用绿框框出来了,这里Loss的Full和half区别在于Full就是全部计算,half只会计算segment中后半段的loss(将前半段短距离的排除在外),作者说绝对位置编码要结合half比较好,这点也不能理解🤔,相对位置编码从表中来看,要采用Full loss。

另外一个主要优势在于测试评估速度,下表显著说明这点:

image-20190805094241416

附录

附录有一些比较有趣的可视化图解,这里记录一下。

image-20190805095233626

模型结构是16 10-head transformer layers,memory长度为640,上图是160×640的attention可视化矩阵。有两点结论,1) 大部分趋势是只聚焦于附近的tokens,2)有一些attention heads在整个memory上有比较宽的分布,例如下面抽取出来看的几个head

image-20190805095601514

行列含义见图(把淡黄区域看作一个segment的解码就好理解了)。这里可以看到类似CNN中的层次结构,在比较低的layers,如图(a),分布是比较均匀,而越往上,越出现不同位置的聚焦现象。这比较符合我们的直觉,知识是逐层传递和积累的。

另外,作者进一步对论文提出的相对编码计算公式中的几项进行了分析,结果如下:

image-20190805100432454

(c)因为反映的是键本身的重要性,和context无关,这里不做考虑。从图中明显看到,(b)和之前的全局attention分布非常相似,揭示了全局attention很大程度上是由这一项决定的。当然,(a)中虽然很多地方是均匀分布,但是可以看到某些head是尖分布的,这应该是近义词间的attention。

XLNet

论文地址:XLNet: Generalized Autoregressive Pretraining for Language Understanding

代码地址:https://github.com/zihangdai/xlnet

短评:和Transformer XL是同一批作者,继承了Transformer的优点,继续直接朝着BERT的弱点而来,可能是第一个敢直面刚BERT的模型,哈哈。其最大贡献在于提出带位置信息的排列语言建模(Permutation Langue Modeling),解决了BERT 掩码语言模型中pretrain-finetune的不一致问题。又一次,在十几项NLP任务上屠榜(不过,前一篇文章说过,改良版RoBERTa已经英雄归来了,真的热闹)。

简介

这部分内容综合了论文多个part的内容,主要是为了便于读者理解。

现在,大规模无监督表示学习在NLP领域大获成功,很多不同的无监督预训练方法涌现出来。自回归语言模型(autoregressive language modeling, AR)和自编码模型(autoencoding, AE)是其中两个最为成功的预训练任务。

image-20190805112657904

image-20190805112710813

AR和AE的目标函数比较,(2)中\bar{x}表示被masked的tokens,\hat{x}则是经过MASK处理后的带噪输入。注意(2)的\approx强调了这里面有独立假设导致等号不成立。

AR的问题在于,无法满足很多下游任务需要利用双向信息的需求(Context dependency)。AE的问题除了之前说到的不一致问题(Input noise),还存在一个不合理的假设:被MASK掉的token之间是互相独立的(Independence Assumption)。

XLNet给出的方案是:通过打乱文本序列的token顺序,使得用前n-1的token来预测第n个token时,能同时用到上下文的信息,对所有可能的token排列(all possible permutations of the factorization order)来求期望的对数似然函数。这可以看作是基于排序的AR建模(permutation-based AR modeling),类似的做法在早前已经被人提出,不过出发点不同,之前的目标是希望通过无序模型来提升估计效果,建模时没有考虑原本的位置信息(orderless,退化成bag-of-words)。而XLNet的出发点是希望让AR能够学习到双向contexts,提高pretrain和fine-tune的匹配,位置信息是被考虑在内的。具体做法见下文。

模型框架

Ojbective: Permutation Language Modeling

image-20190805114005463

假设不同排列共享同样的模型,如上。原输入是[1,2,3,4],如果是传统的AR做法,预测3时只能用到1,2。但是引入PLM后,针对原输入有4!种不同排列方式,上图展示了其中4种,针对每个排列,还是沿用原来的AR建模,这时预测3将可以用到所有位置的信息。例如排列2\rightarrow 4 \rightarrow 3 \rightarrow 1中,排在3之前的2,4就可以被利用到了。

PLM的目标函数可以表示如下:

image-20190805115432481

可以看到列表里每一项都是一个普通的AR任务,\mathcal{Z}表示长度为T的输入序列[1,2,...,T]的所有排列集合(共T!个),z\in \mathcal{Z}。注:特别注意,计算AR时是使用重排后的顺序(factorization order),而不是原本的序列顺序(sequence order),实现时有一个比较巧妙的方案,见下一节。

Architecture: Two-Stream Self-Attention for Target-Aware Representations

传统的Transformer模型计算(3)式的p_{\theta}时没有利用考虑预测目标的位置信息,例如p_\theta(X_{z_t}=x|\bold{x}_{z_{\textless t}})=\frac{exp(e(x)^Th_\theta(\bold{x}_{z_{\textless t}}))}{\sum_{x{'}}exp(e(x{'})^Th_\theta(x_{\bold{z}_{\textless t}}))}。这在经典的AR里面是没有问题的,因为输入序列的顺序是确定的,例如上面的例子预测3,前面就是1,2,但是对于PLM而言,问题来了,前面是1,2的,还有可能要预测的是4,目标位置信息是不可缺少的。因此,作者对公式略做了修改,显式地引入位置信息z_t,如下:

image-20190805134117487

消除了预测目标的歧义后(ambiguity in target prediction),如何计算g_\theta(x_{\bold{z}_{\textless t}}, z_t)成为遗留问题。仔细思考Transformer的结构,还存在两个问题需要解决:(1)在预测x_{z_t}时,g_\theta只能利用位置信息z_t和上文信息,不能利用内容x_{z_t},否则就看到自己本身了;(2)然而,在预测其他tokens时,例如x_{z_j}\  with\  j\textgreater t,又希望g_\theta能够将内容x_{z_t}同时编码进来,以提供完整的上下文信息。这两点是矛盾的,很难在一个g_\theta里实现。为了解决这个问题,提出了双流机制(two sets of hidden representations),如下图:

image-20190805123410977

即让g_{z_t}=g_\theta(x_{\bold{z}_{\textless t}}, z_t)去满足要求(1),对应图中(b);让h(z_t)=h_\theta(x_{\bold{x}_{\le t}})去满足要求(2),对应图中(a),形式化描述如下:

image-20190805140506638

为了加快收敛、节省存储,实践中只预测最后一些tokens(有相对充分的context,前面Transformer-XL中的half-loss也有类似的意味),如下:

image-20190805141308051

注:图2中,双流机制是通过masking attention来实现的,(c)给出了示例,理解attention矩阵时,行列序号还是按原来输入序列的序号理解,掩码按采样的排列输入理解,例如这里的3\rightarrow 2 \rightarrow 4 \rightarrow 1,1前面是3,2,4,所以内容流中全部可以看到(包括自己),而在查询流中,不可以看到自己,但是2,3,4都可以看到。内容流和查询流的掩码矩阵区别只在对角线上。

此外,XLNet借鉴了Transformer-XL中的相对位置编码和循环机制(这也是其取名的原因所在)。在建模Multiple Segments方面,不同于BERT采用的绝对分段编码方案,采用了相对分段编码方案(Relative Segment Encodings):给定位置ij,如果两者来自同一个segment则使用s_{ij}=s_{+},否则使用s_{ij}=s_{-}s_+s_-是可学习参数;当i要聚焦(attends to)j时,有a_{ij}=(q_i+b)^Ts_{ij},被加到正常的attention打分里。采用相对分段编码方案除了泛化性能提升,还让超过两个片段的输入可以处理。

Examples

BERT和XLNet看上去都只进行了部分预测(partial prediction),但是如之前所说,BERT无法建模targets之间的依赖(dependency)是硬伤。“打蛇打七寸”,在和BERT对比中,作者给了一个直击要害的例子。

假定一个输入[New, York, is, a, city],BERT和XLNet都选择[New, York]作为预测目标,并期望最大化log p(New York | is a city),并且假定XLNet采样到了[is, a, city, New, York]这样一个排列,则BERT和XLNet的目标函数如下:

image-20190805145746517

显然,XLNet可以学习到更丰富的依赖关系(论文有更详细的理论分析,我看不下去了😢)。

实验分析

在很多任务上进行了实验,效果相比BERT都取得了不同程度的提升,这里就不多说了。有学者认为,XLNet其实没有大家想象的那么大贡献,很多提升可能主要还是在于BERT出现后1年来发展的各种trick和数据质量的提升。从最近的RoBERTa来看,确实孰优孰劣,不好评估。但是,文章提出的PLM方法还是挺有借鉴意义的,也可以用到BERT上。

Published by

admin

天空没有翅膀的痕迹,但我已飞过

Leave a Reply

Your email address will not be published. Required fields are marked *