参考链接:
Intuition
类似于人的注意力机制。
在观察某幅图像时,人不会将注意力平均的分散到图像的每一处,而是根据需求重点关注特定的某一部分。当我们发现图像的某一部分经常出现我们需要注意的东西的时候,我们就会在将来出现类似场景时把注意力放在图像的这部分上。
从数学角度来理解,相当于从序列中学习到每一个元素的重要程度,然后为其赋予一系列注意力分配系数,按照权重参数将元素合并。
Application
- 在机器翻译、语音识别应用中,为句子中的每个词赋予不同的权重,使神经网络模型的学习变得更加灵活。
- 做为一种对齐关系,解释翻译输入/输出句子之间的对齐关系,解释模型到底学到了什么知识,为我们打开深度学习的黑箱,提供了一个窗口。
Model
图一:传统的Seq2Seq模型
参数解释:
[
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缺乏区分度。
图二:Attention机制图解
参数解释:
[
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模型。
Concrete Model
Self-Attention
Self-Attention的基本结构如上图所示。
直观理解:
首先对于模型