Transformer理解

Transformer理解


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

Attention

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

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

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

在这里插入图片描述

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

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

Transformer

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

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

在这里插入图片描述

Encoder and Decoder

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

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

Attention

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

在这里插入图片描述

Scaled Dot-Product Attention

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

A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention \left( Q, K, V \right) = softmax \left( \frac{QK^{T}}{\sqrt{d_{k}}}\right)V Attention(Q,K,V)=softmax(dk QKT)V

Multi-Head Attention

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

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

M u l t i H e a d ( Q , K , V ) = C o n c a t ( h e a d 1 , ⋯   , h e a d h ) W O w h e r e h e a d i = A t t e n t i o n ( Q W i Q , K W i K , V W i V ) 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) MultiHead(Q,K,V)=Concat(head1,,headh)WOwhereheadi=Attention(QWiQ,KWiK,VWiV)

其中 W i Q ∈ R d m o d e l × d k , W i K ∈ R d m o d e l × d k , W i Q ∈ R d m o d e l × d u , W i Q ∈ R h d u × d m o d e l , 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}}, WiQRdmodel×dk,WiKRdmodel×dk,WiQRdmodel×du,WiQRhdu×dmodel,。Transformer采用了 h = 8 h=8 h=8个平行的注意层或头部。对于每一个 d k = d u = d m o d e l / h = 64 d_{k}=d_{u}=d_{model/h}=64 dk=du=dmodel/h=64,我们使用。由于每个头部的维数减小,总计算成本与全维单头部注意力的计算成本相似。

查询 Q Q Q、键 K K K和值 V V V是通过输入词向量 X X X分别和 W Q W^{Q} WQ W K W^{K} WK W V W^{V} WV做乘积得到的,如下图所示。

在这里插入图片描述

下图展示了Transformer的多头注意机制的计算过程:首先将输入句子进行嵌入化处理得到输入词向量 X X X,然后再分别与 W i Q W_{i}^{Q} WiQ W i K W_{i}^{K} WiK W i V W_{i}^{V} WiV并行计算得到 Q i , K i , V i Q_{i}, K_{i}, V_{i} Qi,Ki,Vi,紧接着进行Attention计算,得到 Z i Z_{i} Zi,最后将 Z i Z_{i} Zi连接起来,与权重矩阵 W O W^{O} WO进行计算得到输出结果 Z Z Z

在这里插入图片描述

Position-wise Feed-Forward Networks

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

F F N ( x ) = m a x ( 0 , x W 1 + b 1 ) W 2 + b 2 FFN \left( x \right) = max \left( 0, xW_{1} + b_{1} \right) W_{2} + b_{2} FFN(x)=max(0,xW1+b1)W2+b2

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

Transformer理论解释

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

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

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

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

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

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

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

Non-local Neural Network论文中介绍了 f f f g g g的几个版本,实验证明非局部模型对 f f f g g g的选择不敏感。当 f f f为嵌入高斯分布时,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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马鹤宁

谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值