5.3 可视化Transformer

Transformer是Google在2017年的论文Attention is all you need中提出的一种新架构,它基于自注意力机制的深层模型,在包括机器翻译在内的多项NLP任务上效果显著,性能优于RNN且训练速度更快。目前Transformer已经取代RNN成为神经网络机器翻译的SOTA(State-Of-The-Art)模型,在谷歌、微软、百度、阿里、腾讯等多家公司得到应用。Transformer模型不仅在自然语言处理方面刷新了多项纪录,在搜索排序、推荐系统,甚至图形处理领域也非常活跃。它为何能如此成功?用了哪些神奇的技术或方法?背后的逻辑是什么?接下来我们详细说明。

5.3.1 Transformer的顶层设计

我们先从Transformer功能说起,然后介绍其总体架构,再对各个组件进行分解,详细介绍Transformer的功能及如何高效实现这些功能。

如果我们把Transformer用于语言翻译,比如把一句法语翻译成一句英语,翻译过程可用图5-10表示。

100-1

图5-10 Transformer应用语言翻译

Transformer还可用于阅读理解、问答、词语分类等NLP问题。它就像一个黑盒子,在接收一条语句后,可以将其转换为另一条语句。那这个黑盒子是如何工作的呢?它由哪些组件构成?这些组件又是如何工作的呢?

我们进一步分析这个黑盒子,发现它其实就是一个由编码器和解码器构成的网络结构,这与我们通常看到的语言翻译模型类似,如图5-11所示。

100-2

图5-11 Transformer由Encoder组件和Decoder组件构成

以前我们通常使用循环网络或卷积网络作为编码器和解码器的网络结构,不过Transformer中的编码器组件和解码器组件,既不用卷积网络,也不用循环网络。Transformer的Encoder组件由6个相同结构的Encoder串联而成,Decoder组件也是由6个结构相同的Decoder串联而成,如图5-12所示。

101-1

图5-12 Transformer架构

如图5-12所示,最后一层Encoder的输出将传入Decoder的每一层。进一步打开Encoder及Decoder会发现,每个编码器由一层自注意力和一层前馈网络(Feed Forward)构成,而解码器除自注意力层、前馈网络层外,中间还有一个用来接收最后一个编码器的输出值,如图5-13所示。

101-2

图5-13 Transformer模块中Encoder与Decoder的关系图

至此,我们就对Transformer的大致结构进行了一个直观说明,但并没有详细说明各层的细节,所以接下来将从一些主要问题入手进行说明。

5.3.2 Encoder与Decoder的输入

前面我们介绍了Transformer的大致结构,在构成其Encoder和Decoder的网络结构中,并没有使用循环神经网络,也没有使用卷积神经网络。对于语言翻译类问题,语句中各单词的次序或位置是一个非常重要的因素,单词的位置与单词的语言有直接关系。如果使用循环网络,可以很自然地解决一个句子中各单词的次序或位置问题,但如果使用Transformer,要如何解决语句中各单词的次序或位置关系问题呢?

Transformer使用位置编码(Position Encoding)来记录各单词在语句中的位置或次序,位置编码的值遵循一定规则(如由三角函数生成),每个源单词(或目标单词)的词嵌入与对应的位置编码相加(位置编码向量与词嵌入的维度相同),如图5-14所示。

102-1

图5-14 在源数据中添加位置编码向量

对解码器的输入(即目标数据)也需要做同样处理,即目标数据加上位置编码成为带有时间信息的嵌入。当对语料库进行批量处理时,可能会遇到长度不一致的语句:对于短的语句,可以用填充(如用0填充)的方式补齐;对于太长的语句,可以采用截尾的方法对齐(如给这些位置的值赋一个很大的负数,使之在进行Softmax运算时为0)。

5.3.3 高并发长记忆的实现

首先我们来看一下通过Transformer作用的效果图。假设有输入语句“The animal didn't cross the street because it was too tired.”需要翻译,关于句中的“it是指animal还是street”这个问题,对人来说很简单,但对算法来说就不那么简单了。不过Transformer中的自注意力能够让机器把it和animal联系起来,联系的效果如图5-15所示。

