Transformer, Transformer-XL, XLNet: 追溯XLNet的前世今生

前言

正当 GPT-2 还拿着 15 亿参数的模型吊着人们的胃口时,XLNet 带着开源的代码和 20 项 SOTA 的成绩悄悄发布了。从 BERT 到 XLNet,大一统预训练模型的成功,无疑昭示着行业的快速进步。现在是最好的时机。回到正题,本文虽篇幅较长,但能提供不一样的视角,帮你迅速理清模型的细节。废话不多说,笔者这就将带你快速品读,XLNet 诞生之路上最重要的三篇论文:

  • Attention Is All You Need (12 Jun. 2017)
  • Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context (9 Jan. 2019)
  • XLNet: Generalized Autoregressive Pretraining for Language Understanding (19 Jun. 2019)

注:本文为笔者个人原创,转载请注明出处。

一、Attention Is All You Need

论文链接:https://arxiv.org/abs/1706.03762
代码链接:https://github.com/tensorflow/tensor2tensor

这篇论文诞生于 2017 年 6 月,彼时 RNN、LSTM、GRU 早已名扬天下,发迹于 2015 年的 Attention 机制也在经历各种变形的考验,两者相互合作,占据了 NLP 的半边天。循环神经网络最大的缺陷,在于其序列依赖性,上一时刻输出的隐藏状态(以及 LSTM 的记忆细胞)和本时刻的输入共同作为新一轮的单元细胞处理材料,如此往复。出于自回归的特性,单单凭借一到两个矩阵完整而不偏颇地记录过去几十个甚至上百个时间步长的序列信息,显然不太可能,其权重在训练过程中反复调整,未必能刚好应用到测试集的需求上。更不用提训练时梯度消失导致的难以优化的问题。这些缺陷从 LSTM 的单元公式便足以看出。后续新模型的开创者们始终没有推出一个可以完美解决以上问题,同时保证特征抽取能力的方案,直到 Transformer 出现。(下图为应用于文本摘要任务的模型结构示例,结构为双向 LSTM 搭配 Attention 机制)
描述
在各种情景下历经切除试验而始终保持稳健性的 Attention 机制不能抛弃,于是 Transformer 的发明者选择将其保留,而彻底摒弃循环神经网络的设计架构。取而代之的,是回炉再造后焕然新生的 Attention 机制,叫做 Self-Attention,意为 “Attention on oneself”。

Attention机制

在介绍 Self-Attention 前,我们首先回顾一下 Attention 机制的原理,委屈一下对 Attention 机制熟悉的读者。Attention 机制的目的是作为 Encoder 的附加层,提取更为丰富的特征信息。其核心在于三个要素:Query, Key 和 Value,公式如下,
A t t e n t i o n ( Q , K , V ) = S i m i l a r i t y ( Q , K ) V Attention(Q,K,V)=Similarity(Q,K) V Attention(Q,K,V)=Similarity(Q,K)V

计算 Query 和 Key 的相似度,将相似度结果附加在 Value 上,也就成为 Attention 机制的输出特征。我们以 LSTM 搭配 Attention 机制的端对端文档问答系统为例。在原始数据集中,我们的答案所在的文本和问题分别由 M M M N N N 个单词组成,通过将其词向量分别放入两个不同的循环神经网络,我们抽取 M M M N N N 个相关的隐藏状态 h i ∈ R h ( i = 1 , . . . , M ) h_i\in\mathbb{R}^h(i=1,...,M) hiRh(i=1,...,M) h j ∈ R h ( j = 1 , . . . , N ) h_j\in\mathbb{R}^h(j=1,...,N) hjRh(j=1,...,N),进入 Attention 机制。这时,Query 就是我们的 h i h_i hi,而 Key 和 Value 就是我们和问题相关的 h j h_j hj。针对每一个文本相关的 h i h_i hi,我们都将其和每一个问题相关的 h j h_j hj 求一次点积,
α i j = h i T h j ∈ R \alpha_{ij}=h_i^Th_j\in\mathbb{R} αij=hiThjR

那么每一个单词对应的 h i h_i hi 都获得了一个由点积组成的向量 α i = ( α i 1 , . . . , α i N ) ∈ R N \alpha_i=(\alpha_{i1},...,\alpha_{iN})\in\mathbb{R}^N αi=(αi1,...,αiN)RN,里面承载了该单词与所有问题相关单词的相似关系。对该向量进行 Softmax 归一化,得出我们上文所说的相似度:
s i m i l a r i t y ( h i , h j ) = h i T h j ∑ k = 1 N h i T h k ∈ [ 0 , 1 ] similarity(h_i,h_j)=\frac{h_i^Th_j}{\sum_{k=1}^Nh_i^Th_k}\in[0,1] similarity(hi,hj)=k=1NhiThkhiThj[0,1]

相似度也即权重,问题相关的所有隐藏状态经由该权重加权平均,得出的向量便是 Attention 机制下的特征输出,
a i = A t t e n t i o n ( h i , h j , h j ) = ∑ j s i m i l a r i t y ( h i , h j ) h j a_i=Attention(h_i,h_j,h_j)=\sum_jsimilarity(h_i,h_j) h_j ai=Attention(hi,hj,hj)=jsimilarity(hi,hj)hj

将隐藏状态与该输出进行纵向合并,输出的组合向量 c i c_i ci 进入 Decoder 输出层导出最终的模型预测结果:
c i = [ h i ; a i ] ∈ R 2 h c_i=[h_i;a_i]\in\mathbb{R}^{2h} ci=[hi;ai]R2h

