NLP论文笔记:Transformer XL

Transformer 提出后 在NLP领域开辟来一个新天地,但是Transformer 无法实现长距离的依赖性使得对长文本不方便处理,一般情况都要切成小的segment输入模型得到结果,缺点就是无法利用segment与segment之间的信息,这导致影响长文本训练结果。
所以很多人开始研究 如何基于 Transformer 做长距离依赖性的改善。

这里面主要讲的是谷歌大脑提出的 Transformer-XL

首先简单看一下 注意力 head里面内容:

下图是一个注意力head 在一个token上的流程。
NLP论文笔记:Transformer XL_第1张图片
Ai-Rfou. et将transformer 用在翻译上,提出来基于语言模型的transformer 改进。一个个移动预测下一个词,因为transformer 窗口大小是512,当预测513个词的时候 窗口移动到1-513,这样513 就可以利用1-512的信息来预测(但是窗口也只有这么大,无法建立segment之间的联系),而不是作为一个单独的开始(但是1就没有前面的上下文信息了,所以这个也是一个缺点)。如下图:
NLP论文笔记:Transformer XL_第2张图片
结果在enwik8 和text8上比 RNN 的要好。但是这个模型也有2个缺点:

  • 有限的上下文依赖性。这种方法,最长的上下文依赖还是512大小的窗口,比如518个单词 就无法利用前0-5单词的信息。
  • 另外一个就是上下文分块。每个segment 都是分块训练的。所以其实还是没有建立起 上下文 模块segment之间的依赖性 以及所有第一个单词的上下文缺失。这导致训练不够有效,并且会影响模型效果。

Transformer -XL

Transformer-XL 在上面的vanilla Transformer 的基础上,引进了2个新的技术来覆盖上面的2个缺点:循环机制和相对位置编码( Recurrence Mechanism and Relative Positional Encoding)另外一个优点就是该模型既可用于word-level也可用于character-level。

Recurrence Mechanism 循环机制

循环机制的目标就是通过前一个segment的信息 建立长距离的依赖性。Transformer-XL处理第一个segment的token,但是保留hidden layers的输出,当处理下一个segment时,每个hidden layer接受2个input:

  • 当前segment的 前一个hidden layer层输出。(灰色线)
  • 前一个segment的hidden layer 建立长距离依赖性。(绿色线)
    在技术实现上,这两个输入是concatenated 一起的,然后用于计算当前segment的 当前head 当前layer的key 和 value 矩阵。这个在(重要性)权重方面 额外给网络提供来更多的信息,但是并不影响value矩阵。
    NLP论文笔记:Transformer XL_第3张图片

这个想法可以解释为 通过使用前几个segment的信息来构造长距离依赖性。
另外一个优势是在验证时循环机制的速度很快。 In each step, it can advance by an entire segment (and not by one token as in the vanilla version) and use the previous segments’ data to predict the current segment tokens.

下式中的n是Transformer层数,τ表示上一个segment,τ+1表示当前segment,简单而言就是会把上一个segment的hidden state沿着句子长度的方向与当前segment的hidden state进行concat,因此比如每个segment长度为4,那么concat之后长度就为8,然后再在这个concat过后的长度上进行Transformer操作。
下面的 h n − 1 τ h^τ_{n-1} hn1τ 表示上一个segment的第n-1层,SG表示对梯度进行截断计算,这样的计算不会影响(更新)上一个segment的第n-1层的参数,o 表示拼接。拼接后得到当前segment的第n-1层的hidden state。然后再计算k 和 v. 注意这里原来的 q是不含前面的segment的。最后通过ttransformer 层得到当前segment的第n层的hidden state。
NLP论文笔记:Transformer XL_第4张图片
用这种方法能够建模得到的最长依赖为NL,N是Transformer的层数,L是每个segment的长度。这里的原因是每一层都可以往前建模L的依赖,累积N层后,最长的依赖关系便是NL。注意,该方法可以存储多个segment的隐状态来继续增大感受野,而不仅仅局限于前一个segment。

Relative Positional Encoding 相对位置编码

循环机制的引入,也带来来一些新的挑战:原始位置编码是每个segment 单独处理的,所以来自不同的segment的token在同一个位置有相同的编码。比如在第一个和第二个segment的第一个token 的编码都一样,尽管他们的位置和重要性并不同(也许第一个segment的那个token的重要性更低),每个segment里面相同的位置编码也会影响网络的准确性。
如下式所示,因为这两个segment使用的是同一个,那么可能会导致模型无法区分这两个segment的相对位置。比如,如果前一个segment的长度为4,其位置序列为[0,1,2,3]。当处理当前的segment时,我们将两个segment合并,得到位置 [0,1,2,3,0,1,2,3],其中每个位置id的语义在整个序列中是不连贯的。如果按照以前的编码 就是下面的公式 这个id无法表达出不同segment的区别。
NLP论文笔记:Transformer XL_第5张图片
由于绝对位置无法区分不同segment之间的同一个位置的词的顺序。作者就开始做改进,先看一下之前绝对位置编码的操作:
第一步:计算出位置编码
NLP论文笔记:Transformer XL_第6张图片
第二步:计算qkv
NLP论文笔记:Transformer XL_第7张图片
第三步:得到attention值 和拼接后的向量。
NLP论文笔记:Transformer XL_第8张图片
位置信息在第一步的时候就和词向量进行了相加。Xi 和 Xj 之间 attention 得分 最后整个公式表达出来如下:
A i , j a b s = ( W q ( E x i + U i ) ) T ( W k ( E x j + U j ) ) A^{abs}_{i,j} = (W_q(E_{x_i} + U_i))^T(W_k(E_{x_j}+U_j)) Ai,jabs=(Wq(Exi+Ui))T(Wk(Exj+Uj))

