1. 引言
在自然语言处理中,当前深度学习主流的结构是RNN和Transformer,因为这两种结构能够比较好地捕捉文本的上下文信息,但是,我们知道RNN主要的问题是梯度消失和梯度爆炸的问题,而且其捕捉上下文的长度没有Transformer那么强大,而Transformer虽然能力比较强,但是在预测时会受到训练时所设定的最大长度限制,因此,本文将介绍一个Transformer模型的变体,即Transformer XL(extra long),该模型是CMU和谷歌大脑在2019年提出来的,通过引入了递归的机制和相对位置编码,解决了Transformer长度限制的问题,作者在实验中发现,Transformer XL能捕捉到的文本长度比RNN长80%。
2. Transformer XL原理介绍
2.1 Vanilla Transformer
在介绍Transformer模型之前,先介绍另一个模型,该模型是2018年由Al-Rfou等人提出来的,作者称之为Vanilla Transformer,该模型其实本质上还是Transformer,只是将原来的句子进行切片,切成一个一个固定长度的短句子进行训练,如下图中的(a)所示,然后在预测时,采用训练时所设定的长度窗口,在句子上进行平移,从而不断获得句子的预测,如下图中的(b)所示,虽然这样操作可以解决句子的长度限制问题,但是存在两个主要的缺点:①每次平移后,模型都是从头开始计算,并没有利用前面计算得到的上文信息,因此,会出现一种“上下文断裂”的情况;②在预测时,当句子的长度比较长时,计算速度会非常慢,因为每次窗口只移动一个时间步,这样会导致很多信息重复计算。作者在实验中发现,采用Transformer XL模型,速度是Vanilla Transformer的1800多倍。
2.2 Segment-Level Recurrence
为了克服Vanilla Transformer模型的缺点,Transformer XL引入了一种递归的机制,即通用将句子按照固定的长度 L L L分成若干个子句,然后在训练和预测时,依次将每个子句传入Transformer模型,并且将每个子句在Transformer中各层的输出传递给下一个子句,如下图(a)中绿色线,在下一个子句每一层的计算中,将上一个子句对应上一层的输出与当前子句对应层的输入进行拼接,这样在每一个子句的预测时,就可以考虑到前面各个子句的信息。
记两个连续的子句为 s τ = [ x τ , 1 , ⋯   , x τ , L ] \mathbf{s}_{\tau}=\left[x_{\tau, 1}, \cdots, x_{\tau, L}\right] sτ=[xτ,1,⋯,xτ,L], s τ + 1 = [ x τ + 1 , 1 , ⋯   , x τ + 1 , L ] \mathbf{s}_{\tau+1}=\left[x_{\tau+1,1}, \cdots, x_{\tau+1, L}\right] sτ+1=[xτ+1,1,⋯,xτ+1,L],记第 τ \tau τ个子句第 n n n层的输出为 h τ n ∈ R L × d \mathbf{h}_{\tau}^{n} \in \mathbb{R}^{L \times d} hτn∈RL×d,其中 d d d表示隐藏层的维度,则第 τ + 1 \tau+1 τ+1个子句 s τ + 1 \mathbf{s}_{\tau+1} sτ+1第 n n n层的输出计算如下:
h ~ τ + 1 n − 1 = [ S G ( h τ n − 1 ) ∘ h τ + 1 n − 1 ] q τ + 1 n , k τ + 1 n , v τ + 1 n = h τ + 1 n − 1 W q ⊤ , h ~ τ + 1 n − 1 W k ⊤ , h ~ τ + 1 n − 1 W v ⊤ h τ + 1 n = Transformer-Layer ( q τ + 1 n , k τ + 1 n , v τ + 1 n ) \begin{array}{l}{\widetilde{\mathbf{h}}_{\tau+1}^{n-1}=\left[\mathrm{SG}\left(\mathbf{h}_{\tau}^{n-1}\right) \circ \mathbf{h}_{\tau+1}^{n-1}\right]} \\ {\mathbf{q}_{\tau+1}^{n}, \mathbf{k}_{\tau+1}^{n}, \mathbf{v}_{\tau+1}^{n}=\mathbf{h}_{\tau+1}^{n-1} \mathbf{W}_{q}^{\top}, \widetilde{\mathbf{h}}_{\tau+1}^{n-1} \mathbf{W}_{k}^{\top}, \widetilde{\mathbf{h}}_{\tau+1}^{n-1} \mathbf{W}_{v}^{\top}} \\ {\mathbf{h}_{\tau+1}^{n}=\text { Transformer-Layer }\left(\mathbf{q}_{\tau+1}^{n}, \mathbf{k}_{\tau+1}^{n}, \mathbf{v}_{\tau+1}^{n}\right)}\end{array} h τ+1n−1=[SG(hτn−1)∘hτ+1n−1]qτ+1n,kτ+1n,vτ+1n=hτ+1n−1Wq⊤,h τ+1n−1Wk⊤,h