如果是双向循环神经网络的设计,这里的 h i h_i hi 也就是 [ h i → ; h i ← ] [\overrightarrow{h_i};\overleftarrow{h_i}] [hi ;hi ],同理 h j = [ h j → ; h j ← ] h_j=[\overrightarrow{h_j};\overleftarrow{h_j}] hj=[hj ;hj ],当然这不是本文的讨论重点。以上仅仅只是 Attention 机制针对该问答任务的设计。泛化来讲,点积求出来以后进行一定程度的缩放,以保证低相似度组合的权重不至于过低 (过低会影响训练时从输出层激活函数传来的梯度更新),这样的 Attention 机制称为 Scaled Dot-Product Attention

在这里插入图片描述 A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}}) V Attention(Q,K,V)=softmax(dk QKT)V

其中分母的 d k d_k dk 一般为词向量的维度。在此基础上进一步变形,将 Query, Key, Value 经过多组线性变换后分别放入 Scaled Dot-Product Attention,对得出的结果进行合并并进行二次线性变换,这样的 Attention 机制称为 Multi-Head Attention

在这里插入图片描述 M u l t i H e a d ( Q , K , V ) = C o n c a t ( h e a d 1 , . . . , h e a d h ) W O MultiHead(Q,K,V)=Concat(head_1,...,head_h) W^O MultiHead(Q,K,V)=Concat(head1,...,headh)WO

h e a d i = A t t e n t i o n ( Q W i Q , K W i K , V W i V ) head_i=Attention(QW_i^Q,KW_i^K,VW_i^V) headi=Attention(QWiQ,KWiK,VWiV)

在另一方面,以上问答系统案例中的 Query 和 Key 分别来自与文本和问题有关的隐藏状态,而当 Query 和 Key 来自同一组对象时,即计算相似度时我们将词向量与文本本身的其他词向量组合求相似度,不引用任何其他信息,这样的 Attention 机制称为 Self-Attention。自注意力输出的特征直接替换原隐藏状态,不再与其合并。以上四者的结合便是 Attention 机制在 Transformer 中的应用,更多细节我们将在下文中介绍。除以上几者之外,Attention 还有诸多不同的变形方式,包括拼接后导入感知机代替点积进行相似度计算,以及以加权平均的方式代替 Attention 输出特征与 Query 的纵向合并,感兴趣的读者可自行了解。

Transformer

使用循环神经网络搭配 Attention 机制进行各种变形形成 Encoder,再接一个作为输出层的 Decoder 形成 Encoder-Decoder 架构,是 Transformer 诞生前夕各类主流 NLP 神经网络的设计思路。例如动态协同注意网络 (Dynamic Coattention Network, DCN) 使用作为 Encoder 的单向 LSTM + 协同注意力编码器对来自文本和问题的隐藏状态进行多次线性/非线性变换、合并、相乘后得出联合矩阵,再投入由单向 LSTM、双向 LSTM 和 Highway Maxout Networks (HMN) 组成的动态指示解码器 (Dynamic Pointing Decoder) 导出预测结果;双向注意流网络 (Bi-Directional Attention Flow, BiDAF) 除特殊的由循环神经网络构成的结构外,同时使用问题到文本和文本到问题的注意力矩阵提取特征。在问答领域还包括 DrQA、AoA、r-Net 种种变形后表现有所提升的模型,其他领域则更多。但无论如何,始终摆脱不掉 RNN 或 CNN 的影子。

Transformer 超脱于其中,是第一个使用自注意力机制,彻底摆脱循环或卷积神经网络依赖的模型。模型结构如下:

在这里插入图片描述
左侧和右侧分别是基础的 Encoder 单元和 Decoder 单元,两者搭配在一起组成一个 Transformer 层 (Transformer-layer)。为行文清晰,我们将模型细节由浅入深,整理为以下要点:

  • Inputs:模型的训练基于单向 many-to-many,不要求 Inputs 和 Outputs 的长度相等,两者不等长时将空缺部分填充为 0 向量。

  • Outputs (shifted right):在一般任务下,模型训练的目的为预测 next token probability,从而保持 Inputs 和 Outputs 等长,Outputs 取自于文本中相对于 Inputs 右移一个位置,即 shifted right;在进行翻译任务的训练时,则输入一个不等长的句子对。

  • Nx:论文中的 Transformer 深度为六层。在每一层的结尾,Encoder 输送隐藏状态给下一层 Encoder,Decoder 同理。

  • 三个箭头:通向每个注意力层的三个并列的箭头从左到右分别为 Value、Key 和 Query。Encoder 在每一层将隐藏状态通过线性变换分化出 Key 和 Value 输送给 Decoder 的第二个注意力层。

  • Input Embedding:使用预训练词向量表示文本内容,维度为 d m o d e l d_{model} dmodel,论文中 d m o d e l = 512 d_{model}=512 dmodel=512

  • Positional Embedding:依据单词在文本中的相对位置生成正弦曲线,以记录序列长度信息,针对 p o s pos pos 位置上的奇数维和偶数维, P E ( p o s , 2 i ) = sin ⁡ ( p o s / 1000 0 2 i / d m o d e l ) PE_{(pos,2i)}=\sin(pos/10000^{2i/d_{model}}) PE(pos,2i)=sin(pos/100002i/dmodel) P E ( p o s , 2 i + 1 ) = cos ⁡ ( p o s / 1000 0 2 i / d m o d e l ) PE_{(pos,2i+1)}=\cos(pos/10000^{2i/d_{model}}) PE(pos,2i+1)=cos(pos/100002i/dmodel)经过相对位置嵌入,对于任意 k k k P E p o s + k PE_{pos+k} PEpos+k 都可以作为 P E p o s PE_{pos} PEpos 固定的线性表达。

  • Feed Forward:全连接前馈层,针对每一个 Position 的输入单独进行变换,
    F F N ( x ) = R e l u ( x W 1 + b 1 ) W 2 + b 2 FFN(x)=Relu(xW_1+b_1)W_2+b_2 FFN(x)=Relu(xW1+b1)W2+b2其中 W 1 ∈ R d m o d e l × d f f W_1\in\mathbb{R}^{d_{model}\times d_{ff}} W1Rdmodel×dff W 2 ∈ R d f f × d m o d e l W_2\in\mathbb{R}^{d_{ff}\times d_{model}} W2Rdff×dmodel,论文中 d f f = 2048 d_{ff}=2048 dff=2048

  • Add & Norm:每一个注意力层和前馈层都附带残差结构,输入与输出相加后进行批量归一化,以加速梯度更新。

  • Multi-Head Attention M u l t i H e a d ( Q , K , V ) = C o n c a t ( h e a d 1 , . . . , h e a d h ) W O MultiHead(Q,K,V)=Concat(head_1,...,head_h)W^O MultiHead(Q,K,V)=Concat(head1,...,headh)WO h e a d i = A t t e n t i o n ( Q W i Q , K W i K , V W i V ) = s o f t m a x ( Q W i Q W i K T K T d k ) V W i V head_i=Attention(QW_i^Q,KW_i^K,VW_i^V)=softmax(\frac{QW_i^QW_i^{KT}K^T}{\sqrt{d_k}}) VW_i^V headi=Attention(QWiQ,KWiK,VWiV)=softmax(dk QWiQWiKTKT)VWiV其中 W i Q , W i K ∈ R d m o d e l × d k W_i^Q,W_i^K\in\mathbb{R}^{d_{model}\times d_k} WiQ,WiKRdmodel×dk W i V ∈ R d m o d e l × d v W_i^V\in\mathbb{R}^{d_{model}\times d_v} WiVRdmodel×dv W O ∈ R h d v × d m o d e l W^O\in\mathbb{R}^{hd_v\times d_{model}} WORhdv×dmodel,论文中 h = 8 h=8 h=8 d k = d v = 64 d_k=d_v=64 dk=dv=64

  • Masked Multi-Head Attention:仅应用于 Decoder 的第一个注意力层。在 Multi-Head Attention 的基础上做 Masking 处理,其目的在于计算某一位置 Self-Attention 时不利用到右侧我们将要预测的信息,所有与右侧位置的点积不参与计算,直接取值为 − ∞ -\infty ,这样一来经过 Softmax 归一化处理,右侧位置的权重将接近于 0。

  • Linear:输出模型结果的概率分布,输出维度为预测目标的词汇表大小。

