参考链接:
- 浅谈Attention机制的理解
- 模型汇总24 - 深度学习中Attention Mechanism详细介绍:原理、分类及应用
- Attention机制详解(一)——Seq2Seq中的Attention
类似于人的注意力机制。
在观察某幅图像时,人不会将注意力平均的分散到图像的每一处,而是根据需求重点关注特定的某一部分。当我们发现图像的某一部分经常出现我们需要注意的东西的时候,我们就会在将来出现类似场景时把注意力放在图像的这部分上。
从数学角度来理解,相当于从序列中学习到每一个元素的重要程度,然后为其赋予一系列注意力分配系数,按照权重参数将元素合并。
参数解释:
[ x 1 . . . x T x_1...x_T x1...xT]表示输入序列,每个元素代表输入序列中的一个单词向量;
c是固定长度隐向量(称之为背景向量或者上下文向量);
[ y 1 . . . y T ′ y_1...y_{T'} y1...yT′]表示输出序列;
T, T’分别代表输入序列长度和Decoder层隐状态数目。
模型解释:
Encoder和Decoder分别是两个RNN;
Encoder将输入序列编码成为固定长度隐向量c;
Decoder以c为预测y1的初始向量,同时作为背景向量指导输出序列中每一个步骤的y的输出。
数学表示:
假设hi为Encoder中的隐状态,那么Encoder的计算过程用公式表示为:
h i = f ( h i − 1 , x i ) h_i=f(h_{i-1},x_i) hi=f(hi−1,xi)
假设si为Decoder中的隐状态,那么Decoder的计算过程用公式表示为:
s i = g ( s i − 1 , c ) s_i=g(s_{i-1},c) si=g(si−1,c)
可以看到,传统的Seq2Seq模型对于输入序列X缺乏区分度。
参数解释:
[ x 1 . . . x T x_1...x_T x1...xT]表示输入序列,每个元素代表输入序列中的一个单词向量;
hi表示Encoder模块RNN的隐状态;
a i , j a_{i,j} ai,j表示Encoder端的第j个单词与Decoder端的第i个单词之间的权值和影响程度;
sj表示Decoder模型RNN的隐状态;
[ y 1 . . . y T ′ y_1...y_{T'} y1...yT′]表示输出序列;
T, T’分别代表输入序列长度和Decoder层隐状态数目。
模型解释:
可以看到,最大的变化在于背景向量ci的计算方式(图中改成了Bi-RNN,但是这不是重点)
不是简单的直接将隐状态累加,而是加权累加。
权值的计算来自于encoder端单词对于decoder端单词的影响程度。
数学表示:
c i = ∑ j a i , j h j c_i=\sum_ja_{i,j}h_j ci=∑jai,jhj
a i , j = s o f t m a x ( e i , j ) = e x p ( e i , j ) ∑ k e x p ( e i , k ) a_{i,j}=softmax(e_{i,j})=\frac{exp(e_{i,j})}{\sum_kexp(e_{i,k})} ai,j=softmax(ei,j)=∑kexp(ei,k)exp(ei,j)
e i , j = a ( s i − 1 , h j ) e_{i,j}=a(s_{i-1},h_j) ei,j=a(si−1,hj)
其中,a代表相关性算符, e i , j e_{i,j} ei,j衡量encoder端的j个词对于decoder端的第i个词的对齐程度/影响程度,计算的时候往往依赖encoder端的第j个隐状态和decoder端的第i-1个隐状态(因为第i个隐状态还没有计算出来呀)。
不同的计算方式代表着不同的Attention模型。
直观理解:
首先对于模型