Transformer
- CV
- 2021-05-16
- 73热度
- 0评论
Attention is all you need
Model Architecture

Encoder and decoder stacks
Encoder:在本篇论文中编码层设置了6层,每一层都有两个子网络,第一个multi-head self-attention mechanism第二个是简单的position-wise 全连接前向网络,并且在每一个子网络中都引入了残差结构之后再接上一个layer normalization,所以每个子网络的输出可以表示为\(LayerNorm(x+Sublayer(x))\),为了能够充分利用残差结构,整个模型的网络的通道数均为512。

Decoder:解码层仍然设置了6层,除了具有和编码层同样的子网络之外,解码层还具有第三个子网络,第三个子网络对编码器的输出进行multi-head attention,并且还对第三个子网络的multihead进行了相关的修改,确保了对位置\(i\)的预测只能依靠小于\(i\)位置的已知输出,也就是有mask机制
Attention
注意力机制可以被描述为将query,key-value映射到输出,其中query,key,value,output均为向量。具体的计算过程如下:
scaled dot production:

输入为通道为\(d_k\)的queries以及keys,以及通道为\(d_v\)的value首先算query和所有value的内积然后通过除以\(\sqrt{d_k}\)来调节尺度,然后通过softmax得到作用在value值上的权重。用公式表示即为: \(Attention(Q,K,V)=softmax(\frac{QK^ T}{\sqrt{d_k}})V\)
通常来说是有两种使用注意力机制的方法,一个是加性注意力,另一个是点乘注意力,但是使用点乘注意力的效率更高。而之所以会利用\(\sqrt{d_k}\)是通道数太大,那么很容易将点乘后进行softmax的值推向梯度较小的区域,所以需要进行尺度的调节。
接下来进一步探究self-attention(即Scaled Dot-Product Attention)的具体细节。
首先我们假设输入为\(x_1-x_4\)是一个句子,那么这个句子中的每一个单词(已经提前被转换成对应的向量)首先呈上词嵌入矩阵得到一个新的向量\(a_1-a_4\),接着每一个向量分别乘上不同的转移矩阵\(W_q,W_k,W_v\)得到\(q_i,k_i,v_i\)。

如上图所示,之后将\(q_1\)分别与\(k_1,k_2,k_3,k_4\)相乘后进行softmax得到\(\hat{\alpha}_{1,1},\hat{\alpha}_{1,2},\hat{\alpha}_{1,3},\hat{\alpha}_{1,4}\)之后分别与各自的value相乘求和得到结果\(b_1\),同样的你还可以得到\(b_2,b_3,b_4\)。
那么再用矩阵具体表示为(其中\(d\)为输入通道数,N为输入的单词量):输入\(I=[a_1,a_2,a_3,a_4]\in(d,N)\)之后乘上转移矩阵\(W_q\in(d,d)\)为\(Q=[q_1,q_2,q_3,q_4]\in(d,N)\),同理还可以得到\(K=[k_1,k_2,k_3,k_4]\in(d,N),V=[v_1,v_2,v_3,v_4]\in(d,N)\)
之后,\(K^T\cdot Q=A=[A_1,A_2,A_3,A_4]\in(N,N)\)(其中\(A\)为\(\alpha\)列向量)\(\rightarrow\hat{A}\rightarrow V\cdot\hat{A}=[v_1,v_2,v_3,v_4]\cdot\hat{A}=[b_1,b_2,b_3,b_4]\in(d_v,N)\)
Multihead-attention
作者发与其使用single-head的d_{model}维的keys,values,queues输出值,倒不如使用不同的可学习的线性映射矩阵将keys,values,queries映射h次平行的输入进self-attention中最后每个attention机制产生\(d_v\)维的输出值,之后将这些值进行拼接以及进一步的映射

表达式为:
$$
MultiHead(Q,K,V)=Concat(head_1,…,head_h ) W^O\\ where\quad head_i=Attention(QW_i^Q,KW_i^K,VW_i^Y)
$$
转移矩阵以及线性投影矩阵的维度分别:
$$
W_i^Q∈R^{d_{model}×d_k},W_i^K∈R^{d_{model}×d_k},W_i^V∈R^{d_{model}×d_v},W^O∈R^{hd_v×d_{model}}
$$
在本片文章中设置的\(h=8\)个平行的attention layers,并且\(d_k=d_v=\frac{d_{model}}{h}=64\),由于进行了降维的处理,所以总的计算量和单头的差不多。
Applications of Attention in our Model
- 在“encoder-decoder attention”(按照文章中的意思这是decoder中与encoder一样的部分)中,queries来自第一个解码层,同时keys和values来自encoder的输出,这允许解码器中的每个位置都参与输入序列的所有位置,模仿了序列到序列的哦行中的典型编码器-解码器的注意机制
- 编码器包含self-attention层,所有key,value以及queries都来自同一位置,即编码器的上一层输出编码器中的每一个位置都可以覆盖上一层中的所有位置
- 类似地,解码器中的self-attention层允许解码器中的每个位置关注从开头到该位置的所有信息,但是也必须避免右侧信息的干扰,所以我们通过在scaled dot product之后将后面的值都设置为负无穷这样经过softmax就能避免干扰
Position-wise Feed-Forward Networks
无论是编码层还是解码层都包含了一个全连接的前向网络,表达式为:
$$
FFN(x)=max(0,xW_1+b_1 ) W_2+b_2
$$
虽然线性变换在不同位置上都是一样的,但是它们使用的是不同的参数,描述它们的另一种方法是两个尺寸为1的卷积核,输入核输出的维数为512,内层的维数为2048。
Embeddings and Softmax
描述的过于细节,可能得看源代码才能清楚
Positional Encoding
在之前描述的transformer模型中并没有任何循环或者是卷积,为了能够让模型能够充分利用位置信息,就必须要注入一些位置编码信息,所以在编码核解码的底层加入了position encoding,由于维度是相同的所以是可以进行相加的。
$$
PE(pos,2i)=sin(pos/10000^{2i/d_{model}})\\ PE(pos,2i+1)=cos(pos/10000^{2i/d_{model}})
$$
pos为单词的位置i为通道,选择三角函数版本的位置信息是因为
- 每个位置有一个唯一的positional encoding。
- 使PE能够适应比训练集里面所有句子更长的句子,假设训练集里面最长的句子是有 20 个单词,突然来了一个长度为 21 的句子,则使用公式计算的方法可以计算出第 21 位的 Embedding。
- 可以让模型容易地计算出相对位置,对于固定长度的间距
的线性函数表示,因为三角函数特性:
$$
cos(α+β)=cos(α) cos(β)-sin(α) sin(β)\\ sin(α+β)=sin(α) cos(β)+cos(α)sin(β)
$$