Transformer 提出后 在NLP领域开辟来一个新天地,但是Transformer 无法实现长距离的依赖性使得对长文本不方便处理,一般情况都要切成小的segment输入模型得到结果,缺点就是无法利用segment与segment之间的信息,这导致影响长文本训练结果。
所以很多人开始研究 如何基于 Transformer 做长距离依赖性的改善。
这里面主要讲的是谷歌大脑提出的 Transformer-XL
首先简单看一下 注意力 head里面内容:
下图是一个注意力head 在一个token上的流程。
Ai-Rfou. et将transformer 用在翻译上,提出来基于语言模型的transformer 改进。一个个移动预测下一个词,因为transformer 窗口大小是512,当预测513个词的时候 窗口移动到1-513,这样513 就可以利用1-512的信息来预测(但是窗口也只有这么大,无法建立segment之间的联系),而不是作为一个单独的开始(但是1就没有前面的上下文信息了,所以这个也是一个缺点)。如下图:
结果在enwik8 和text8上比 RNN 的要好。但是这个模型也有2个缺点:
Transformer-XL 在上面的vanilla Transformer 的基础上,引进了2个新的技术来覆盖上面的2个缺点:循环机制和相对位置编码( Recurrence Mechanism and Relative Positional Encoding)另外一个优点就是该模型既可用于word-level也可用于character-level。
循环机制的目标就是通过前一个segment的信息 建立长距离的依赖性。Transformer-XL处理第一个segment的token,但是保留hidden layers的输出,当处理下一个segment时,每个hidden layer接受2个input:
这个想法可以解释为 通过使用前几个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} hn−1τ 表示上一个segment的第n-1层,SG表示对梯度进行截断计算,这样的计算不会影响(更新)上一个segment的第n-1层的参数,o 表示拼接。拼接后得到当前segment的第n-1层的hidden state。然后再计算k 和 v. 注意这里原来的 q是不含前面的segment的。最后通过ttransformer 层得到当前segment的第n层的hidden state。
用这种方法能够建模得到的最长依赖为NL,N是Transformer的层数,L是每个segment的长度。这里的原因是每一层都可以往前建模L的依赖,累积N层后,最长的依赖关系便是NL。注意,该方法可以存储多个segment的隐状态来继续增大感受野,而不仅仅局限于前一个segment。
循环机制的引入,也带来来一些新的挑战:原始位置编码是每个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的区别。
由于绝对位置无法区分不同segment之间的同一个位置的词的顺序。作者就开始做改进,先看一下之前绝对位置编码的操作:
第一步:计算出位置编码
第二步:计算qkv
第三步:得到attention值 和拼接后的向量。
位置信息在第一步的时候就和词向量进行了相加。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} Qxi∗Kxj,把上面进行拆分得到下图:
总结:
文中提出来一个新的位置编码作为attention模块的一部分。文中提出的是相对位置编码而不是绝对位置,并且并不是在第一层输入的时候添加的。技术层面上,相当于简单的扩展 Attention Head’s Score (Qi*Kj) 使得这个score 包含4部分:
结果当然不错了。
作者在word-level 和 character-levels数据集上 与其他模型效果作了对比。Transformer-XL 在几个不同的数据集上可以达到最佳效果
实现的上:TensorFlow 和 PyTorch (including pre-trained models)的预训练模型都有
结论:
Transformer-XL 是目前语言模型里面在不同数据集(大/小,字母/单词 级别)上都可以达到 SOTA. 该模型结合来深度学习的2种重要的机制:循环和注意力 使得模型可以学到长距离的依赖,这个在深度学习其他领域也有效果 如 语音分析 。 这个模型没有在其他NLP任务上测试(比如语义分析,或者问答) 在其他任务上是否能达到比基于Transformer的模型更好的效果 还不知道。
参考:
transformer-xl
Transformer XL blog
illustrated-transformer