《原始论文:Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context》
一句话简介:Transformer-XL架构在vanilla Transformer的基础上引入了两点创新:循环机制(Recurrence Mechanism)和相对位置编码(Relative Positional Encoding),以克服vanilla Transformer的长距离获取弱的缺点。
要正确理解一篇文章,有时需要参考出现在几千个单词前面的一个单词或一个句子。这是一个长期依赖性(long-range dependence)的例子,这是序列数据中常见的现象,处理许多现实世界的任务都必须理解这种依赖。
虽然人类很自然地就会这样做,但是用神经网络建模长期依赖关系仍然很具挑战性。
基于Gating的RNN和梯度裁剪(gradient clipping)技术提高了对长期依赖关性建模的能力,但仍不足以完全解决这个问题。
应对这个挑战的一种方法是使用Transformers,它允许数据单元之间直接连接,能够更好地捕获长期依赖关系。
Transformer 是谷歌在 17 年做机器翻译任务的 “Attention is all you need” 论文中提出的,引起了相当大的反响,业内有“每一位从事 NLP 研发的同仁都应该透彻搞明白 Transformer”的说法。
Transformer模型在输入时采用的是固定长度序列输入,且Transformer模型的时间复杂度和句子/序列长度的平方成正比(每一层的复杂度: O ( n 2 ⋅ d ) O(n^2·d) O(n2⋅d), n n n 为句子/序列长度, d d d 为词向量维度),因此一般序列长度都限制在最大512,因为太大的长度,模型训练的时间消耗太大。
此外Transformer模型又不像RNN这种结构,可以将最后时间输出的隐层向量作为整个序列的表示,然后作为下一序列的初始化输入。所以用Transformer训练语言模型时,不同的序列之间是没有联系的,因此这样的Transformer在长距离依赖的捕获能力是不够的,此外在处理长文本的时候,若是将文本分为多个固定长度的片段,对于连续的文本,这无异于将文本的整体性破坏了,导致了文本的碎片化,这也是Transformer-XL被提出的原因。
Transformer 作为一种特征提取器,在NLP中有广泛的应用。但是 Transformer 需要对输入序列设置一个固定的长度,比如在BERT中,默认长度是512。如果文本序列长度短于固定长度,可以通过填充的方式来解决。如果序列长度超过固定长度,处理起来就比较麻烦。
一种处理方式,就是将文本划分为多个segments。
在语言建模中,Transformers目前使用固定长度的上下文来实现,即将一个长的文本序列截断为几百个字符的固定长度片段,然后分别处理每个片段。
如下图所示,VanillaTransformer模型在训练时具有固定长度上下文:
这造成了两个关键的限制:
为了解决这些限制,谷歌提出一个新的架构:Transformer-XL,它使自然语言的理解超出了固定长度的上下文。Transformer-XL是基于Vanilla Transformer这个模型进行的改进。
Transformer-xl采用了片段级递归机制,从而提高了语言模型的长距离依赖,对长文本的编码更加有效。 Transformer-xl在文本生成任务上具有不错的效果。
Transformer-XL在各种主要的语言建模(LM)基准测试中获得新的最优(SoTA)结果,包括长序列和短序列上的字符级和单词级任务。实验证明, Transformer-XL 有以下优势:
Transformer-XL架构在vanilla Transformer的基础上引入了两点创新来克服vanilla Transformer的缺点。:
与vanilla Transformer相比,Transformer-XL的另一个优势是它可以被用于单词级和字符级的语言建模。
VanillaTransformer模型在训练时具有固定长度上下文 | TransformerXL训练阶段为新段前面的token提供了必要的上下文 |
---|---|
当这两种方法结合使用时,在评估时, Transformer-XL比vanilla Transformer模型具有更长的有效上下文。
在评估期间具有固定长度上下文的vanilla Transformer | 在评估期间具有segment-level 递归的Transformer-XL |
---|---|
移动步长为1个token | 移动步长为一个segment |
与vanilla Transformer的基本思路一样,Transformer-XL仍然是使用分段的方式进行建模,但其与vanilla Transformer的本质不同是在于引入了段与段之间的循环机制,使得当前段在建模的时候能够利用之前段的信息来实现长期依赖性。如下图所示:
在训练期间,为前一个 Segment 计算的 Representation 被修复并缓存,以便在模型处理下一个新的 Segment 时作为扩展上下文重新利用。这个额外的连接将最大可能依赖关系长度增加了N倍(N个Segment的长度),其中N表示网络的深度,因为上下文信息现在可以跨片段边界流动。
在训练阶段,处理后面的段时,每个隐藏层都会接收两个输入:
此外,这种递归机制还解决了上下文碎片问题,为新段前面的token提供了必要的上下文。
RNN 的语言模型的 Recurrence Dependency在同一层layer之间,而TransformerXL可以在不同layer之间,因此 Depency Length为 O ( N × L ) O(N×L) O(N×L)
这两个输入会被拼接,然后用于计算当前段的Key和Value矩阵。对于某个段的某一层的具体计算公式如下:
原则上只要 GPU 内存允许,该方法可以利用前面更多段的信息,测试阶段也可以获得更长的依赖(类似于 DenseNet)。
在测试阶段,与vanilla Transformer相比,其速度也会更快:在vanilla Transformer中,一次只能前进一个step,并且需要重新构建段,并全部从头开始计算;而在Transformer-XL中,每次可以前进一整个段,并利用之前段的数据来预测当前段的输出。
天真地应用 segment-level recurrence是行不通的,因为当我们重用前面的段时,位置编码是不一致的。
例如,考虑一个具有上下文位置[0,1,2,3]的旧段。当处理一个新的段时,我们将两个段合并,得到位置[0,1,2,3,0,1,2,3],其中每个位置id的语义在整个序列中是不连贯的。
在Transformer中,一个重要的地方在于其考虑了序列的位置信息。在分段的情况下,如果仅仅对于每个段仍直接使用Transformer中的位置编码,即每个不同段在同一个位置上的表示使用相同的位置编码,就会出现问题。(下式中U表示位置向量)
为此,我们提出了一种新的相对位置编码方案,使递归机制成为可能。
此外,与其他相对位置编码方案不同,我们的公式使用具有learnable transformations的固定嵌入,而不是earnable embeddings,因此在测试时更适用于较长的序列。
论文对于这个问题,提出了一种新的位置编码的方式,即会根据词之间的相对距离而非像Transformer中的绝对位置进行编码。Transformer中的attention权重计算公式如下:
将其展开可以分解成下面四个部分。 第一层的计算查询和键之间的attention分数的方式为:
E表示embedding,U 表示位置向量。在Transformer-XL中,对上述的attention计算方式进行了变换,转为相对位置的计算,而且不仅仅在第一层这么计算,在每一层都是这样计算。
对比来看:
从另一个角度来解读这个公式的话,可以将attention的计算分为如下四个部分:
将上面的式子合并后,可以得到:
上面整个即使Transformer-XL的两个改变:前面是内容,后面是位置。
结合上面两个创新点,将Transformer-XL模型的整体计算公式整理如下,这里考虑一个N层的只有一个注意力头的模型:
在 AI-Rfou 等人提出的vanilla Transformer上做了两点创新:
尚未在具体的NLP任务如情感分析、QA等上应用。
没有给出与其他的基于Transformer的模型,如BERT等,对比有何优势。
在Github源码中提到,目前的sota结果是在TPU大集群上训练得出,对于我等渣机器党就只能玩玩base模式了。
enwik8和text8数据集
参考资料:
The Transformer Family
【NLP-16】Transformer-XL
7. Transformer-XL原理介绍
一文看懂 9 种Transformer结构!
谷歌升级版Transformer官方解读:更大、更强,解决长文本问题(开源)
Transformer一统江湖:自然语言处理三大特征抽取器比较
谷歌升级版Transformer官方解读:更大、更强,解决长文本问题(开源)
Transformer-XL: Unleashing the Potential of Attention Models