以上概括虽简短,但皆是论文内容的高度浓缩,相信读者到这里已经非常清楚 Transformer 的架构了。由于引入了自注意力机制,Transformer 避免了使用自回归模型提取特征的弊端,得以充分捕获近距离上文中的任何依赖关系。不考虑其优良的并行特性,在应对文本总长度小于词向量维度的任务时 (例如机器翻译),模型的训练效率也显著高于循环神经网络。夸归夸,Transformer 也有不足之处。之所以说是捕获近距离的任何依赖关系,是因为论文没有提到,当输入文本的固定长度持续增长时,其训练时间也将呈指数上涨。也因此,Transformer 的序列建模长度不如 LSTM,输入句子对是标准的训练形式。

成绩

论文作者在两项机器翻译任务上训练 Transformer,并刷新了历史最佳成绩。分别为 WMT 2014 年英德翻译数据集 (包含450万个句子对),和 2014 年英法翻译数据集 (包含3,600万句子对)。前者预测的是德语语料的双字节编码 (byte-pair encoding),词汇大小为 37,000,后者则是纯粹的单词,共计 32,000 个。每次投入包含 25,000 个源语言词汇以及 25,000 个目标语言词汇的句子对批量进入模型训练。训练在 8 块 Nvidia P100 GPU 上进行,依据上文所述超参数进行配置的基础模型使用了 12 个小时训练了 100,000 个步长,平均每个步长耗时 0.4 秒;而经过反复调参,表现最好的大参数模型花费 3.5 天训练了 300,000 个时间步长,每个步长耗时 1 秒。优化器选用 Adam Optimizer。训练时采用了三种正则化方式:1)在每一个注意力层和前馈层后接一个概率为 P d r o p = 0.1 P_{drop}=0.1 Pdrop=0.1 的 Dropout 层;2)在将 Input 或 Output Embedding 和 Positional Embedding 进行加法运算后以同样的概率随机 Dropout;3)对模型标签采用 e l s = 0.1 e_{ls}=0.1 els=0.1 的平滑处理。这三种方式都一定程度地提高了模型的泛化能力。更多细节请读者自行参考论文。
在这里插入图片描述
最终 Transformer 在第一个任务上将历史最佳表现提升两个百分点到 BLEU 28.4,第二个任务提升 0.5 个百分点到 BLEU 41.8。除这两个任务以外,论文阐述了在英文句法分析 (Consituency Parsing) 上也取得了不错的效果。

在这里插入图片描述
Transformer 最大的成就在于引入自注意力机制,摆脱了序列模型自回归式的设计。由于没能在实际任务的应用上大范围地刷新 RNN 系模型的成绩,因而没有引起如同 BERT 和 XLNet 诞生之时的轰动。在此期间,仍然有大量的学者致力于研究 LSTM 梯度消失问题的解决方案,包括调整参数初始化,增强记忆结构,调整单元架构等等,没有将注意力放在 Transformer 上。正是借助 OpenAI GPT、BERT 这些表现亮眼的上层模型,Transformer 才在一两年后逐渐奠定它的江湖地位。

二、Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context

论文链接:https://arxiv.org/abs/1901.02860
代码链接:https://github.com/kimiyoung/transformer-xl

这篇论文发布于今年年初 (9 Jan. 2019)。论文中,Transformer-XL 旨在于解决长期以来困扰 NLP 界的难题:捕捉长距离依赖关系,这也是其名称的由来 XL: extra long。有学者研究表明,LSTM 的平均上下文长度为 200 (Transformer 低于 50)。而在同等的计算力下,Transformer-XL 最终可以捕获的依赖关系距离比循环神经网络远 80%,更超出 Transformer 450%。这还不够,next token prediction 速度更是 vanilla Transformer (Transformer 在字符级和深度上的改良版本) 的 1,800+ 倍。这其中的秘诀在于 Transformer-XL 对自注意力机制引入的两项调整 —— 循环机制 (recurrence mechanism) 和 相对位置编码 (relative positional encoding)。但 Transformer-XL 和 Transformer 的区别还远不止于此,我们会在下文中逐步展开相关介绍。