U就是位置信息,上面就是 Q x i ∗ K x j Q_{x_i} * K_{x_j} QxiKxj,把上面进行拆分得到下图:
NLP论文笔记:Transformer XL_第9张图片

  • a第i个词与第j个词的语义相关性
  • b第i个词与第j个词的位置做了一个相乘
  • c第i个词的位置与第j个词的语义
  • d第i个词与第j个词的位置
    我们想要表示每个词之间的相对位置,因此把Ui,Uj 替换掉,变成i与j之间差多少个词,也就是下面蓝色的部分
    NLP论文笔记:Transformer XL_第10张图片
    NLP论文笔记:Transformer XL_第11张图片
    因此,对于位置编码,本文工作如下:
    1.引入相对位置编码,用的是Transformer里用的sinusoid encoding matrix
    2.引入u和v,在计算self-attention时,由于query所有位置对应的query向量是一样的,因此不管的query位置如何,对不同单词的attention偏差应保持相同。

总结:
文中提出来一个新的位置编码作为attention模块的一部分。文中提出的是相对位置编码而不是绝对位置,并且并不是在第一层输入的时候添加的。技术层面上,相当于简单的扩展 Attention Head’s Score (Qi*Kj) 使得这个score 包含4部分:

  • content weight , 上下文权重,这个是原始的score 没有额外位置编码的score
  • positional bias with respect to the current content(Qi),相对于当前内容的位置偏移量,使用简单的正弦公式来得到 处理两个token之间距离(i-j)而不是当前token的绝对位置。
  • a learned global content bias, 可以学习的全局上下文偏差。。。模型增加一个可以学习的向量用来调整其他上下文token的重要性 (Kj)。(其实就调整全部的content 在当前token上的权重)
  • a learned global bias, 可学习的全局偏差。模型增加的另外一个可学习的向量是用来调整 仅仅基于 token之间距离的 重要性。。比如当前单词的前面的一个单词的重要性大概率是比上一个段落里面的单词重要。

Results

结果当然不错了。
作者在word-level 和 character-levels数据集上 与其他模型效果作了对比。Transformer-XL 在几个不同的数据集上可以达到最佳效果

  • WikiText-103, word-level 数据集。18-layer Transformer-XL (257M parameters) 可达到 perplexity 18.3 ( 对比之前Baevski & Auli, SOTA结果是 20.5).
  • On enwik8, character-level 数据集。 the 12-layer Transformer-XL reached 1.06 bits per character (bpc), (与之前的SOTA by AI-Rfou 结果一致,但是他们的参数是Transformer-XL的6倍)。The 24-layer Transformer-XL achieved a new SOTA with 0.99 bpc.
  • 模型在短距离依赖上面也可以达到 SOTA ( One Billion Word 只有单独的句子, 小数据集Penn Treebank 只有 1M tokens),这表明模型在这些情况下也是很有效。

    下面就是作者的消融实验 对比各个模块的重要性:
    下图就是通过评估模型在不同长度的context 上的 迷惑度(越低越好)对比循环机制和相对位置编码的重要性。
  • TransformerXL是最终模型,
  • Transformer-XL with shaw et al encoding 是用原来的token的个数作为位置编码,
  • Transformer-XL w/o recurrence 去除循环机制。
    可以看出 完整的Transformer-XL远远超过另外2个,并且可以承受更长的依赖性
    此外,这个长距离的依赖性超过RNN (80% longer).
    NLP论文笔记:Transformer XL_第12张图片
    该模型在使用的时候或者验证的时候 也比vanilla Transformer 快很多,尤其是在长文本上。 比如一个800个单词长的文本,Transformer-XL要快363倍,3800 characters 的文本 要快1874倍。

实现的上:TensorFlow 和 PyTorch (including pre-trained models)的预训练模型都有

结论:
Transformer-XL 是目前语言模型里面在不同数据集(大/小,字母/单词 级别)上都可以达到 SOTA. 该模型结合来深度学习的2种重要的机制:循环和注意力 使得模型可以学到长距离的依赖,这个在深度学习其他领域也有效果 如 语音分析 。 这个模型没有在其他NLP任务上测试(比如语义分析,或者问答) 在其他任务上是否能达到比基于Transformer的模型更好的效果 还不知道。

参考:
transformer-xl
Transformer XL blog
illustrated-transformer

你可能感兴趣的:(NLP)