Attention & Transformer
由Jay Alammar的博客总结
链接:1. seq2seq and attention 2. transformer
Attention
以下的内容都以机器翻译任务举例。
Seq2seq for translation
传统的seq2seq架构在做机器翻译任务时,encoder部分获取输入句子的embedding,也就是最后一个时间步的hidden state向量,输入到decoder中,经过多个时间步后,得到输出的序列。
但其中存在的问题是:
- 长距离依赖难以获取
- 并行化程度低
Attention mechanism
Attention机制可以在一定程度上解决以上两个问题,针对第一个问题,在计算attention score时,没有距离概念,也就是每一个词和当前词的attention score计算与其距离无关,所以可以避免长距离依赖难以获取的问题。针对第二个问题,attention机制不像RNN那样,每一个时刻输入依赖于上一时刻的输出,而是可以并行计算attention score,得到context vector。
context vector的计算方式(以encoder-decoder架构中decoder部分的计算为例):
比如encoder部分输入三个词,每个词经过encoder,得到的hidden state为:
h
1
,
h
2
,
h
3
h_1, h_2, h_3
h1,h2,h3。
decoder部分:
- 首先输入一个初始化的hidden state向量和标志句子开始的token 的embedding,得到一个hidden state向量 h 4 h_4 h4。
- 利用 h 4 h_4 h4和encoder部分的3个hidden_state向量点乘,得到attention score
- 将attention score经过softmax转化为概率值
- 利用该概率值乘以对应的encoder部分的hidden state向量,得到一个context vector
以上过程的图示如下:
decoder部分各个时间步的操作图示如下:
Transformer
Model Architecture
在《Attention is All You Need》论文中,Transformer的设计是:编码器和解码器否分别有6个。
一个high-level的表示如下:
每一个encoder中又包含两个部分,一部分是self-attention,一部分是feed forward neural network。每一个decoder中包含三个部分,一部分是self-attention,一部分是encoder-decoder attention,还有一部分是feed forward neural network。图示如下:
Encoder部分
以机器翻译为例,encoder部分输入的是源语言的句子。每一个词转换成embedding之后,输入到self-attention layer,计算出一个基于上下文的表示,然后输入到前馈神经网络,得到这个encoder部分的输出后,作为下一个encoder部分的输入,继续以上步骤。一个简单的图示如下:
对于以下的句子:
”The animal didn’t cross the street because it was too tired”
我们希望在对"it"进行编码时,能使用到它指代的animal这个词的编码。可视化的结果也就是:
Self-attention
self-attention的意思是说,query, key, value全都来自一个相同的输入。也就是下图中的 x 1 x_1 x1和 x 2 x_2 x2。
self-attention的计算方法是:
-
对于每个输入词的embedding,乘以 W Q W^Q WQ矩阵,得到每一个词对应的query的向量,同样的,分别乘以 W K W^K WK和 W V W^V WV矩阵,得到每个词对应的key和value的向量。其中query和key的维度相同,这里表示为 d k d_k dk,但value的维度可以不同。
-
query和key向量点乘,得到attention score
-
attention score除以query和key维度的平方差
-
对上一步得到的值进行softmax,得到对应该query值的key的attention概率。
-
将得到的概率值与对应的value进行相乘
-
相乘得到的值,相加,得到最终的基于attention的向量表示 z z z
整个过程的图示如下:
在实际操作中,一般是使用矩阵进行运算,整个过程也就变得更加简单:
-
计算Query, Key, Value矩阵的图示
-
计算context vector的图示
Multi-head self-attention
multi-head self-attention可以理解为利用多个attention矩阵,得到基于多方面特征的上下文表示。这里的multi-head在实际操作中是指有多个
W
Q
,
W
K
,
W
V
W^Q, W^K, W^V
WQ,WK,WV,分别和输入embedding点乘,得到多个Query, Key, Value的矩阵,最终得到多个基于上下文的表示
z
z
z。
但前馈神经网络需要的是一个Z大小的输入,所以需要对多个Z进行处理。具体的方法是,将多个Z拼接起来,和一个矩阵相乘,最终得到一个Z。
整体过程的图示如下:
其他内容
因为attention 计算过程中忽视了词的位置信息,所以Transformer中在输入部分另外加入了一个position embedding。
此外,每个encoder中的两个部分都有残差连接,比如:第一个encoder的第一块Add & Norm,就是接收了两部分输入,一部分是self-attention之后的向量表示,另外一部分是输入词的embedding(包括词embedding和位置embedding)。图示如下:
具体一些的Transformer架构如下(这里展示的是两个encoder和两个decoder的架构):
Decoder部分
Decoder部分与Encoder部分的结构基本相同,self-attention部分有一些不同,具体在于decoder部分的self-attention是计算当前词的embeeding与它之前所有词的attention,而不是计算它和序列中所有词的attention。