-
为什么要引入注意力机制?
在原本的 encoder-decoder 模型中,无论输入的文本序列有多长,都会讲信息压缩成一个固定维度的向量 c 。维度固定,存储的信息量也就固定了,那么对于长文本序列,会丢失很多信息,这是我们不想看到的。注意力机制的引入就是为了解决这个问题。 -
注意力机制
分两种:BahdanauAttention 与 LuongAttention
BahdanauAttention
加了注意力机制以后,向量 c 的维度依然是固定的,但是在每个时间步, c 的值都会改变,或者说从原来的的单个向量 c 变成了一组向量
c
i
c_i
ci 。
c
i
的
公
式
c_i 的公式
ci的公式:
c
i
=
∑
j
=
1
T
α
i
j
h
j
c_i = \sum_{j=1}^T\alpha_{ij}h_j
ci=j=1∑Tαijhj
而
α
i
j
=
e
x
p
(
e
i
j
)
∑
k
=
1
T
e
x
p
(
e
i
k
)
,
\alpha_{ij} = \frac{exp(e_{ij})}{\sum_{k=1}^Texp(e_{ik})},
αij=∑k=1Texp(eik)exp(eij),
e
i
j
=
a
(
s
i
−
1
,
h
j
)
=
v
a
T
t
a
n
h
(
W
a
s
i
−
1
+
U
a
h
j
)
e_{ij} = a(s_{i-1}, h_j) = v_a^Ttanh(W_as_{i-1}+U_ah_j)
eij=a(si−1,hj)=vaTtanh(Wasi−1+Uahj)
其中 i 代表输出的第 i 个位置, j 代表输入的 第 j 个位置。
a 代表一种分数的计算方式。最简单的方式就是点积了
e
i
j
e_{ij}
eij(或者
α
i
j
\alpha_{ij}
αij) 衡量了输入位置 j 和输出位置 i 的匹配程度,或者说是相关性,越相关,值越大,对应了权重的概念。
c
i
c_i
ci 代表了对 encoder hidden states 的加权平均,权重是
α
i
j
\alpha_{ij}
αij .
这样在不同阶段
c
i
c_{i}
ci 的信息重要程度不同,就不用担心遗失重要的信息了。
LuongAttention
公式如下:
c
i
=
∑
j
=
1
T
α
i
j
h
j
c_i = \sum_{j=1}^T\alpha_{ij}h_j
ci=j=1∑Tαijhj
α
i
j
=
e
x
p
(
e
i
j
)
∑
k
=
1
T
e
x
p
(
e
i
k
)
,
\alpha_{ij} = \frac{exp(e_{ij})}{\sum_{k=1}^Texp(e_{ik})},
αij=∑k=1Texp(eik)exp(eij),
e
i
j
=
{
h
j
T
s
i
dot
h
j
T
W
a
s
i
general
v
a
T
t
a
n
h
[
h
j
T
,
s
i
]
concat
e_{ij}= \begin{cases} h_j^Ts_i& \text{dot}\\ h_j^TW_as_i& \text{general} \\ v_a^Ttanh{[h_j^T,s_i]} &\text{concat} \end{cases}
eij=⎩⎪⎨⎪⎧hjTsihjTWasivaTtanh[hjT,si]dotgeneralconcat
注:为了和上文保持一致,我将
h
s
‾
\overline{h_s}
hs 换成了
s
i
s_i
si,
h
t
h_t
ht 换成了
h
j
h_j
hj 。
它们的不同点:
- 在计算第 i 个位置的分数时,BahdanauAttention 选择了 s i − 1 s_{i-1} si−1, 而 LoungAttention 选择了 s i s_i si;
- BahdanauAttention 对 Encoder 和 Decoder 的双向的 RNN 的 state 拼接起来作为输出,LuongAttention 仅使用最上层的 RNN 输出
- 得分的计算方式
这只是两种最基本的形式,先说这么多。。。
参考:
Neural Machine Translation by Jointly Learning to Align and Translate
Effective Approaches to Attention-based Neural Machine Translation
BahdanauAttention与LuongAttention注意力机制简介