在sequence-to-sequence学习中,输入和输出都是序列,通常采用Encoder-Decoder的框架进行处理。这种结构首先通过编码器(如CNN/RNN/LSTM等)将输入序列编码成一个固定长度的中间向量,然后将该向量作为解码器(如DNN/CNN/RNN/LSTM)的输入进行解码得到最终结果。以机器翻译为例,其Encoder-Decoder结构如下:
上图中,Encoder和Decoder都是RNN,分别省略了隐含层初始值( e 0 e_0 e0, d 0 d_0 d0)。在Encoder阶段,编码器将输入的“机器学习”编码成隐含层状态,其中 e 4 e_4 e4可以认为是读取了所有输入信息和隐含层信息,因此我们希冀 e 4 e_4 e4能够包含整个输入句子的信息。然后,在Decoder阶段,我们将 e 4 e_4 e4作为解码器的输入,逐一得到输出“machine”、“learning”和“===”。上图中红色虚线表示可选操作,即 e 4 e_4 e4可以作为 d 2 d_2 d2, d 3 d_3 d3的输入也可以不输入 d 2 d_2 d2, d 3 d_3 d3。在上述Encoder-Decoder结构中,大家或许和我都存在同一个疑问:编码器最后一个隐含层状态( e 4 e_4 e4)能够代表整个输入的信息吗?这个问题确实是存在的,将不论长短的输入序列都编码到固定长度的隐向量时必定会带来信息的损失,特别是当序列很长时,模型难以学到合适的向量表示,解码器将受限于该固定长度的向量表示,模型性能会变得很差。在Neural machine translation by jointly learning to align and translate, 2015中,作者也明确指出了这个问题:
A potential issue with this encoder–decoder approach is that a neural network needs to be able to compress all the necessary information of a source sentence into a fixed-length vector. This may make it difficult for the neural network to cope with long sentences, especially those that are longer than the sentences in the training corpus.
Attention机制
既然采用固定的向量表示输入序列会限制模型性能,那能不能让解码器每次接收的输入都不一样呢,在每次输出时,让解码器有侧重的关注输入序列的不同部分(如:输出“machine”时,应更加关注“机”和“器”,输出“learning”时,应更加关注“学”和“习”),这就是Attention机制的思想。
可以看到,Decoder分别接收了不一样的输入 C 1 C_1 C1, C 2 C_2 C2和 C 3 C_3 C3,并且 C 1 C_1 C1, C 2 C_2 C2和 C 3 C_3 C3的值是从Encoder的隐变量中计算出来的。以 C 1 C_1 C1为例,其具体计算过程如下:
- 首先, e 1 e_1 e1和 z 0 z_0 z0一起输入match模块,得到 α 1 1 \alpha_1^1 α11,同理, e 2 e_2 e2, e 3 e_3 e3, e 4 e_4 e4分别和 z 0 z_0 z0输入match模块也能得到 α 1 2 \alpha_1^2 α12, α 1 3 \alpha_1^3 α13, α 1 4 \alpha_1^4 α14。match模块可以看作是在计算 e e e和 z z z的相似度,如上图右边所示。 z z z是Decoder模块的隐含层变量,因此这里 z 0 z_0 z0是隐含层的初始值。match模块常有三种选择:1)直接计算向量的余弦相似度;2)一个小的神经网络模型,输入是 e e e和 z z z,输出是一个标量;3) α = e T W z \alpha=e^TWz α=eTWz。采用(2)和(3)两种方式时,match模块的参数也是随着网络反向传播一同学习的。
- 计算出Encoder每一个隐变量 e e e与 z z z的相似度后,需要将其归一化,常采用softmax函数,归一化后得到的 α ^ \hat\alpha α^可以看作是Decoder在输出 Y 1 Y1 Y1时对Encoder中每一个隐含层信息的关注度。
- 最后对隐含层信息求加权和即可得到
c
1
c_1
c1。
c 1 = ∑ α ^ 1 i e i c_1=\sum\hat\alpha_1^ie_i c1=∑α^1iei
Attention机制的计算公式可以整理如下:
α
t
i
=
m
a
t
c
h
(
z
t
−
1
,
e
i
)
=
V
⋅
t
a
n
h
(
W
⋅
e
i
+
U
⋅
z
t
−
1
+
b
)
α
^
t
i
=
e
x
p
(
α
t
i
)
∑
k
=
1
T
x
e
x
p
(
α
t
k
)
c
t
=
∑
k
=
1
T
x
α
^
t
k
e
k
z
t
=
f
(
z
t
−
1
,
y
t
−
1
,
c
t
)
\alpha_t^i=match(z_{t-1},e_i)=V\cdot tanh(W\cdot e_i+U\cdot z_{t-1}+b)\\ \hat\alpha_t^i=\frac{exp(\alpha_t^i)}{\sum_{k=1}^{T_x}exp(\alpha_t^k)}\\ c_t=\sum_{k=1}^{T_x}\hat\alpha_t^ke_k\\ z_t=f(z_{t-1},y_{t-1},c_t)
αti=match(zt−1,ei)=V⋅tanh(W⋅ei+U⋅zt−1+b)α^ti=∑k=1Txexp(αtk)exp(αti)ct=k=1∑Txα^tkekzt=f(zt−1,yt−1,ct)
加入Attention机制的Encoder-Decoder整体框架如下图所示
总结
Attention机制几乎是现在所有序列学习的必备,Attention不是一种模型而是一种思想,受到人类在处理数据时分散注意力的启发,许多模型加上Attention机制都得到了state-of-art的结果,也促成了该思想的蓬勃发展。
最后,祝大家中秋快乐!
参考文献
Neural machine translation by jointly learning to align and translate, 2015
李宏毅机器学习2017秋
Deep Learning基础–理解LSTM/RNN中的Attention机制