【NLP】TransformerXL:因为XL,所以更牛

前面介绍过Transformer作为一种特征抽取器的强大之处。那么,它有没有弱点呢?能不能改进呢?

本文介绍Transformer的改进版,TransformerXL。看看它用了什么方法,改进了Transformer的哪些弱点。

作者&编辑 | 小Dream哥

1 原始Transformer哪里不好?

在上一篇“理解NLP中网红特征抽取器Transformer”中,笔者介绍了Transformer的强大之处。那么,Transformer就已经强大到无懈可击了吗?其实不然,Transformer还有它的弱点。

细想一下,BERT在应用Transformer时,有一个参数sequence length,也就是BERT在训练和预测时,每次接受的输入是固定长度的。那么,怎么输入语料进行训练时最理想的呢?当然是将一个完整的段落一次性输入,进行特征提取了。但是现实是残酷的,这么大的Transformer,内存是消耗不起的。所以现有的做法是,对段落按照segment进行分隔。在训练时,当输入segment序列比sequence length短时,就做padding;当输入segment序列比sequence length长时就做切割

这种做法显然是一种权宜之计,它有这么两个缺点:

1)长句子切割必然会造成语义的残破,不利于模型的训练。

2)segment的切割没有考虑语义,也就是模型在训练当前segment时拿不到前面时刻segment的信息,造成了语义的分隔。

那么,该如何解决上述问题呢?看看TransformerXL吧。

2 TransformerXL的引入

我们先想一下,如果要我们自己来解决Transformer上面的问题,会怎么处理呢?

熟悉NLP的同学,可能会想到RNN。在RNN中,为了获取序列中的历史记忆,采用了Recurrence机制,在计算该时刻的状态时,引入前一时刻的状态作为输入。那对Transformer来说,在计算当前序列的隐藏状态时,引入前一个序列的隐藏状态信息不就可以解决上面的问题了吗?

事情真的有这么简单吗?其实,基本上也就是这么简单,不过TransformerXL在引入时做了一些巧妙的设计。下面我们看看,TransformerXL是如何引入这种Recurrence机制来解决上述问题的。

如图所示,是传统的Transformer在训练和评估阶段采用的语料输入策略。在训练时,将整个语料库分割成可管理的大小的更短的片段,在每个片段中训练模型,忽略来自前一段的所有上下文信息;在评估阶段,传统的Transformer模型在每个步骤都消耗与训练期间相同长度的一个segment。然后,在下一步中,这个segment向右移动一个位置,并从头开始处理,只在最后一个位置进行一次预测。

如上图所示,在TransformerXL采用了不同的策略,在训练过程中,对上一个segment计算的隐藏状态序列进行固定和缓存,并在模型处理下一个新的segment时对其进行利用。在评估阶段,可以重用前面部分的表示,而不是像传统模型那样从头开始计算,这样可以提高速度。

3 TransformerXL Recurrence机制

那么,上述的机制细节如何实现的呢?下面我们来做一个详细的介绍。

事实上,问题的关键在于,在计算当前序列当前层的隐藏状态时,如何引入前一个序列上一层的隐藏状态。TransformerXL的做法很简单,就是按照序列长度的维度将他们concate起来。如下的公式所示:

h_n_t是一个L*d的矩阵,表示的是第t个输入序列的第n层的隐藏层的状态。L表示序列长度,d表示嵌入维度。

SG表示的Stop Gradient,这非常重要,避免了RNN会出现的一系列问题。

从上述公式可以看出,TransformerXL与传统的Transformer的差异主要在于隐藏层输入KV的差异。TransformerXL中引入了上一个序列前一个隐藏层的值,将他们concatenate起来,计算新的KV

4 Relative Positional Encodings

我们再想一想,引入上述机制,还有什么问题没有。我们回想一下,在传统的Transformer中,输入序列中的位置信息是怎么表示的?通过POS函数生成,它是位置i和维度d的函数,也就是不同输入segment在相同绝对位置中的位置表示是相同的。在传统的Transformer中,每个segment之间的表示是没有关联的,这当然就没有问题。但是在TransformerXL中,因为引入了前一时刻segment的信息,就需要对不同时刻,同样是第i个的词进行区分。

TransformerXL引入了一种Relative Positional Encodings机制,会根据词之间的相对距离而非像传统的Transformer中的绝对位置进行编码。

在传统的Transformer中,计算q_i和键k_j之间的attention分数的方式为

展开就是:

Exi是词i的embedding,Exj是词j的embedding,Ui 和Uj 是位置向量。

在Transformer-XL中,对上述的attention计算方式进行了变换,转为相对位置的计算,而且不仅仅在第一层这么计算,在每一层都是这样计算。

对比来看,主要有三点变化:

1)在b和d这两项中,将所有绝对位置向量UiUj都转为相对位置向量Ri−j,与Transformer一样,这是一个固定的编码向量,不需要学习。

2)在c这一项中,将查询的U_i^T*W_q^T向量转为一个需要学习的参数向量u,因为在考虑相对位置的时候,不需要查询绝对位置i,因此对于任意的i,都可以采用同样的向量。同理,在d这一项中,也将查询的U_i^T*W_q^T向量转为另一个需要学习的参数向量v

3)将K的权重变换矩阵Wk转为Wk_E 和Wk_R,分别作为content-based key vectors和location-based key vectors。

总的来说,Relative Positional Encodings就是在计算attention分数时,用相对位置R_i_j编码来代替原来的绝对位置编码Ui和Uj。并且学习了相对位置v和u用来调整不同距离和不同嵌入的得分。

5 总结

总的来说TransformerXL对Transformer进行了一些调整,试图解决一些问题。按照论文的描述,TransformerXL学习的依赖关系比RNN长80%,比传统Transformer长450%,在短序列和长序列上都获得了更好的性能,并且在评估阶段比传统Transformer快1800+倍

在XLnet中引入了Transformer-XL,获得了不错的效果。

总结

TransformerXL是Transformer一种非常重要的改进,思想值得我们好好学习和研究,希望对你有所帮助。

(0)

相关推荐