Transformer理解

1,295 阅读6分钟

Transformer 是一种著名的深度学习模型,现已经被广泛应用于自然语言处理、计算机视觉和语音处理等等各个领域。Transformer最初是作为机器翻译的序列到序列模型提出的。后来的工作表明,基于Transformer的预训练模型可以在各种任务上实现最优性能。因此,Transformer已经成为NLP中的主流架构。最近,使用Transformer来完成视觉任务成为一个新的研究方向,ViT(Vision Transformer)使用Transformer进行图像分类,DERT使用Transformer进行物体检测和分割。

Attention

self-Attention在Transformer中扮演者重要的角色。在介绍Transformer之前,我们先简单介绍一下Attention。

在Encoder-Decoder框架中,encoder用来将输入序列x=(x1,,xTx)x=\left( x_{1}, \cdots, x_{T_{x}}\right)转换成一个上下文向量(context vector)cc,encoder通常会采用RNN实现这一过程,设定时刻tt的隐含状态(hidden state)为hth_{t},其中ht=f(xt,ht1)Rnh_{t} = f \left( x_{t}, h_{t-1}\right) \in \mathbb{R}^{n},向量cc是从隐含状态序列中生成的c=q({h1,,hTx})c = q \left( \left\{ h_{1}, \cdots, h_{T_{x}}\right\}\right)。其中ffqq都是非线性函数。