在图5-15中,观察Encoder组件中顶层(即#5层,#0表示第1层)it单词对语句中各单词的关注度,会发现it对the animal的关注度明显大于其他单词的关注度。那么,这些关注度是如何获取的呢?下面将详细介绍。

前面5.1.2节介绍了一般注意力机制计算注意力分配值的方法,而Transformer采用自注意力机制,这两种机制的计算方法基本相同,只是Query的来源不同。一般注意力机制中query来源于目标语句(而非源语句),而自注意力机制的query来源于源语句本身(而非目标语句,如翻译后的语句),这或许就是自注意力名称的来由吧。

103-1

图5-15 it单词对语句中各单词的关注度示意图

Encoder模块中自注意力机制的主要计算步骤如下(与Decoder模块的自注意力机制类似)。

1)把输入单词转换为带时间(或时序)信息的嵌入向量。

2)根据嵌入向量生成qkv三个向量,这三个向量分别表示query、key、value。

3)根据q,计算每个单词点积后的得分:score=q·k

4)对score进行规范化、Softmax处理,假设结果为a

5)a与对应的v相乘,然后累加得到当前语句各单词之间的自注意力zz=∑av

这部分是Transformer的核心内容,为便于大家更好理解,对以上步骤可视化如下。

假设当前待翻译的语句为:Thinking Machines。单词Thinking预处理(即词嵌入+位置编码得到嵌入向量Embedding)后用x 1表示,单词Machines预处理后用x 2表示。计算单词Thinking与当前语句中各单词的注意力得分(Score),如图5-16所示。

103-2

图5-16 计算Thinking与当前语句各单词的得分

假设各嵌入向量的维度为d model(这个值一般较大,如为512),在图5-16中的qkv的维度比较小,一般使qkv的维度满足:104-1h表示h个head,后面将介绍head含义,这里h=8,d model=512,故d k=64,而104-2)。

考虑到实际计算过程中得到的score可能比较大,为保证计算梯度时不影响其稳定性,需要进行归一化操作,这里除以104-3,如图5-17所示。

104-4

图5-17 对score进行归一化处理

对归一化处理后的av相乘再累加,就得到z,如图5-18所示。

105-1

图5-18 权重与v相乘后累加

这样就得到单词Thinking对当前语句各单词的注意力或关注度z 1,使用同样方法,也可以计算单词Machines对当前语句各单词的注意力z 2

上述内容都是基于向量进行运算,且没有循环网络中的左右依赖关系,如果把向量堆砌成矩阵,则可以使用并发处理或GPU的功能。图5-19为自注意力转换为矩阵的计算过程。把嵌入向量堆叠成矩阵X,然后分别与矩阵WQWKWV(这些矩阵为可学习的矩阵,与神经网络中的权重矩阵类似)得到QKV

105-2

图5-19 堆砌嵌入向量,得到矩阵QKV

在这个基础上,上面计算注意力的过程就可简写为图5-20的格式。

106-1

图5-20 计算注意力Z的矩阵格式

整个计算过程也可以用图5-21表示,这个z又称为缩放点积注意力(Scaled Dot-Product Attention)。

106-2

图5-21 缩放点积注意力

在图5-21中,MatMul表示点积运算,Mask表示掩码,用于遮掩某些值,使其在参数更新时不产生效果。Transformer模型涉及两种掩码方式,分别是Padding Mask(填充掩码)和Sequence Mask(序列掩码)。Padding Mask会用在所有的缩放点积注意力中,用于处理长短不一的语句,而Sequence Mask只会用在Decoder的自注意力中,用于防止Decoder预测目标值时看到未来的值。

(1)Padding Mask

什么是Padding Mask呢?因为每个批次输入序列长度是不一样的,也就是说,我们要对输入序列进行对齐。具体来说,就是在较短的序列后面填充0。但是如果输入的序列太长,则是截取左边的内容,把多余的直接舍弃。因为这些填充的位置,其实是没什么意义的,所以注意力机制不应该把注意力放在这些位置上,所以需要进行一些处理。具体做法是,给这些位置的值加上一个非常大的负数(负无穷),这样的话,经过Softmax计算,这些位置的概率就会接近0!而Padding Mask实际上是一个张量,每个值都是一个Boolean,值为false的地方就是我们要处理的地方。

(2)Sequence Mask

前面也提到,Sequence Mask是为了使得Decoder不能看见未来的信息。也就是说,对于一个序列,在time_step为t的时刻,解码输出应该只能依赖于t时刻之前的输出,而不能依赖t之后的输出。因此我们需要想一个办法,把t之后的信息隐藏起来。那么具体怎么做呢?也很简单:生成一个上三角矩阵,使上三角的值全为0。然后让序列乘以这个矩阵,即把这个矩阵作用在每一个序列上,就可以达到目的。对于Decoder的自注意力,里面使用到的缩放点积注意力,同时需要Padding Mask和Sequence Mask作为attn_mask,具体实现时需要将两个Mask相加作为attn_mask。其他情况,attn_mask一律等于Padding Mask。

