Transformer-XL介绍-transformer和BERT固定长度切分存在的问题和解决方案

https://zhuanlan.zhihu.com/p/84159401

Transformer-XL介绍

ShuYini
等 97 人赞同了该文章

专栏之前的多篇文章都是关于推荐的,接下来几篇跟NLP相关。Transformer-XL来自于论文《Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context》,附个论文链接,<arxiv.org/abs/1901.0286>。Transformer在本专栏的第一篇已经介绍过了,不了解的同学可以看一下这篇文章<张备:自然语言处理中的Transformer和BERT>。Transformer-XL是对Transformer的改进或变种,主要是解决长序列的问题,其中XL表示extra long,在最近流行的XLNet中就是使用Transformer-XL作为基础模块。在下文中,是将Trm-XL放在类似GPT这样的语言模型框架中来介绍,所以理解的时候要放在整个模型中去理解,而不是一个单独的Trm-XL。

一,Vanilla Transformer

transformer作为一种特征提取器,在NLP中有广泛的应用。但是Trm需要对输入序列设置一个固定的长度,比如在BERT中,默认长度是512。如果文本序列长度短于固定长度,可以通过填充的方式来解决。如果序列长度超过固定长度,处理起来就比较麻烦。一种处理方式,就是将文本划分为多个segments。训练的时候,对每个segment单独处理,segments之间没有联系,如下图(a)所示。这存在两个问题,1)因为segments之间独立训练,所以不同的token之间,最长的依赖关系,就取决于segment的长度;2)出于效率的考虑,在划分segments的时候,不考虑句子的自然边界,而是根据固定的长度来划分序列,导致分割出来的segments在语义上是不完整的。

Transformer-XL介绍-transformer和BERT固定长度切分存在的问题和解决方案_第2张图片 Transformer-XL介绍-transformer和BERT固定长度切分存在的问题和解决方案_第3张图片

在预测的时候,会对固定长度的segment做计算,一般取最后一个位置的隐向量作为输出。为了充分利用上下文关系,在每做完一次预测之后,就对整个序列向右移动一个位置,再做一次计算,如上图(b)所示,这导致计算效率非常低。

二,Segment-Level Recurrence

为了解决上面提到的问题,在Trm的基础上,Trm-XL提出了一个改进,在对当前segment进行处理的时候,缓存并利用上一个segment中所有layer的隐向量序列,而且上一个segment的所有隐向量序列只参与前向计算,不再进行反向传播,这就是所谓的segment-level Recurrence。

我们详细看一下如何操作。Trm本身是可以设置multi-heads,但是在后文中为了简化描述采用单个head。将两个连续的segments表示为 , ,L是序列长度。假设整个模型中,包含N层Trm,那么每个segment中就有N组长度为L的隐向量序列,将第 个segment的第n层隐向量序列表示为 ,d是隐向量的维度。那么第 个segment的第n层隐向量序列,可以由下面的一组公式计算得出。SG是stop-gradient,不再对 的隐向量做反向传播。 是对两个隐向量序列沿长度方向的拼接,[]内两个隐向量的维度都是 ,拼接之后的向量维度是 。3个W分别对应query,key和value的转化矩阵。注意q的计算方式不变,只使用当前segment中的隐向量,计算得到的q序列长度仍然是L。k和v采用拼接之后的 来计算,计算出来的序列长度是2L。之后的计算就是标准的Transformer计算。计算出来的第n层隐向量序列长度仍然是L,而不是2L。Trm的输出隐向量序列长度取决于query的序列长度,而不是key和value。

Transformer-XL介绍-transformer和BERT固定长度切分存在的问题和解决方案_第4张图片 Transformer-XL介绍-transformer和BERT固定长度切分存在的问题和解决方案_第5张图片

训练和预测过程如下图所示。这张图上有一个点需要注意,在当前segment中,第n层的每个隐向量的计算,都是利用下一层中包括当前位置在内的,连续前L个长度的隐向量,这是在上面的公式组中没有体现出来的,也是文中没有明说的。每一个位置的隐向量,除了自己的位置,都跟下一层中前(L-1)个位置的token存在依赖关系,而且每往下走一层,依赖关系长度会增加(L-1),如下图中Evaluation phase所示,所以最长的依赖关系长度是N(L-1),N是模型中layer的数量。N通常要比L小很多,比如在BERT中,N=12或者24,L=512,依赖关系长度可以近似为 。在对长文本进行计算的时候,可以缓存上一个segment的隐向量的结果,不必重复计算,大幅提高计算效率。

