Transformer-XL详解

1. 介绍

为了帮助理解XLNet,本文对其核心框架Transformer-XL作一个解读。本文发表在ACL2019上,论文想要解决的问题:如何赋予编码器捕获长距离依赖的能力。

目前在自然语言处理领域,Transformer的编码能力超越了RNN,但是对长距离依赖的建模能力仍然不足。在基于LSTM的模型中,为了建模长距离依赖,提出了门控机制和梯度裁剪,目前可以编码的最长距离在200左右。在基于Transformer的模型中,允许词之间直接建立联系【self-attention】,能够更好地捕获长期依赖关系,但是还是有限制。

2. 动机

目前已有的Transformer对于非常长的文本的处理方式是:Transformer编码固定长度的上下文,即将一个长的文本序列截断为几百个字符的固定长度片段(segment),然后分别编码每个片段,但片段之间没有任何的信息交互。(比如基于Transformer的BERT,序列长度的极限一般在512

那么这就引发了几个动机:

  1. Transformer无法建模超过固定长度的依赖关系,对长文本编码效果差
  2. Transformer把要处理的文本分割成等长的片段,通常不考虑句子(语义)边界,导致上下文碎片化(context fragmentation)。通俗来讲,一个完整的句子在分割后,一半在前面的片段,一半在后面的片段。

所以才有了Transformer-XL的提出(XL是extra long的意思):

  1. 提出片段级递归机制(segment-level recurrence mechanism),引入一个记忆(memory)模块(类似于cache或cell),循环用来建模片段之间的联系
    使得长距离依赖的建模成为可能;
    使得片段之间产生交互,解决上下文碎片化问题。
  2. 提出相对位置编码机制(relative position embedding scheme),代替绝对位置编码。
    在memory的循环计算过程中,避免时序混淆【见model部分】,位置编码可重用。

小结一下,片段级递归机制为了解决编码长距离依赖和上下文碎片化,相对位置编码机制为了实现片段级递归机制而提出,解决可能出现的时序混淆问题。

3. 模型

普通的Transformer对于长文本数据是通过每个segment分别编码,相互之间不产生任何交互。

3.1 片段级递归机制

为了解决长距离依赖,文章引入一个memory状态。

在训练过程中,每个片段的表示为最后的隐层状态​。
在计算​片段的表示时,用memory缓存​片段​层的隐层状态​,用来更新​,这样就给下一个片段一个上文信息,长距离依赖也通过memory保存了下来。并且,最大可能的依赖长度线性增长,达到 NLN*L
点这里看动图效果。

3.2 相对位置编码机制

在实现片段级递归时遇到一个问题:如果采用绝对位置编码,不同片段的位置编码是一样的,这很显然是不对的。

因此,该模型引入相对位置编码机制,计算self-attention公式如下:
Transformer-XL详解
知道其引入的是相对位置编码即可,具体暂不深究。

3.3 更快的速度

在评估时,Transformer-XL比普通的Transformer具有更长的有效上下文,并且Transformer-XL能够在不需要重新计算的情况下处理新段中的所有元素,显著提高了速度。点这里看评估阶段的对比图。(XL 可以重复使用先前片段中的表示,不需要像 普通 Transformer 那样重新计算。)

4. 实验

重点是本文设计的相对位置编码优于其他工作,memory的设计也有很大的提升。

补充材料中Transformer-XL生成的文本也比较有意思。

最后,Transformer-XL在评估阶段的速度也明显快于 普通 Transformer,特别是对于较长的上下文。例如,对于 800 个字符的上下文长度,Transformer-XL 比Vanilla Transformer 快 363 倍;而对于 3800 字符的上下文,Transformer-XL 快了 1874 倍。

5. 结论

Transformer-XL从提高语言模型的长距离依赖建模能力出发,提出了片段级递归机制,设计了更好的相对位置编码机制,对长文本的编码更有效。不仅如此,在评估阶段速度更快,很巧妙。

在此基础上,XLNet从无监督预训练方法出发,对比自回归语言模型和自编码语言模型的优缺点,设计出了排队语言模型,在自然语言处理下游任务中大放异彩。(下一篇讲到XLNet的时候,继续补充)

预训练语言模型属于自监督学习的范畴,这两篇论文从语言模型的根本问题出发(建模长距离依赖/更好地编码上下文),提出一个主要方法(片段级递归机制/排列语言模型),在实现过程中发现需要重新设计子模块(相对位置编码/双流注意力机制),最后完成significant work,使得设计的任务很有说服力,理论性强。