AI|Seq2Seq中的Attention和self-attention

Seq2Seq中的Attention和self-attention 一、Seq2Seq Model 首先介绍Seq2Seq模型,进而引入Attention机制。Seq2Seq模型的经典应用是语言模型,类似于语言翻译的例子(英译汉),Seq2Seq的目的就是将英文句子(输入Sequence),转换为汉语句子(输出Sequence),这里的Sequence是由字(单词)的序列。
这种Seq2Seq通常Encoder-Decoder结构组成,其中encoder将输入Sequence转换为embedding向量,用来高度的表示输入信息。而decoder则将embedding向量作为输入,进而将embedding向量转化为输出Sequence。如下图: AI|Seq2Seq中的Attention和self-attention
文章图片
其中的Context Vector就是Embedding Vector,这一层也可以叫做Embedding layer。Encoder和Decoder一般由GRU(如LSTM)构成,Sequence模型适用于任意N-to-M的Sequence。其中Encoder中每个时刻t(即每个单词)都会对应一个hiden state向量,最后时刻T的hidden state作为Context Vector传递给Decoder。那么但是其中隐含一个缺点:仅仅利用最后一个Context Vector能够代表输入Sequence的所有信息么? 二、Attention Model 之前的Seq2Seq模型中,所有input经过Encoder之后只形成了一个固定的Context Vector,而Attention机制则为Decoder中的每个output都形成了Context Vector。Attention机制:Decoder中的每个字(她、在等)都要与Encoder中的所有单词的hidden state 关联,以Decoder中的“她”为例,要计算其与Encoder中的所有hidden state 的relation,即relation(她,she),relation(她,is)等等。同理,Decoder中的其它字也要做同样的计算。这里的relation在Attention中叫Attention Weights,用alpha表示,其实就是注意力的概率分布。
AI|Seq2Seq中的Attention和self-attention
文章图片
根据alpha将Encoder的所有hidden state加权求和则形成了Context Vector即Attention layer。这样每个output都可以通过Attention与所有的hidden state关联,从而“将Attention根据概率分布分散给所有hidden state,而不是只关注一个向量”。最后当前时刻的Context Vector与之前的state共同组成了下一个时刻的state。
具体的计算公式如下: AI|Seq2Seq中的Attention和self-attention
文章图片
其中score的计算有很多种,具体如下: AI|Seq2Seq中的Attention和self-attention
文章图片

    为了更好的理解Attention 机制,要注意以下几点:
  1. 每一个output都要计算相应的context vector,因此Context就是一个2D的matrix=输出单词数量*输入单词数量。
  2. Attention机制是可训练的,其中score的计算到alpha和context vector的计算都是可训练的。如上图所示,不同的计算方式导致不同的训练参数,也就导致不同的模型表现。
三、self-Attention Self-attention也叫做intra-attention,attention指的是同一个Sequence的不同位置之间的关联。 如下面的例子:红色为当前单词,绿色的深浅表示与当前词的关联强弱。

下面逐步讲解self-Attention的过程,举例 输入为: Thinking Machines Step 1
首先为每个input生成三个向量:a Query vector(q), a Key vector(k), and a Value vector(v)。
AI|Seq2Seq中的Attention和self-attention
文章图片
其中三个W矩阵是训练参数,三个向量都是由对应的W矩阵和输入点乘得到,如q1=WQ*X1。注意:这三个q,k,v向量的维度小于Embedding Vector的维度
Step 2
第二步要做的是计算一个分数score,假设我们正在计算“Thinking”的self-attention,那么每个input都要与“Thinking”计算一个score,这个score表示在encoding的过程中,“Thinking”对于所有input的关注度,可以理解为普通Attention机制中的attention weight,其实就是“Thinking”对所有input的概率分布。
AI|Seq2Seq中的Attention和self-attention
文章图片
如上图所示,score的计算方式是q*k,值得注意的是:q是属于当前input的,以“Thinking”为例那就是q1,而k则是根据target变化,因此score(Thinking,Thinking)=q1*k1,而score(Thinking,Machines)=q1*k2。
Step 3
第三步主要包括:score变化和softMax。首先score要除以k的维度的平方根,这样做可以让梯度gradient更加stable。之后利用softmax对上面结果进行归一化,形成weight,即概率分布。
AI|Seq2Seq中的Attention和self-attention
文章图片

Step 4
第四步:将上面的softmax结果作为weight,对所有的v进行加权和,得到z。
AI|Seq2Seq中的Attention和self-attention
文章图片

上面4个步骤形象化的介绍了self-attention模型,但是实际应用是利用矩阵进行运算的,矩阵的运算形式如下:首先是Q,K,V的计算 AI|Seq2Seq中的Attention和self-attention
文章图片
之后是score,softmax和最终结果z可以利用一个公式表达: AI|Seq2Seq中的Attention和self-attention
文章图片





四、Mask机制与Attention的tensorflow实现 关于Attention的Mask机制,以及Attention的tensorflow实现,请参考:
  • Attention中的Mask
  • 或者github原文
【AI|Seq2Seq中的Attention和self-attention】参考
遍地开花的Attention
Attention中的Mask
Attention中的Mask(github原文)

    推荐阅读