前面图5-15中有8种不同的颜色,这8种颜色表示什么含义呢?这些颜色有点像卷积网络中的通道(或卷积核),在卷积网络中,每一个通道往往表示一种风格。受此启发,AI科研人员在计算自注意力时也采用类似方法,即下面将介绍的多头注意力(Multi-Head Attention)机制,其架构图如5-22所示。

107-1

图5-22 多头注意力结构图

多头注意力机制可以从3个方面提升注意力层的性能。

1)它扩展了模型专注于不同位置的能力。

2)将缩放点积注意力过程做h次,再把输出合并起来。

3)它为注意力层(Attention Layer)提供了多个“表示子空间”。在多头注意力结构中,我们有多组查询/键/值权重矩阵(Transformer使用八个关注头,因此每个编码器/解码器最终得到八组)。这些集合中的每一个矩阵都是随机初始化的。在训练之后,利用集合将输入嵌入(Input Embedding)(或来自较低编码器/解码器的向量)投影到不同的表示子空间中。其实现原理与使用不同卷积核把源图像投影到不同风格的子空间一样。

多头注意力机制的运算过程如下:

  • 随机初始化八组矩阵,107-2i∈{0, 1, 2, 3, 4, 5, 6, 7};
  • 使用X与这八组矩阵相乘,得到八组Q iK iV iR512i∈{0,1,2,3,4,5,6,7};
  • 由此得到八个Z ii∈{0,1,2,3,4,5,6,7},然后把这八个Z i组合成一个大的Z 0-7
  • Z与初始化的矩阵W0R512×512相乘,得到最终输出值Z

具体运算过程可用图5-23来直观表示。

108-1

图5-23 多头注意力机制运算过程

由图5-13可知,解码器比编码器中多了编码器与解码器注意力层(Encoder-Decoder Attention Layer)。在编码器与解码器注意力层中,Q来自解码器的上一个输出,KV则来自编码器最后一层的输出,其计算过程与自注意力相同。

由于在机器翻译中,解码过程是一个顺序操作的过程,也就是当解码第k个特征向量时,我们只能看到第k-1及其之前的解码结果,这种情况下的多头注意力叫作遮掩多头注意力(Masked Multi-Head Attention),即同时使用了Padding Mask和Sequence Mask两种方法。

从以上分析可以看出,自注意力机制没有前后依赖关系,可以基于矩阵进行高并发处理,另外每个单词的输出与前一层各单词的距离都为1,如图5-24所示,说明不存在梯度随着长距离而消失的问题,因此,Transformer就有了高并发和长记忆的强大功能!

108-2

图5-24 自注意力机制输入与输出之间反向传播距离示意图

5.3.4 为加深Transformer网络层保驾护航的几种方法

从5.3.1节可知,Transformer的Encoder组件和Decoder组件分别有6层,在某些应用中会有更多层。随着层数的增加,网络的容量更大,表达能力也更强,但也会出现网络的收敛速度更慢、更易出现梯度消失等问题,那么Transformer是如何克服这些不足的呢?它采用了两种常用方法,一种是残差连接(Residual Connection),另一种是归一化(Normalization)。具体实现方法就是在每个编码器或解码器的两个子层(即Self-Attention和FFNN(Feed Forward Neural Network,前馈神经网络))间增加由残差连接和归一化组成的层,如图5-25所示。

109-1

图5-25 添加残差连接及归一化处理的层

对每个编码器和解码器做同样处理,如5-26所示。

110-1

图5-26 在每个编码器与解码器的两个子层间添加残差连接及归一化层

下面图5-27展示了编码器与解码器协调完成一个机器翻译任务的完整过程。

110-2

图5-27 Transformer实现一个机器翻译语句的完整过程

5.3.5 如何自监督学习

Encoder最后的输出通过一个全连接层及Softmax函数作用后就得到了预测值的对数概率(这里假设采用贪婪解码的方法,即用argmax函数获取概率最大值对应的索引),如图5-28所示。预测值的对数概率与实际值对应的独热编码的差就构成模型的损失函数。

111-1

图5-28 Transformer的最后全连接层及Softmax函数

综上所述,Transformer模型由Encoder和Decoder组件构成,每个Encoder组件又由6个Encoder层组成,每个Encoder层包含一个自注意力子层和一个全连接子层;而Decoder组件也是由6个Decoder层组成,每个Decoder层包含一个自注意力子层、注意力子层和全连接子层。如5-29所示。

111-2

图5-29 Transformer架构图