Seq2Seq中的Attention和self-attention
一、Seq2Seq Model 首先介绍Seq2Seq模型,进而引入Attention机制。Seq2Seq模型的经典应用是语言模型,类似于语言翻译的例子(英译汉),Seq2Seq的目的就是将英文句子(输入Sequence),转换为汉语句子(输出Sequence),这里的Sequence是由字(单词)的序列。
这种Seq2Seq通常Encoder-Decoder结构组成,其中encoder将输入Sequence转换为embedding向量,用来高度的表示输入信息。而decoder则将embedding向量作为输入,进而将embedding向量转化为输出Sequence。如下图:
文章图片
其中的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表示,其实就是注意力的概率分布。
文章图片
根据alpha将Encoder的所有hidden state加权求和则形成了Context Vector即Attention layer。这样每个output都可以通过Attention与所有的hidden state关联,从而“将Attention根据概率分布分散给所有hidden state,而不是只关注一个向量”。最后当前时刻的Context Vector与之前的state共同组成了下一个时刻的state。
具体的计算公式如下:
文章图片
其中score的计算有很多种,具体如下:
文章图片
-
为了更好的理解Attention 机制,要注意以下几点:
- 每一个output都要计算相应的context vector,因此Context就是一个2D的matrix=输出单词数量*输入单词数量。
- Attention机制是可训练的,其中score的计算到alpha和context vector的计算都是可训练的。如上图所示,不同的计算方式导致不同的训练参数,也就导致不同的模型表现。
下面逐步讲解self-Attention的过程,举例 输入为: Thinking Machines Step 1
首先为每个input生成三个向量:a Query vector(q), a Key vector(k), and a Value vector(v)。
文章图片
其中三个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的概率分布。
文章图片
如上图所示,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,即概率分布。
文章图片
Step 4
第四步:将上面的softmax结果作为weight,对所有的v进行加权和,得到z。
文章图片
上面4个步骤形象化的介绍了self-attention模型,但是实际应用是利用矩阵进行运算的,矩阵的运算形式如下:首先是Q,K,V的计算
文章图片
之后是score,softmax和最终结果z可以利用一个公式表达:
文章图片
四、Mask机制与Attention的tensorflow实现 关于Attention的Mask机制,以及Attention的tensorflow实现,请参考:
- Attention中的Mask
- 或者github原文
遍地开花的Attention
Attention中的Mask
Attention中的Mask(github原文)
推荐阅读
- paddle|动手从头实现LSTM
- 人工智能|干货!人体姿态估计与运动预测
- 推荐系统论文进阶|CTR预估 论文精读(十一)--Deep Interest Evolution Network(DIEN)
- Python专栏|数据分析的常规流程
- 读书笔记|《白话大数据和机器学习》学习笔记1
- Pytorch学习|sklearn-SVM 模型保存、交叉验证与网格搜索