Vanilla Transformer

两者还存在诸多区别的原因,在于 Transformer-XL 并非直接从 2017 年发布的原始 Transformer 演化而来,而是一个叫 vanilla Transformer 的版本。该版本首次出现在 Rami Al-Rfou 等人于 2018 年发布的 Character-Level Language Modeling with Deeper Self-Attention (9 Aug. 2018),论文链接。(该论文中并没有提到 vanilla 的字样,至于本文作者为何称呼该模型为 vanilla,笔者暂未找到答案,尚且沿用这一称呼)。Vanilla Transformer 将 Transformer 的深度扩展到 64 层,并应用了 标准 Transformer 架构 (standard Transformer architecture):将每一层中的 Decoder 剔除,并将 Encoder 中的自注意力层改为 Masked 自注意力层,由此一来模型结构大大简化,使得 Transformer 具备成为优秀特征提取器的资质 (如同当年 RNN 那样)。在下文中介绍 BERT 和 XLNet 时我们将会多次提到这一概念。

Vanilla Transformer 还引入了一些其他独特的设计,包括在中间层添加辅助损失函数提前参与收敛,这里不进行赘述。训练时,首先将完整的语料分成若干个等长的 segment,计算 self-attention 不考虑本 segment 以外的语料信息,由此预测 segment 内部的 next token probability。而在推理 (预测) 时,逐字划分 segment 边界,每过一个时间步长则向右滑动一个单位。如下图所示:
在这里插入图片描述
本论文指出,这样的设计存在两个重要缺陷:1)捕捉长距离依赖关系依然受限于 segment 的长度,同时无法充分利用自注意力机制的优化优势;2)将语料序列直接划入等长的 segment 将把句子横空切断,造成上下文碎片化 (context fragmentation)。

循环机制

爱之深,责之切。批评过后,论文提出了解决方案:循环机制。同 vanilla Transformer 一样,将语料事先划分为等长的 segments,训练时将每一个 segment 单独投入计算 self-attention。每一层输出的隐藏状态作为记忆存储到内存中,并在训练下一个 segment 时,将其作为额外的输入,代表上文中的语境信息。这样一来便在上文与下文之间搭建了一座桥梁,使得模型能够捕获更长距离的依赖关系:

在这里插入图片描述

数学上,假设两个相邻的 segment 分别为, s τ = [ x τ , 1 , . . . , x τ , L ] s_\tau=[x_{\tau,1},...,x_{\tau,L}] sτ=[xτ,1,...,xτ,L] s τ + 1 = [ x τ + 1 , 1 , . . . , x τ + 1 , L ] s_{\tau+1}=[x_{\tau+1,1},...,x_{\tau+1,L}] sτ+1=[xτ+1,1,...,xτ+1,L]其中 L L L 为 segment 的长度; s τ s_{\tau} sτ 在第 n n n 层产生的隐藏状态为, h τ n ∈ R L × d h_\tau^n\in\mathbb{R}^{L\times d} hτnRL×d d d d 为隐藏层大小。则相关表达式为: h ~ τ + 1 n − 1 = [ S G ( h τ n − 1 ) ∘ h τ + 1 n − 1 ] ∈ R 2 L × d \tilde h_{\tau+1}^{n-1}=[SG(h_\tau^{n-1})\circ h_{\tau+1}^{n-1}]\in\mathbb{R}^{2L\times d} h~τ+1n1=[SG(hτn1)hτ+1n1]R2L×d

q τ + 1 n = h τ + 1 n − 1 W q T q_{\tau+1}^n=h_{\tau+1}^{n-1}W_q^T qτ+1n=hτ+1n1WqT

k τ + 1 n = h ~ τ + 1 n − 1 W k T k_{\tau+1}^n=\tilde h_{\tau+1}^{n-1}W_k^T kτ+1n=h~τ+1n1WkT

v τ + 1 n = h ~ τ + 1 n − 1 W v T v_{\tau+1}^n=\tilde h_{\tau+1}^{n-1}W_v^T vτ+1n=h~τ+1n1WvT

h τ + 1 n = T r a n s f o r m e r _ L a y e r ( q τ + 1 n , k τ + 1 n , v τ + 1 n ) h_{\tau+1}^n=Transformer\_Layer(q_{\tau+1}^n,k_{\tau+1}^n,v_{\tau+1}^n) hτ+1n=Transformer_Layer(qτ+1n,kτ+1n,vτ+1n)

其中,公式 S G SG SG 名称为 stop gradient 的缩写,代表切断梯度反向传导, [ h u ∘ h v ] [h_u\circ h_v] [huhv] 代表纵向合并, W W W 则是模型参数。经过以上调整后,与标准 Transformer 的区别仅在于,Key 和 Value 在第二个及以上的注意力层前,会增加为两倍的长度,承载前一个 segment 前一个注意力层的信息。也因此,某一 segment 某一注意力层的信息,每过一个 segment,则深入一层。最终,能够捕获的最长距离依赖关系,其长度与 Transformer 的深度和 segment 的长度成正比,i.e. O ( N × L ) O(N\times L) O(N×L)。到这里,vanilla Transformer 的两大问题得以解决,而隐藏状态的加入使得模型在进行推理时,不必对部分 self-attention 进行重复运算,这样一来推理速度也将提升 1800 倍以上。这些正对应了笔者在本节开头对 Transformer-XL 的概括。

相对位置编码

