深入浅出Embedding:原理解析与应用实践
上QQ阅读APP看书,第一时间看更新

5.5 Transformer-XL

Transformer使用自注意力机制,可以让单词之间直接建立联系,因此Transformer编码信息和学习特征的能力比RNN强。但是Transformer在学习长距离依赖信息的能力方面仍然会受到上下文长度固定的限制。此外,对语料库进行分段时,由于下行文需固定长度,所以会导致两个问题:

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

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

为解决Transformer的这些不足,人们提出了Transformer-XL。利用Transformer-XL可以提高vanilla Transformer学习长期依赖信息的能力。

注意,Transformer-XL并非直接从2017年发布的原始Transformer演化而来,而是一个叫vanilla Transformer的版本。Transformer-XL是Google在2019年提出的一种语言模型训练方法,它有两个创新点:循环机制(Recurrence Mechanism)和相对位置编码(Relative Positional Encoding),以克服vanilla Transformer捕捉长距离依赖的缺点并解决上下文碎片化问题。更多内容可参考相关论文Transformer-XL:Attentive Language Models Beyond a Fixed-Length Context。相应代码地址为https://github.com/kimiyoung/transformer-xl/。

5.5.1 引入循环机制

与vanilla Transformer的相似之处是,Transformer-XL仍然使用分段的方式进行建模,但其与vanilla Transformer的不同之处是Transformer-XL引入了段(segment)与段之间的循环机制,使得当前段在建模的时候能够利用之前段的信息来实现长期依赖性,在训练时前一个段的输出只参与正向计算,而不用进行反向传播,如图5-36所示。

131-1

图5-36 Transformer-XL的训练过程

图5-36是Transformer-XL的训练过程,可以看到Transformer-XL在训练一个新的段时,会利用前一个段的信息,如果内存允许,也可以多保留几个段。图5-36中较粗的线段表示当前段利用前一个段的信息。因此在训练第τ + 1个段时,Transformer-XL中第n层的输入包括:

1)第τ+1个段的第n-1层的输出,图中较淡线段,计算反向梯度;

2)第τ个段第n-1层的输出,图中较粗线段,这部分不计算反向梯度,具体可参考表达式(5.24)。

训练第τ+1个段时,可用下面的公式计算Transformer-XL第n层的隐含状态:

131-2

其中:

  • 131-3表示第τ+1个段第n层的输出;
  • 131-4表示第τ+1个段的输入包括第τ个段的信息(又称为缓存memory)。
  • SG(Stop Gradient)表示停止计算梯度,即无反向传播,只正向传播。
  • [°]表示拼接向量,一般用函数concat实现。
  • 131-5表示Transformer的qkv向量。

注意,计算131-6时没有使用131-7,因q表示要预测的单词,无须前一个段的信息。

以上为训练阶段涉及的主要信息,在测试或评估阶段,传统Transformer在评估的时候,一次只能往右前进一步,输出一个单词,并且需要从头开始计算。而在Transformer-XL中,每次可以前进一个段,并且利用前面多个段的信息来预测当前的输出。如图5-37所示,Transformer-XL可以支持的最长依赖近似于O(N×L),L表示一个段的长度,N表示Transformer的层数。

132-1

图5-37 Transformer-XL评估阶段

5.5.2 使用相对位置编码

循环机制涉及多个段,在不同段标识中,对相同位置(或索引)的标识对应的位置编码也相同。在标准Transformer中,我们通过位置编码来区分标识的先后顺序,如果直接把这套方法应用到Transformer-XL模型,则无法区分不同段中相对位置相同的标识位置。比如,第τ段和第τ+1段的第j个位置的单词分别为x τjx τ+1,j将具有相同的位置编码,但它们对于第τ段的建模重要性显然并不相同(例如第τ+1段中的第j个位置重要性可能要低一些)。因此,需要对这种位置进行区分。那么,如何处理因段循环带来的位置问题呢?

在Transformer模型中,将词向量和位置向量相加得到每个词最终的输入,然后进行一系列复杂的操作,涉及位置操作主要是自注意力的运算,其他的运算和位置编码没关系。而自注意力中也只需要关注注意力分数的计算即可。

在Transformer模型中,在同一个段中计算注意力分数主要涉及的查询q i和关键向量k j的公式如下。

132-2

展开后可得:

132-3

其中E xiE xj分别是词x ix j的嵌入,U iU j是第ij个位置的位置编码。

式(5.28)是Transformer计算注意力分数的公式,而Transformer-XL为解决段循环引起不同段上单词位置的问题,在计算注意力分数时加入了相对位置编码,并对式(5.28)做了如下改动。

1)将公式(5.28)中b、d项中的绝对位置U j替换为相对位置编码132-4,替换的目的就是只关心单词之间相对的位置,R同样由三角函数公式计算得到,它是一个sinusoid矩阵,不需要参数学习。

2)在公式的(c)项里面,把133-1向量转为一个需要学习的参数向量u。因为在考虑相对位置的时候,不需要查询的绝对位置i,因此对于任意的i,都可以采用同样的向量。同理,把(d)项中133-2量转为一个需要学习的参数向量v,这里uv都属于133-3d为隐含状态的维度。

3)将k的权重向量矩阵W k转换为W kEW kR,分别用于计算单词内容和单词位置。把式(5.28)改为相对位置的格式,就得到Transformer-XL计算注意力分数的公式。

133-4

5.5.3 Transformer-XL计算过程

经过上述两个机制,Transformer-XL架构模型如图5-38所示。

133-5

图5-38 Transformer-XL架构图(Decoder)

由图5-38可知,Transformer-XL相当于Transformer中的Decoder中删除Encoder-Decoder-attention部分。一个N层只有一个注意力头的Transformer-XL模型的计算过程如下,对于n=1,2,…,N

134-1