在Decoder中,Decoder通常通过cc和所有先前预测单词{y1,,yt1}\left\{ y_{1}, \cdots, y_{{t}'-1}\right\}预测下一个单词yty_{{t}'},用公式表示就是p(yt{y1,,yt1},c)=g(yt1,st,c)p\left(y_{t} |\left\{ y_{1}, \cdots, y_{t-1}\right\},c\right) = g\left(y_{t-1}, s_{t}, c \right),其中gg是非线性函数,sts_{t}表示decoder RNN的隐含状态,由st=f(st1,yt1,ct)s_{t} = f\left( s_{t-1}, y_{t-1}, c_{t}\right)计算得出。

1634452194676.png

上下文向量cic_{i}由RNN的隐含状态hih_{i}的权重加权和得出,公式为ci=j=1Txαijhjc_{i} = \sum_{j=1}^{T_{x}} \alpha_{ij} h_{j},每个hjh_{j}的权重αij\alpha_{ij}由softmax函数求出,αij=exp(eij)k=1Txexp(eij)\alpha_{ij} = \frac{exp\left( e_{ij}\right)}{\sum_{k=1}^{T_{x}}exp\left( e_{ij}\right)}。其中eije_{ij}是对齐模型(Alignment model),建模位置jj的输入和在时刻ii的输出的匹配分数。匹配分数基于decoder的隐含状态si1s_{i-1}和encoder的隐含状态hjh_{j}计算,eij=a(si1,hj)e_{ij} = a \left( s_{i-1}, h_{j}\right)

上述介绍的Attention是输入对输出的权重,输入序列x=(x1,,xTx)x=\left( x_{1}, \cdots, x_{T_{x}}\right)对输出单词单词yty_{{t}'}的权重。显然,self-Attention是Attention机制中的一种。self-Attention则是自己对自己的权重,输入序列x=(x1,,xTx)x=\left( x_{1}, \cdots, x_{T_{x}}\right)x1x_{1}xTxx_{T_{x}}的权重,将单个序列的不同位置联系起来,以计算序列的表示。

Transformer

Attention Is ALL You Need论文第一次提出了Transformer,完全基于注意力机制,在两个机器翻译任务上的实验表明,Transformer具有更高的质量,同时具有更高的并行性,所需的训练时间显著减少。

Transformer遵循encoder-decoder架构,使用encode和decoder的堆叠自我关注和逐点全连接层,结构见下图:

1634454346920.png

Encoder and Decoder

Encoder:Encoder由N=6N=6个相同层的堆栈组成。每层有两个子层。第一种是多头自我注意机制(multi-head self-attention mechanism),第二种是简单的位置全连接前馈网络(a single, position-wise fully connected feed-forward network)。我们在两个子层的每个层周围使用残差连接(residual connection),然后使用层规范化(layer normalization)。也就是说,每个子层的输出是LayerNorm(x+Sublayer(x))LayerNorm \left( x+Sublayer \left( x \right) \right),其中Sublayer(x)Sublayer \left( x \right)是由子层本身实现的功能。为了方便这些残差连接,模型中的所有子层以及嵌入层都会生成维数为512的输出, dmodel=512d_{model} = 512

Decoder:Decoder也由N=6N=6个相同层的堆栈组成。除了每个编码器层中的两个子层之外,解码器还插入第三个子层,该子层对编码器堆栈的输出执行多头注意。与编码器类似,我们在每个子层周围使用残差连接,然后进行层规范化。我们还修改了解码器堆栈中的自我注意子层,以防止位置转移到后续位置。这种掩蔽,再加上输出嵌入偏移一个位置的事实,确保位置ii的预测只能依赖于位置小于ii的已知输出。

Attention

注意函数可以描述为将查询(query)和一组键值对(key-value)映射到输出,其中查询、键、值和输出都是向量。输出可作为这些值的加权和,其中分配给每个值的权重由查询与相应键的兼容函数(compatibility function)计算。

1634454388115.png

Scaled Dot-Product Attention

Transformer中的注意力为“缩放点乘注意力”。输入包括维度的查询和维度为dkd_{k}的键,以及维度为dud_{u}的值。我们计算带有所有键查询的点积,将每个键除以dk\sqrt{d_{k}},然后应用softmax函数获这些值的权重。 在实践中,我们同时计算一组查询的注意函数,将它们打包成一个矩阵Q。键和值也打包到矩阵K和V中。我们将输出矩阵计算为:

Attention(Q,K,V)=softmax(QKTdk)VAttention \left( Q, K, V \right) = softmax \left( \frac{QK^{T}}{\sqrt{d_{k}}}\right)V

Multi-Head Attention

将查询QQ、键KK和值VV以不同的、学习到的线性投影hh次分别线性投影到dkd_{k},dkd_{k}dud_{u}维,在查询、键和值的每个投影版本上,并行执行注意函数,产生dud_{u}维输出值。这些值被连接并再次投影,从而得到最终值。

多头注意允许模型共同关注来自不同位置的不同表征子空间的信息。

MultiHead(Q,K,V)=Concat(head1,,headh)WOwhereheadi=Attention(QWiQ,KWiK,VWiV)MultiHead \left( Q, K, V \right) = Concat\left( head_{1}, \cdots, head_{h} \right) W^{O} \\ where \quad head_{i} = Attention \left( QW_{i}^{Q}, KW_{i}^{K}, VW_{i}^{V} \right)

其中WiQRdmodel×dk,WiKRdmodel×dk,WiQRdmodel×du,WiQRhdu×dmodel,W_{i}^{Q} \in \mathbb{R}^{d_{model} \times d_{k}}, W_{i}^{K} \in \mathbb{R}^{d_{model} \times d_{k}},W_{i}^{Q} \in \mathbb{R}^{d_{model} \times d_{u}},W_{i}^{Q} \in \mathbb{R}^{h d_{u} \times d_{model}},。Transformer采用了h=8h=8个平行的注意层或头部。对于每一个dk=du=dmodel/h=64d_{k}=d_{u}=d_{model/h}=64,我们使用。由于每个头部的维数减小,总计算成本与全维单头部注意力的计算成本相似。

查询QQ、键KK和值VV是通过输入词向量XX分别和WQW^{Q}WKW^{K}WVW^{V}做乘积得到的,如下图所示。

1634455506572.png

下图展示了Transformer的多头注意机制的计算过程:首先将输入句子进行嵌入化处理得到输入词向量XX,然后再分别与WiQW_{i}^{Q}WiKW_{i}^{K}WiVW_{i}^{V}并行计算得到Qi,Ki,ViQ_{i}, K_{i}, V_{i},紧接着进行Attention计算,得到ZiZ_{i},最后将ZiZ_{i}连接起来,与权重矩阵WOW^{O}进行计算得到输出结果ZZ

1634456653139.png

Position-wise Feed-Forward Networks

除了注意子层之外,编码器和解码器中的每一层都包含一个完全连接的前馈网络,该网络分别相同地应用于每个位置。前馈网络包括两个线性变换,中间有一个ReLU激活。

FFN(x)=max(0,xW1+b1)W2+b2FFN \left( x \right) = max \left( 0, xW_{1} + b_{1} \right) W_{2} + b_{2}

虽然线性变换在不同位置上是相同的,但它们在层与层之间使用不同的参数。另一种描述方法是将其描述为两个核大小为1的卷积。输入和输出的维数为dmodel=512d_{model}=512,内层的维数为dff=2048d_{ff}=2048

Transformer理论解释

在Non-local Neural Network中,定义深度神经网络中的一般非局部运算定义为:

yi=1C(x)jf(xi,xj)g(xj)y_{i} = \frac{1}{C\left( x \right)} \sum_{\forall j} f\left( x_{i}, x_{j}\right) g\left( x_{j}\right)

ii是要计算其响应的输出位置(在空间、时间或时空中)的索引,jj是枚举所有可能位置的索引。xx是输入信号(图像、序列、视频;通常它们的特征)和yy是输出信号,与xx的大小相同。成对函数ff计算ii和所有jj之间的标量(表示关联性等关系)。一元函数gg计算位置jj处输入信号的表示。响应通过系数C(x)C\left(x\right)标准化。

为了简单起见,我们只考虑gg的线性嵌入的形式g(xj)=Wgxjg\left(x_{j}\right)=W_{g}x_{j}。高斯函数的一个简单扩展是计算嵌入空间中的相似性,我们定义ff函数为嵌入高斯函数:

f(xi,xj)=eθ(xi)Tϕ(xj)f \left( x_{i}, x_{j} \right) = e^{\theta\left( x_{i} \right)^{T} \phi\left( x_{j} \right)}

其中θ(xi)=Wθxi\theta\left( x_{i} \right)=W_{\theta}x_{i}ϕ(xj)=Wϕxj\phi\left( x_{j} \right)=W_{\phi}x_{j}是两个嵌入。设置C(x)=jf(xi,xj)C\left( x \right) = \sum_{\forall j} f \left( x_{i}, x_{j} \right)

与Transformer中的查询QQ、键KK和值VV相比对,其中θ\thetaϕ\phi对应于KKQQ,其中gg对应于KK。其中1C(x)jf(xi,xj)\frac{1}{C\left( x \right)} \sum_{\forall j} f\left( x_{i}, x_{j}\right)是softmax计算,yiy_{i}这个公式可以看做是Transformer缩放点乘注意力的理论表示,只不过Transformer在softmax之前将每个键除以dk\sqrt{d_{k}}

Non-local Neural Network论文中介绍了ffgg的几个版本,实验证明非局部模型对ffgg的选择不敏感。当ff为嵌入高斯分布时,Transformer中的自我注意模块是非局部操作在嵌入式高斯版本下的一个特殊情况。有趣的是:Transformer火爆,Non-Local却趋于平常。

参考

  1. The Illustrated Transformer
  2. Visualizing A Neural Machine Translation Model (Mechanics of Seq2seq Models With Attention)
  3. Neural Machine Translation by Jointly Learning to Align and Translate
  4. Attention is ALL You Need
  5. Non-local Neural Networks
  6. A Survey of transformers