加入了循环机制,从 universal Transformer 承袭下来的绝对位置编码也就失去了作用。这是由于 Transformer 摒弃了 RNN 自回归式的运算方式,每个训练步长投入一对句子或固定长度的文本,因而绝对位置只记录其在这段文本中的绝对位置,切换到 Transformer-XL 下一个 segment 的同一位置时,编码数值没有发生任何改变。这显然不可取。Tranformer-XL 综合两年内世界上针对相对位置编码的研究成果,给出了它的解决方案:取消模型输入时的位置编码,转为在每一个注意力层前为 Query 和 Key 编码。我们假设绝对位置编码矩阵为, U ∈ R L m a x × d U\in\mathbb{R}^{L_{max}\times d} URLmax×d其中 U i U_i Ui 代表第 i i i 个绝对位置的编码向量, L m a x L_{max} Lmax 代表输入文本的最大长度,而输入的预训练表征向量 (词向量或字符向量) 为 E E E,则在 universal Transformer 中,Query q i q_i qi 和 Key k j k_j kj 的注意力相似度为,
A i , j a b s = E x i T W q T W k E x j + E x i T W q T W k U j + U i T W q T W k E x j + U i T W q T W k U j A_{i,j}^{abs}=E_{x_i}^TW_q^TW_kE_{x_j}+E_{x_i}^TW_q^TW_kU_j+U_i^TW_q^TW_kE_{x_j}+U_i^TW_q^TW_kU_j Ai,jabs=ExiTWqTWkExj+ExiTWqTWkUj+UiTWqTWkExj+UiTWqTWkUj

经过 Transformer-XL 调整过后,新的表达式为,
A i , j a b s = E x i T W q T W k , E E x j + E x i T W q T W k , R R i − j + u T W k , E E x j + v T W k R R i − j A_{i,j}^{abs} = E_{x_i}^TW_q^TW_{k,E}E_{x_j} + E_{x_i}^TW_q^TW_{k,R}R_{i-j} + \mathrm{u}^TW_{k,E}E_{x_j} + \mathrm{v}^TW_{k_R}R_{i-j} Ai,jabs=ExiTWqTWk,EExj+ExiTWqTWk,RRij+uTWk,EExj+vTWkRRij

我们将相关调整整理为以下要点:

  • R ∈ R L m a x × d R\in\mathbb{R}^{L_{max}\times d} RRLmax×d 是与 U U U 对应的正弦曲线相对位置矩阵;
  • u , v ∈ R d \mathrm{u},\mathrm{v}\in\mathbb{R}^d u,vRd 是可训练参数,分别限制和主导随 Query 位置变化导致的注意力偏差;
  • W k , E W_{k,E} Wk,E W k , R W_{k,R} Wk,R 是对 W k W_k Wk 做的分化,分别产生以内容为偏向的 Key 和 以位置为偏向的 Key;

经过调整,新表达式的四个要素分别代表纯内容的点积,以内容为主的位置偏差,全局内容偏差,以及全局位置偏差。

Transformer-XL

将循环机制和相对位置编码结合起来,也就得到了完整的 Transformer-XL 模型。最终表达式为,
h ~ τ n − 1 = [ S G ( m τ n − 1 ) ∘ h τ n − 1 ] \tilde h_\tau^{n-1}=[SG(m_\tau^{n-1})\circ h_\tau^{n-1}] h~τn1=[SG(mτn1)hτn1]

q τ n = h τ n − 1 W q n T q_{\tau}^n=h_{\tau}^{n-1}{W_q^n}^T qτn=hτn1WqnT

k τ n = h ~ τ n − 1 W k , E n T k_{\tau}^n=\tilde h_{\tau}^{n-1}{W_{k,E}^n}^T kτn=h~τn1Wk,EnT

v τ n = h ~ τ n − 1 W v n T v_{\tau}^n=\tilde h_{\tau}^{n-1}{W_v^n}^T vτn=h~τn1WvnT

A τ , i , j n = q τ , i n T k τ , j n + q τ , i n T W k , R n R i − j + u T k τ , j + v T W k , R n R i − j A_{\tau,i,j}^{n} = {q_{\tau,i}^n}^Tk_{\tau,j}^n + {q_{\tau,i}^n}^TW_{k,R}^nR_{i-j} + \mathrm{u}^Tk_{\tau,j} + \mathrm{v}^TW_{k,R}^nR_{i-j} Aτ,i,jn=qτ,inTkτ,jn+qτ,inTWk,RnRij+uTkτ,j+vTWk,RnRij

a τ n = M a s k e d _ S o f t m a x ( A τ n ) v τ n a_\tau^n=Masked\_Softmax(A_\tau^n)v_\tau^n aτn=Masked_Softmax(Aτn)vτn

o τ n = L a y e r N o r m ( L i n e a r ( a τ n ) + h τ n − 1 ) o_\tau^n=LayerNorm(Linear(a_\tau^n)+h_\tau^{n-1}) oτn=LayerNorm(Linear(aτn)+hτn1)

h τ n = P o s i t i o n w i s e _ F e e d _ F o r w a r d ( o τ n ) h_{\tau}^n=Positionwise\_Feed\_Forward(o_\tau^n) hτn=Positionwise_Feed_Forward(oτn)

其中记忆矩阵 m τ n − 1 = h τ − 1 n − 1 m_\tau^{n-1}=h_{\tau-1}^{n-1} mτn1=hτ1n1 是隐藏状态的另一种书写方式。Transformer 的介绍到这里便结束了。

成绩

