Seq2Seq中的Attention和self-attention
一、Seq2Seq Model
首先介绍Seq2Seq模型,进而引入Attention机制。Seq2Seq模型的经典应用是语言模型,类似于语言翻译的例子(英译汉),Seq2Seq的目的就是将英文句子(输入Sequence),转换为汉语句子(输出Sequence),这里的Sequence是由字(单词)的序列。这种Seq2Seq通常Encoder-Decoder结构组成,其中encoder将输入Sequence转换为embedding向量,用来高度的表示输入信息。而decoder则将embedding向量作为输入,进而将embedding向量转化为输出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表示,其实就是注意力的概率分布。
具体的计算公式如下:
-
为了更好的理解Attention 机制,要注意以下几点:
- 每一个output都要计算相应的context vector,因此Context就是一个2D的matrix=输出单词数量*输入单词数量。
- Attention机制是可训练的,其中score的计算到alpha和context vector的计算都是可训练的。如上图所示,不同的计算方式导致不同的训练参数,也就导致不同的模型表现。
三、self-Attention
Self-attention也叫做intra-attention,attention指的是同一个Sequence的不同位置之间的关联。 如下面的例子:红色为当前单词,绿色的深浅表示与当前词的关联强弱。
Step 1
首先为每个input生成三个向量:a Query vector(q), a Key vector(k), and a Value vector(v)。
Step 2
第二步要做的是计算一个分数score,假设我们正在计算“Thinking”的self-attention,那么每个input都要与“Thinking”计算一个score,这个score表示在encoding的过程中,“Thinking”对于所有input的关注度,可以理解为普通Attention机制中的attention weight,其实就是“Thinking”对所有input的概率分布。
Step 3
第三步主要包括:score变化和softMax。首先score要除以k的维度的平方根,这样做可以让梯度gradient更加stable。之后利用softmax对上面结果进行归一化,形成weight,即概率分布。
Step 4
第四步:将上面的softmax结果作为weight,对所有的v进行加权和,得到z。