10.2 Transformer网络#
在前面几章内容中,我们陆续介绍了多个传统的经典模型,包括CNN、RNN和LSTM等来处理自然语言领域中的相关任务。但是从整体上来看,在2017年之前相关任务模型的发展仍旧主要集中在各个模块的拼接组合上,而这些基础模型并没有出现本质上的改变。正是在这个时间点,一项突破性的技术——Transformer架构——出现了。Transformer架构的出现是自然语言处理领域的一个重大转折点,它所提出的多头注意力机制为后续的研究和发展开辟了全新的方向。尽管Transformer最初是应用于在文本数据上的序列到序列学习,但现在已经推广到各种现代的深度学习中,例如语言、视觉、语音和强化学习等领域[1]。
10.2.1 Transformer动机#
根据第7章内容可知,由于传统的Encoder-Decoder架构在建模过程中,下一个时刻的计算过程会依赖于上一个时刻的输出,即整个过程需要按序进行,而这种固有的属性就限制了模型就不能以并行的方式进行计算[2]。尽管相关研究工作已经能够使得传统的循环神经网络在计算效率上有了很大的提升,但是本质的问题依旧没有得到解决。
基于这样的动机,阿希什(Vaswani)等人[2]于2017年提出了一种全新的Transformer架构来解决这一问题。Transformer架构的优点在于它完全摈弃了传统的循环结构,取而代之的是只通过注意力机制来计算模型输入与输出的隐含向量表示, 而这种注意力的名字就是大名鼎鼎的自注意力机制(Self-attention)。所谓自注意力机制是指通过某种运算来直接并行计算得到序列每个位置上的注意力权重,然后再以加权和的形式计算得到每个位置上隐含向量表示。最终,Transformer架构就是基于这种自注意力机制所构建形成。
10.2.2 自注意力机制#
自注意力机制在论文中也被称之为缩放点积注意力(Scaled Dot-Product Attention),它可以描述为将Query和一系列的Key-Value对映射到某个输出的过程,而这个输出的向量就是根据Query和Key计算得到的权重作用于Value上的加权和。此处Query、Key和Value含义同9.10节内容中介绍的一致。下面开始分别介绍自注意力机制和多头注意力机制的原理。
1. 自注意力机制
如图10-5所示便是自注意力机制的结构示意图,其核心过程就是通过Q(Query)和K(Value)计算得到注意力权重;然后再作用于V(Value)得到整个权重和输出,即序列中每个位置的向量表示。整个过程依旧如同9.10.3节内容中介绍的一致,查询Q先在键K中依次与其中的每一个键进行匹配计算便得到了一个权重向量,然后再将该向量作用于V便得到了最后的输出。不同点在于此处还引入了权重缩放和注意力掩码。
具体地,自注意力机制的计算过程为
$$ \text{Attention}(Q,K,V)=\text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V\in\mathbb{R}^{n\times d_v} \tag{10-7} $$其中$Q\in\mathbb{R}^{n\times d_{q}}$,$K\in\mathbb{R}^{n\times d_{k}}$,$V\in\mathbb{R}^{n\times d_{v}}$,三者的每一行均可以看做是一个字符的向量表示。
根据式(10-7)可知$d_q=d_k$,而除以$\sqrt{d_k}$的过程就是图10-5中所指的缩放(Scale)过程。之所以要进行缩放一方面是因为,如果两个向量的维度为$d$,且每个维度均是独立的随机变量并都满足均值为0方差为1,那么这两个向量点积的均值则为0方差则为$d$,而除以$\sqrt{d_k}$则可以保证方差仍旧为1;另一方面,$d$越大则$QK^T$的值可能越大,而这便会导致$\text{Softmax}$函数的梯度变得非常小不利于网络训练,因此可以通过缩放来消除这部分影响。
同时,对于图10-5中的Mask操作是用于在多个样本并行计算时忽略掉填充位置上的注意力权重,这与9.10.4节内容中介绍的一致。
2. 自注意力计算过程
在清楚自注意力机制的原理后我们再通过一个实际的计算图示来从直观上理解自注意机制到底是怎么回事。现在,假设输入序列为“我 是 谁”,且已经通过某种方式得到了1个形状为$3\times4$的矩阵来进行表示,即图中的$X$。在通过图10-6所示的过程便能够计算得到$Q$、$K$和$V$这3个矩阵。
从图10-6的计算过程可以看出,$Q$、$K$和$V$ 其实就是输入$X$分别进行3次线性变换而得到,不过这一计算过程仅仅只局限于Encoder和Decoder在各自输入部分利用自注意力机制进行编码时的过程, Encoder和Decoder交互部分的$Q$、$K$和$V$另有指代。此时,对于计算得到的$Q$、$K$和$V$可以理解为这是对于同一个输入不同的3种状态。在计算得到$Q$、$K$和$V$之后便可以根据式(10-7)计算得到注意力权重矩阵,如图10-7所示。
如图10-7所示,在经过上述计算过程后我们便得到了注意力权重矩阵。此时,对于权重矩阵的第1行来说,表示在编码“我”这个位置上的信息时应该将0.7的注意力放在“我”上,0.2的注意力放在“是”上,0.1的注意力放在“谁”上。同理,对于权重矩阵第 3 行来说,表示在编码“谁”这个位置上的信息时应该将 0.2 的注意力放在“我”上,将 0.1 的注意力放在“是”上,将 0.7的注意力放在“谁”上。从这一过程可以看出,通过这个权重矩阵模型在编码对应位置上的信息时,就能够知道应该以何种方式将注意力分配到不同的位置上。
在通过图10-7所示的过程计算得到权重矩阵后,便可以将其作用于$V$ ,进而得到自注意力机制的最终编码输出结果,计算过程如图10-8所示。
从图10-8可以看出,对于最终输出“是”的编码向量来说,它其实就是原始 “我 是 谁”3 个向量的加权和,而这也就体现了在对“是”进行编码时注意力 权重分配的全过程。可以看出通过这种自注意力机制的方式的确解决了作者所提出 的“传统序列模型在编码过程中都需顺序进行的弊端”的问题。
10.2.3 多头注意力机制#
从上述计算过程可以发现,自注意力机制在对当前位置的信息进行编码时会将注意力过度集中于自身所在的位置,因为在计算注意力权重时自己与自己所在位置的相似性是最高的,而这可能导致模型忽略了其它位置上的信息。
1. 多头注意力机制
为了解决这一问题,作者提出了一种基于多头的自注意力机制(Multi-Head Attention)。多头注意力通过将 Q、K 和 V 矩阵分别拆分成多个子空间(head)来增强模型的表示能力,每个头都会独立地进行注意力计算,最后将各个头的结果拼接在一起再进行线性变换。最终,实验也表明使用多头注意力机制能够给予注意力层的输出包含有不同子空间中的编码表示信息,从而增强模型的表达能力。
如图10-9所示便是多头注意力机制的结构示意图,其本质上就是多个(单头)自注意力机制计算得到的多个输出结果线性组合后的形式。
具体地,多头注意力机制的计算公式为
$$ \begin{aligned} \text{MultiHead}(Q,K,V)=\text{Concat}(\text{head}_1,...,\text{head}_h)W^O\\\text{where}\;\;\text{head}_i=\text{Attention}(QW_i^Q,KW_i^K,VW_i^V) \end{aligned} \tag{10-8} $$其中$W_i^Q\in\mathbb{R}^{d\times d_q}$,$W_i^K\in\mathbb{R}^{d\times d_k}$,$W_i^V\in\mathbb{R}^{d\times d_v}$,$W^O\in\mathbb{R}^{hd_v\times d}$。
值得注意的是,式(10-8)中的$Q$、$K$和$V$与图10-5中的$Q$、$K$和$V$并不是一回事。由于是多头注意力所以这里的$Q$、$K$和$V$需要分别经过$h$次线性变换才能得到真正的$Q$、$K$和$V$,即分别作用$W^Q_i$、$W^K_i$和$W^V_i$后的结果。这里为了和原论文中的图示保持一致所以没有进行修改。
同时,在论文中作者使用了$h=8$个并行的自注意力模块来构建一个注意力层,并且对于每个自注意力模块都限定了$d_k=d_v=d/h=64$。从这里可以发现,多头注意力机制其实就是将一个大的高维单头拆分成了$h$个多头。因此,整个多头注意力机制的计算过程我们可以通过如图10-10 所示的过程来进行表示。
如图10-10所示,根据输入$X$和$W^Q_1$、$W^K_1$和$W^V_1$,我们便可以计算得到$Q_1$、$K_1$和$V_1$。进一步根据式(10-7)便可以计算得到单个注意力模块的输出$Z_1$;同理,根据$X$和$W^Q_2$、$W^K_2$和$W^V_2$便可以计算得到另外一个注意力模块输出$Z_2$。最后根据式(10-8)将$Z_1$和$Z_2$水平堆叠得到$Z$,然后$Z$再乘以$W^O$便得到了整个多头注意力层的输出。
2. 单头与多头区别
在多头注意力中一个比较经典的问题就是,在相同维度下使用单头和多头的区别在什么地方。根据图10-10可以发现,当进行注意力权重矩阵计算时,$h$越大那么原始$Q$、$K$和$V$ 就会被切分得越小,进而得到更多的注意力权重分配方式。因为对于每一组$Q_i$、$K_i$和$V_i$来说都可以计算得到一个注意力权重分别矩阵,而每个权重矩阵都对应着不同的注意力分配方式。
如图10-11所示是一张在真实场景下多头注意力中不同权重矩阵的可视化结果。可以发现,在不同的权重矩阵中注意力值的分配并不相同,并且可以明显地看出在第3张注意力权重可视化结果中,模型将过多的注意力集中到了每个字符自身所在的位置而忽略了其它位置上的信息。因此,在一定上相同维度中多头$h$的值越大,整个模型的表达能力就越强,越能使得模型对于注意力权重进行合理分配。
10.2.4 输入编码#
在介绍完多头注意力机制的相关原理之后我们再来看Transformer中是如何对输入进行嵌入表示的。根据9.2节内容可知,在文本序列进行建模时首先要做的便是如何对其进行向量换表示。但是在自注意力机制中,由于它并不能感知到序列中字符的顺序变换,因此还需要通过位置编码来解决这一问题。
1. Token Embedding
在深度学习中,对文本进行向量化最常见的做法便是将各个字符通过一个嵌入层映射到低维稠密的向量空间。因此,在Transformer模型中,首先第一步要做的同样是将文本以这样的方式进行向量化表示,并且将其称之为字符嵌入(Token Embedding),如图10-12所示。
根据自注意力机制的原理可知, 自注意力机制在计算过程中只是各个矩阵之间的线性变换,这就导致即使是打乱各个字符之间的顺序那么最终计算得到的结果本质上却没有发生任何变换,即自注意力机制会丢失文本原有的序列信息。
如图10-13所示,在经过词嵌入表示后序列“我 在 看 书”经过一次线性变换后的结果。现在,我们将序列变成“书 在 看 我”,然后同样以中间这个权重矩阵来进行线性变换,过程如图10-14所示。
根据图10-14中的计算结果来看,序列在交换位置前和交换位置后计算得到的结果在本质上并没有任何区别,仅仅只是交换了对应的位置。但在实际情况中,序列位置发生改变之后句子的整体含义也就产生了变化,所以注意力权重应该也会产生变化。基于这样的原因,Transformer在原始输入文本进行字符嵌入后,又额外引入了一个位置编码(Positional Embedding)来刻画数据在时序上的特征。
2. Positional Embedding
如图10-15所示,横坐标表示输入序列中的每个Token,每一条曲线或者直线表示对应Token在该维度上对应的位置信息。在左图中,每个维度所对应的位置信息都是一个不变的常数;而在右图中,每个维度所对应的位置信息都是基于某个公式变换所得到。换句话说,左图中任意两个Token 上的向量都可以进行位置交换而模型却不能捕捉到这一差异,但是加入右图这样的位置信息模型便能够感知到。
例如10-15中位置20这一处的向量,在左图中无论你将它同哪个位置进行交换,结果都和交换前一样;但在右图中,我们却再也找不到与位置20处位置信息相同的位置。下面,我们通过两个实际的示例来进行说明。
如图10-16(上)所示,原始输入在经过Token Embedding后,又加入了一个常数位置信息的位置编码。在经过一次线性变换后便得到了相应的计算结果。接下来,当我们再次交换序列位置并同时进行位置编码后便得到了图10-16(下)所示的结果。可以发现,其计算结果同图10-16(上)中的计算结果本质上也没有区别。因此,这就再次证明如果位置编码中的位置信息是以常数形式进行变换,那么这样的位置编码便是无效的。
在Transformer中,位置编码采用了式(10-9)所示的规则来生成各个维度的位 置信息,其可视化结果如图10-15(右)所示。
$$ \begin{aligned} \text{PE}_{\text{pos},2i}&=\sin(\text{pos}/10000^{2i/d_{\text{model}}})\\[2ex] \text{PE}_{\text{pos},2i+1}&=\cos(\text{pos}/10000^{2i/d_{\text{model}}}) \end{aligned}\tag{10-9} $$其中$\text{PE}$就是这个位置编码矩阵, $\text{pos}\in [0,\text{max\_len})$ 表示具体的某一个位置,$i\in[0,d_{\text{model}}/2]$表示具体的某一维度。
最终,在加入这种非常数的位置编码信息后,便可以得到如图10-17所示的对比结果。
从图10-17可以看出,在交换序列位置前后与同一个权重矩阵进行线性变换后得到的结果便截然不同。因此,这样表明通过位置编码可以弥补自注意力机制不能捕捉序列时序信息的缺陷。
10.2.5 小结#
在本节内容中,我们首先介绍了Transformer模型所提出的动机,即为了解决传统RNN不能并行计算的缺陷;然后详细介绍了自注意力机制和多头注意力机制的原理及计算过程;最后通过对比介绍了为什么自注意力机制中需要引入位置编码以及位置编码的原理。在下一节内容中,我们将继续介绍Transformer的整体网络结构及掩码等内容。
引用#
[1] 阿斯顿·张、李沐、扎卡里 C. 立顿等,动手学深度学习[M],2版. 北京:人民邮电出版社, 2019.
[2] Vaswani A, Shazeer N, Parmar N, et al. Attention is all you need[J]. Advances in neural information processing systems, 30, 2017.
[3] https://github.com/BAI-Yeqi/Statistical-Properties-of-Dot-Product/blob/master/proof.pdf