Transformer-XL 承袭了 vanilla Transformer 适用于字符级 (character-level) 任务的特性,并能够连续生成包含数千个字符的文本 (尚且不知同等参数量下,生成效果和后来大名鼎鼎的 OpenAI GPT-2 相比如何)。论文作者将 Transformer-XL 广泛应用在词汇级和字符级的数据集上,包括 WikiText-103,enwik8,text8,One Billion Word,以及 Penn Treebank。前三个数据集重在检测长距离依赖关系的捕捉能力,Transformer-XL 不负所望,所有表现皆优于当下 SOTA 模型;第四个数据集 One Billion Word 由于句子被打乱,考验的是短距离依赖关系的捕捉能力,Transformer-XL 依旧刷新了最佳成绩;第五个数据集体量仅有100万,不足前四者的百分之一,考验的是小数据集训练后的泛化能力,Transformer-XL 表现仍然亮眼。模型设置方面,注意力长度 O ( N × L ) O(N\times L) O(N×L) 训练时从 384 起底,最高 784,而预测时 Large 模型更是达到了原来不可想象的 3,800 的高度;Encoder 和 Decoder 层数从 12 层到 24 层不定。

在这里插入图片描述
在这里插入图片描述

RECL

abbr. Relative Effective Context Length。在论文的结尾,作者提出了将 RECL 作为判断模型有效文本利用长度的基准,换句话说,衡量模型对长距离关系的捕获能力。原理在于找出 r r r 百分比个最难预测的 token,求得能极小化损失函数的注意力长度。设定 r = 0.1 r=0.1 r=0.1,Transformer-XL 最终的成绩为 900,这便是前文中 80% 和 450% 数字的由来:

在这里插入图片描述
而在预测速度上,1,800+ 的数字来自于:

在这里插入图片描述

既能捕获长距离依赖关系,也能充分利用短距离依赖关系,Transformer-XL 名副其实地成为第一个同时在字符级和词汇级任务上超越循环神经网络的自注意力模型,并在为构建集成网络,刷新问答、分类、推理等 NLP 领域的成绩做着全面的准备。

三、XLNet: Generalized Autoregressive Pretraining for Language Understanding

论文链接:https://arxiv.org/abs/1906.08237
代码链接:https://github.com/zihangdai/xlnet

6 月 19 日,带着 Transformer-XL 的优良特性,XLNet 终于问世。自一月份 Transformer-XL 的论文发布以来,已过去五个月。期间,擅长暴力美学,堆砌训练材料和参数体量的 GPT-2 (16 Feb. 2019) 因续写文章表现出色,难以辨识真假,引发一阵道德舆论风暴。但在模型设计本质上,GPT-2 相对于 GPT 并未获得具有价值的创新,因而论文中鲜有涉及 GPT-2 的讨论。相对地,无论是最终的模型表现,还是部分细节的设计初衷,XLNet 都和 BERT 紧密相关。因此读懂这篇论文,需要对 BERT 的原理有基本的了解。如果你对 BERT 不甚熟悉,没关系,笔者将带着你一起回顾。

BERT

如果说 BERT 的出现代表基于 Transformer 的自注意力派系彻底战胜基于 RNN 的自回归系,那么 XLNet 则是出自自注意力派系门下,融合两家武学之长的集大成者。BERT 出自论文:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding (11 Oct. 2018),论文链接。以下是 BERT 的结构:

在这里插入图片描述
由图我们看出,BERT 由双层双向 Transformer 构建而成,训练分为两个步骤:预训练 (pre-training) 和 微调 (find-tuning)。预训练是为了在输入的词向量中融入上下文特征,微调则是为了使 BERT 能适应不同的下游任务,包括分类、问答、序列标注等,两者是独立进行的。由此我们可以看出,BERT 是一个普适性非常强的模型,而不像过去几年中很多为特定任务设计的模型 (feature-based task-specific models) 那样,只能应用于单一场景 ,这为 BERT 刷新 11 项记录奠定了基础。预训练时,BERT 采用的策略与标准 Transformer 不同的地方在于,后者是基于预测 next token,只在输入句子的结尾进行预测;而前者预测的是句子本身,只是输入时 15% 的 token 被随机遮盖 (mask) 掉了,这便是 BERT 独特的 Mask 机制,也是众多 data corruption 方式中的一种。而 BERT 在标准 Transformer 的位置编码基础上,还添加了一项 segment 编码,如下图:

在这里插入图片描述
这是 BERT 预训练时最标准的输入形式。每个训练步长,BERT 输入句子 A,然后以 50% 的概率选择下一个连续的句子作为 B,另外 50% 的概率是从语料中随机抽取不连续的 B 取而代之。这便是 BERT 论文中所提到的 Next Sentence Prediction。因此模型训练时的输出除了完整的句子本身外,还有一个是或否的标签,判断两个句子是否连续。这样设计的初衷在于增强 BERT 的上下文推理能力。以上是预训练,在微调时,只需要改变模型的输入和输出即可。关于 BERT 的简短介绍就进行到这里。最终,BERT 在以下十一个任务上取得了 SOTA 成绩:

  • 分类及推理:GLUE (MNLI, QQP, QNLI, STS-B, MRPC, RTE, SST-2, CoLA), SWAG
  • 序列标注:CoNLL-2003 NER
  • 问答:SQuAD

由于 BERT 不是本文的重点,更多细节请读者自行参读论文,或参考网络博客 (出于 BERT 的知名度,网上的解读非常详尽)。以下将会经常提到关于 BERT 的以上内容。

有序因子排列

BERT 与 XLNet 的首要不同在于,BERT 底层应用的是 Mask 机制下的 标准 Transformer 架构,而 XLNet 应用的是在此基础上融入了自回归特性的 Transformer-XL。前者无论是在训练还是预测,每次输入的文本都相互独立,上一个时间步长的输出不作为下一个时间步长的输入;而传统的循环神经网络正好相反。论文将满足前者特性的模型归类于 自编码 (autoencoding, AE) 语言模型,而把 RNN 系归类于自回归 (autoregressive, AR) 语言模型。以 BERT 为首的自编码模型虽可以学得上下文信息,但在 data corruption 设计上存在两个天然缺陷:1)忽视了训练时被 Mask 掉的 token 之间的相关关系;2)这些 token 未能出现在训练集中,进一步导致预训练的模型参数在微调时产生差异。而自回归模型虽不存在以上缺陷,但只能基于单向建模。双向设计 (如 ELMo 的双层 LSTM) 将产生两套无法共享的参数,本质上仍为单向模型,利用上下文语境的能力有限。

