Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N., ... & Polosukhin, I. (2017). Attention is all you need. In Advances in neural information processing systems (pp. 5998-6008).
transformer的模型结构
transformer模型和大多数sequence to sequence模型一样,由encoder和decoder组成。结构示意图如下:
1. encoder
transformer 的encoder由N=6个相同的layer构成,每个layer都有两个sub-layers,分别是multi-head self-attention mechanism和fully connected feed-forward network。其中每个sub-layer都加了residual connection和normalisation,因此可以将sub-layer的输出表示为:LayerNorm(x + Sublayer(x));
2. decoder
decoder和encoder的结构差不多,但是在每个layer下多了一个attention的sub-layer
3. Attention模型
采用传统编码器-解码器结构的LSTM/RNN模型存在一个问题:不论输入长短都将其编码成一个固定长度的向量表示,这使模型对于长输入序列的学习效果很差(解码效果很差)。而attention机制则克服了上述问题,原理是在模型输出时会选择性地专注考虑输入中的对应相关的信息。使用attention机制的方法被广泛应用在各种序列预测任务上,包括文本翻译、语音识别等。transformer只使用了Attention。
3.1 Scaled Dot-Product Attention
Scaled Dot-Product Attention的输入由query、key、value组成,将query和所有key进行点积运算,再除以(起调节作用,使得内积不至于太大,太大的话 softmax 后就非 0 即 1 了,不够“soft”了),再利用softmax 函数得到value的权重,计算得到的输出矩阵如下:
以下是Scaled Dot-Product Attention模型图:
3.2 Multi-head attention
Multi-head attention结构如下图,Query,Key,Value首先经过一个线性变换,然后输入到Scaled Dot-Product attention(注意这里要做h次,其实也就是所谓的Multi-head,每一次算一个head)。而且每次Q,K,V进行线性变换的参数W是不一样的。然后将h次的Scaled Dot-Product attention结果进行拼接,再进行一次线性变换得到的值作为Multi-head attention的结果。
attention函数输入为由原来的Q,K,V变成了QW(上标为Q,下标为i),KW(上标为K,下标为i),VW(上标为V,下标为i);即3个W都不相同;将Q,K,V由原来的512维度变成了64维度(因为采取了8个多头);然后再拼接在一起变成512维,通过W(上标为O)进行线性转换;得到最终的多头注意力值;
3.3 Self Attention
所谓 Self Attention,其实query=key=value。也就是说,在序列内部做 Attention,寻找序列内部的联系。
4. Position-wise Feed-Forward Networks
除了attention sub-layers ,transformer的encoder和decoder都包含一个完全连接的前馈网络。这个网络包括两个线性转换,中间有一个ReLu activation。
FFN(x) = max(0, xW1+ b1)W2+ b2
虽然不同位置的线性变换是相同的,但它们从一层到另一层使用不同的参数。
5. Embeddings and Softmax
与其他序列转换模型类似,他们使用embeddings将输入标记和输出标记转换为维度的向量。他们也使用通常学习的线性变换和softmax函数将解码器的输出转换为预测的 next-token probabilities。在他们的模型中,他们在两个embedding层和pre-softmax线性变换之间共享相同的权值矩阵,在嵌入层中,用这些权重乘以√dmodel。
6. Positional Encoding
如果将 K,V 按行打乱顺序(相当于句子中的词序打乱),Attention 的结果还是一样的。这就表明了,到目前为止,Attention 模型顶多是一个非常精妙的“词袋模型”而已。为了让模型利用序列的顺序,必须注入一些关于序列中记号的相对或绝对位置的信息。因此,他们在input embeddings中加入了positional encoding,将每个位置编号,然后每个编号对应一个向量,通过结合位置向量和词向量,就给每个词都引入了一定的位置信息,这样 Attention 就可以分辨出不同位置的词了。
7. 为什么使用self-attention
从三个方面去对比self-attention和递归结构、卷积结构的优劣性,首先是每一层的计算复杂度,其次是能够被并行的计算量,最后是网络中长期依赖的路径长度。对比显示,self-attention表现最好。