Transformer-XL介绍-transformer和BERT固定长度切分存在的问题和解决方案_第6张图片 Transformer-XL介绍-transformer和BERT固定长度切分存在的问题和解决方案_第7张图片

上文中,我们只保存了上一个segment,实际操作的时候,可以保存尽可能多的segments,只要内存或者显存放得下。论文中的试验在训练的时候,只缓存一个segment,在预测的时候,会缓存多个segments。

三,Relative Position Encodings

在vanilla Trm中,为了表示序列中token的顺序关系,在模型的输入端,对每个token的输入embedding,加一个位置embedding。位置编码embedding或者采用正弦\余弦函数来生成,或者通过学习得到。在Trm-XL中,这种方法行不通,每个segment都添加相同的位置编码,多个segments之间无法区分位置关系。Trm-XL放弃使用绝对位置编码,而是采用相对位置编码,在计算当前位置隐向量的时候,考虑与之依赖token的相对位置关系。具体操作是,在算attention score的时候,只考虑query向量与key向量的相对位置关系,并且将这种相对位置关系,加入到每一层Trm的attention的计算中。

我们对两种方法做个对比。下面一组公式是vanilla Trm计算attention的方式, 表示token的输入embedding,U是绝对位置编码embedding,两个W分别是query矩阵和key矩阵。下面的公式是对 做了分解。

Transformer-XL介绍-transformer和BERT固定长度切分存在的问题和解决方案_第8张图片 Transformer-XL介绍-transformer和BERT固定长度切分存在的问题和解决方案_第9张图片

下面一组公式,是Trm-XL计算attention的方式。首先,将绝对位置编码U,替换成了相对位置编码 。插一句,因为i只利用之前的序列,所以i-j>=0。其次,对于所依赖的key向量序列,query向量 都是固定的,因此将上面公式组(c)中的 替换为 ,将上面(d)中的 替换为 ,u和v都通过学习得到。最后,将 矩阵再细分成两组矩阵 和 ,分别生成基于内容的key向量和基于位置的key向量。可以仔细思考一下每一项中的依赖关系。

Transformer-XL介绍-transformer和BERT固定长度切分存在的问题和解决方案_第10张图片 Transformer-XL介绍-transformer和BERT固定长度切分存在的问题和解决方案_第11张图片

相对位置关系用一个位置编码矩阵 来表示,第i行表示相对位置间隔为i的位置向量。论文中强调R采用正弦函数生成,而不是通过学习得到的,好处是预测时,可以使用比训练距离更长的位置向量。

最后来看一下Trm-XL的完整计算公式,如下所示,只有前3行与vanilla Trm不同,后3行是一样的。第3行公式中,计算A的时候直接采用query向量,而不再使用 表示。最后需要注意的是,每一层在计算attention的时候,都要包含相对位置编码。而在vanilla Trm中,只有在输入embedding中才包含绝对位置编码,在中间层计算的时候,是不包含位置编码的。

Transformer-XL介绍-transformer和BERT固定长度切分存在的问题和解决方案_第12张图片 Transformer-XL介绍-transformer和BERT固定长度切分存在的问题和解决方案_第13张图片

总结,Trm-XL为了解决长序列的问题,对上一个segment做了缓存,可供当前segment使用,但是也带来了位置关系问题,为了解决位置问题,又打了个补丁,引入了相对位置编码。

最后,如有介绍不清楚的地方,欢迎讨论。如有纰漏,欢迎指出。如果觉得文章不错,可以关注我的专栏。

编辑于 2020-09-06
「真诚赞赏,手留余香」
赞赏
还没有人赞赏,快来当第一个赞赏的人吧!
自然语言处理
深度学习(Deep Learning)
Transformer
​ 赞同 97​
​ 46 条评论
​ 分享
​ 喜欢 ​ 收藏 ​ 申请转载
赞同 97
分享

你可能感兴趣的:(NLP基础知识)