为解决以上问题,论文提出了第三种设计方案,也正是 XLNet 模型的核心:有序因子排列 (Permutation of Factorization Order)。其思想在于针对每一个长度为 T T T 的序列 ( x 1 , . . . , x T ) (x_1,...,x_T) (x1,...,xT),产生 T ! T! T! 种不同的排列形式 Z T \mathcal{Z_T} ZT,共享信息和参数,对每一种排列方式 z ∈ Z T \mathrm{z}\in\mathcal{Z_T} zZT 重组下的 x z x_\mathrm{z} xz 序列,进行自回归训练,最大化 log ⁡ \log log 似然函数:
max ⁡ θ E z ∼ Z T [ ∑ t = 1 T log ⁡ p θ ( x z t ∣ x z < t ) ] \max_\theta\mathbb{E}_{\mathrm{z}\sim \mathcal{Z_T}}\bigg[\sum_{t=1}^T\log p_\theta(x_{z_t}|x_{\mathrm{z}_{<t}})\bigg] θmaxEzZT[t=1Tlogpθ(xztxz<t)]

需要注意的是,在此期间仅仅只有自回归的对象 x z < t x_{\mathrm{z}_{<t}} xz<t 发生改变,每一个 token x t x_t xt 的嵌入向量以及相对位置编码保持不变。以下是相关图例:

在这里插入图片描述
不同的排列方式,使模型的训练充分融合上下文特征,同时不会造成 Mask 机制下的有效信息缺失,从而使模型充分利用自编码和自回归的优势,而避免了两者的不足。这样独特的思路并不是创造 XLNet 的学者们拍拍脑袋想出来的,而是借鉴了发表于 2016 年的一篇论文中的思想,只不过后者对元素的排列并没有如同 XLNet 进行有序的规划,而是全程无序的,论文指出这样的思路会使序列退化为词袋,从而丢失关键信息,因而做出调整。

双流自注意力

双流自注意力 (Two-Stream Self-Attention) 为配合有序因子排序而生,是相对于 Transformer-XL 的单流自注意力而言的。由于论文没有对 Transformer-XL 展开详细的介绍,因此不熟悉 Transformer-XL 的读者读到这里会觉得晦涩难懂 (笔者在阅读本论文前看了几篇知名博主发布的关于 XLNet 的解读,都没能将它解释清楚)。鉴于此,笔者会在后面详细解释相关要点,我们先依旧按照论文的逻辑展开。第一步,先尝试将有序因子排列应用在 Transformer-XL 上。似然函数表达式:
p θ ( X z t = x ∣ x z < t ) = exp ⁡ ( e ( x ) T h θ ( x z < t , z t ) ) ∑ x ′ exp ⁡ ( e ( x ′ ) T h θ ( x z < t , z t ) ) p_\theta(X_{\mathrm{z}_t}=x|x_{z_{<t}})=\frac{\exp\big(e(x)^Th_\theta(x_{\mathrm{z}_{<t}},z_t)\big)}{\sum_{x'}\exp\big(e(x')^Th_\theta(x_{\mathrm{z}_{<t}},z_t)\big)} pθ(Xzt=xxz<t)=xexp(e(x)Thθ(xz<t,zt))exp(e(x)Thθ(xz<t,zt))

h θ h_\theta hθ 为自注意力层表达式, e ( x ) e(x) e(x) 返回 token 的嵌入向量 (添加相对位置编码以后)。但仅仅如此是不够的,这样一来进行重新排列后,因共享 Transformer 参数,每一种排列下模型并不知道我们希望当下预测是哪个位置的信息,因而需要将预测目标的位置 z t z_t zt 加入到输入变量的队列中。新的表达式为
p θ ( X z t = x ∣ x z < t ) = exp ⁡ ( e ( x ) T g θ ( x z < t , z t ) ) ∑ x ′ exp ⁡ ( e ( x ′ ) T g θ ( x z < t , z t ) ) p_\theta(X_{\mathrm{z}_t}=x|x_{z_{<t}})=\frac{\exp\big(e(x)^Tg_\theta(x_{\mathrm{z}_{<t}},z_t)\big)}{\sum_{x'}\exp\big(e(x')^Tg_\theta(x_{\mathrm{z}_{<t}},z_t)\big)} pθ(Xzt=xxz<t)=xexp(e(x)Tgθ(xz<t,zt))exp(e(x)Tgθ(xz<t,zt))

其中, g θ ( x z < t , z t ) g_\theta(x_{\mathrm{z}_{<t}},z_t) gθ(xz<t,zt) 是在 h θ h_\theta hθ 基础上添加位置信息作为输入的新表达式。将其应用在标准的 Transformer 上,有两点相互矛盾之处:1)为了预测 token x z t x_{z_t} xzt g θ ( x z < t , z t ) g_\theta(x_{\mathrm{z}_{<t}},z_t) gθ(xz<t,zt) 应当只利用位置 z t z_t zt 而不利用 x z t x_{z_t} xzt;2)但为了预测其他 token x z j ( j > t ) x_{z_j}(j>t) xzj(j>t) g θ ( x z < t , z t ) g_\theta(x_{\mathrm{z}_{<t}},z_t) gθ(xz<t,zt) 应当将 x z t x_{z_t} xzt 的内容信息包括在内。因此为了满足以上两点要求,我们引入新的隐藏状态,构建双流自注意力模型:

  • Content Stream 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)}\leftarrow Attention(Q=h_{z_t}^{(m-1)},KV=\mathrm{h}_{\mathrm{z}_{\le t}}^{(m-1)};\theta) hzt(m)Attention(Q=hzt(m1),KV=hzt(m1);θ)
  • Query Stream 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)}\leftarrow Attention(Q=g_{z_t}^{(m-1)},KV=\mathrm{h}_{\mathrm{z}_{<t}}^{(m-1)};\theta) gzt(m)Attention(Q=gzt(m1),KV=hz<t(m1);θ)

其中, m = 1 , . . . , M m=1,...,M m=1,...,M 为自注意力层; h z t h_{z_t} hzt 为内容表达式 (content representation) h θ ( x z ≤ t ) h_\theta(x_{\mathrm{z}_{\le t}}) hθ(xzt) 的简写,作为 Transformer-XL 的常规隐藏状态; g z t g_{z_t} gzt 为 Query 表达式 (query representation) g θ ( x z < t ) g_\theta(x_{\mathrm{z}_{<t}}) gθ(xz<t) 的简写,代表不包含预测目标的上下文语境; Q , K , V Q,K,V Q,K,V 分别代表 Query、Key 和 Value。如下图所示:

在这里插入图片描述
当读者看到上述公式中 Query Stream 的 Key 和 Value 用的是来自 Content Stream 的隐藏状态时,应当非常熟悉,这正是 2017 年发布的第一代 Transformer 的设计:将固定长度的语料作为 Inputs 导入 Encoder,而将语料整体向右移动一个字符作为预测对象 Outputs 导入 Decoder;Inputs 经过一个自注意力层和一个前馈层后,从输出结果中分离 Key 和 Value 给 Decoder;Decoder 经过一个 Mask 自注意力层后保留 Query,接收来自于 Encoder 的 Key 和 Value 进行进一步运算。

对以上过程不熟悉的读者可参读本文第一节。而在第二节中我们提到过,Transformer-XL 由 vanilla Transformer 演变而来,使用的是标准 Transformer 架构。这个架构本身的特点在于 Query 和 Key 你我不分家,两者通过不同的参数从一个矩阵线性 (隐藏状态) 变换而来;继续往下追溯,两者取自同一块语料;属于单流自注意力设计。因此双流自注意力实际上是 XLNet 为了配合有序因子排列,而将 Transformer-XL 的结构还原回初代 Transformer 的架构。Query Stream 中剔除 x z t x_{z_t} xzt 等同于初版 Transformer 中 Decoder 对 Query 的 Mask 操作。

回到论文内容。这时的模型已经可以投入使用,但经过试验发现,有序因子排序增加了数倍的计算量使得模型的收敛速度过于缓慢,为此 XLNet 引入一项超参数 K K K,只对排列尾部的 1 / K 1/K 1/K 个元素进行预测,最大化似然函数。如此以来效率大大提高,而同时不用牺牲模型精度。这个操作称为 partial prediction,同 BERT 只预测 15% 的 token 类似。

XLNet

关于模型的设计还有以下要点:

  • Transformer-XL:关于 Transformer-XL 中的循环机制 (recurrence mechanism) 以及相对位置编码 (relative position encoding),应用到 XLNet 中并没有发生改变。XLNet 会为每一种排列记录隐藏状态记忆序列,而相对位置编码在不同排列方式间保持一致,不随排列方式的变化而变化。以一句话作为总结,我们可以将 XLNet 看成是不同排列下多个 Transformer-XL 的并行。
  • 训练过程:与 BERT 同样分为预训练和微调。预测时只需要关闭 Query Stream,将 Transformer-XL 再度还原回单流注意力的标准形态即可。
  • 问答任务:应用于提供一个问题和一段文本的问答任务时,仿照 BERT,从语料中随机挑选两个样本 segment 组成一个完整的 segment 进行正常训练。只有当两者来自于同一个上下文范围时使用循环机制。而对于相对位置编码,使用可训练参数替换原来的正弦曲线。经过切除测试 (ablation study),BERT 中的 next sentence prediction 并未对模型效果有显著提高,因此不使用。

到这里,XLNet 的介绍也就基本结束了。

成绩

集百家之长,避百家之短的 XLNet 融汇了过去几年里几乎所有相关模型的先进思想,成为超越 BERT 的又一个大一统的集成模型,并在 20 项任务上全面超越前者。其中,18 项任务创造了 SOTA 记录:

  • 分类:GLUE (MNLI, QNLI, STS-B, MRPC, RTE, SST-2, WNLI), RACE, IMDB, Yelp-2, Yelp-5, DBpedia, AG, Amazon-2, Amazon-5
  • 文档排序:NDCG@20, ERR@20
  • 问答:SQuAD
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

XLNet 同时克服了自编码模型和自回归模型的缺陷,并出于 Transformer-XL 优秀的长距离依赖关系捕捉能力,对 BERT 的表现形成碾压趋势。其中最大体量的 XLNet-Large 参照 BERT-Large 的配置,包含 3.4 亿参数,16 个注意力头,24 个 Transformer 层,1024 个隐藏单元。论文指出即使是这样的配置,在训练过后依然呈现欠拟合的态势,而 15 亿参数量 GPT-2 的诞生无疑也预示着,将来 NLP 前沿模型将会持续保持大体量和大规模。这对各项任务的数据提出了更高的要求。更有专业人士研究表明,XLNet 的训练成本高达 6 万美元,接近 BERT 的 5 倍 和 GPT-2 的 1.5 倍。我们期待未来的 NLP 前沿模型能适用于更多的 NLP 任务以及更小的数据集。

预训练参数

XLNet 的官方 Github 地址 提供了使用预训练模型参数,以及应用于单场景下游任务 (回归/分类/SQuAD) 的微调 (fine-tuning) 教程。目前已经发布了包含 24 层自注意力,1024 个隐藏单元和 16 个注意力头的 XLNet-Large 以及 12 层自注意力,768 个隐藏单元和 12 个注意力头的 XLNet-Base,源代码使用 TensorFlow 1.13.1 及 Python 2。请读者自行前往官网下载。

  • 13
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值