前言
- 基于RNN的Seq2Seq模型无法记住长序列
- Attentnion机制可以大幅度提升Seq2Seq模型
Seq2Seq Model with Attention
- Attention可以让句子在逐步变长的时候不忘记前面的输入信息
- Attention还可以告诉Decoder应该关注哪一个状态
- 优点:Attention可以大幅度提高准确率
- 缺点:Attention计算量比较大
Simple RNN + Attention
- 需要计算最后一个输出的状态和前面所有状态的相关性(权重),把这个权重记为
α
i
\alpha_i
αi,所有的权重总和为1
- 计算方法1(原版):①把
h
i
h_i
hi 和
s
0
s_0
s0 做concatenation,②然后和一个矩阵
W
W
W(需要被训练的参数)相乘后丢到 tanh 激活函数里面使其范围变为
[
−
1
,
1
]
[-1,1]
[−1,1] ,③然后再和
v
T
v^T
vT 做内积得到一个实数。④最后把所有的权重做一个Softmax。
- 计算方法2(更流行,和Transformer一致):①将
h
i
h_i
hi 与
W
K
W_K
WK(需要被训练的参数) 相乘得到
k
i
k_i
ki,将
s
0
s_0
s0 与
W
Q
W_Q
WQ(需要被训练的参数) 相乘得到
q
0
q_0
q0,其中
k
i
k_i
ki 和
q
0
q_0
q0 都是一维的向量。②
k
i
T
q
0
k^T_iq_0
kiTq0 得到权重
α
i
~
\tilde{\alpha_i}
αi~。③对所有的
α
i
~
\tilde{\alpha_i}
αi~ 做 Softmax即可得到权重。
- 计算方法1(原版):①把
h
i
h_i
hi 和
s
0
s_0
s0 做concatenation,②然后和一个矩阵
W
W
W(需要被训练的参数)相乘后丢到 tanh 激活函数里面使其范围变为
[
−
1
,
1
]
[-1,1]
[−1,1] ,③然后再和
v
T
v^T
vT 做内积得到一个实数。④最后把所有的权重做一个Softmax。
- 我们对所有的
h
i
h_i
hi 利用刚刚算出的权重计算加权平均得出一个向量
c
0
c_0
c0,其中一个
c
c
c 对应一个
s
s
s,计算出的加权平均向量被称为 Context vector。
- 对于更新状态来说,之前的Simple RNN是这样的,它不会去看前面的状态,而是只会看最后一个
- 而有Attention后更新状态还会把之前的信息
c
0
c_0
c0 考虑进去,也就是还会把前面的信息考虑进去,这样就把RNN遗忘的问题解决了
- 而对于后续的状态
s
i
s_i
si 重复前面的步骤即可,注意每次权重
α
i
\alpha_i
αi 都需要重新计算后得出
c
i
c_i
ci
- Question: 有多少权重
α
i
\alpha_i
αi 被计算了?
- 对于每一个 c i c_i ci ,我们都i需要用 s i s_i si 来计算 m m m 个权重
- 假设 Decoder 有 t t t 个状态,那么总共就需要计算 m t mt mt 次
- 这个时间复杂度是很高的!
- 权重可视化:在下面的图中,连线表示相关性,连线越粗,相关性越强。而可以看到Area和zone有比较粗的连线,而英语中的Area就对应法语中的zone:权重指导Decoder关注Encoder中正确(如zone会特别关注Area)的状态,从而生成正确的翻译
Summary
- 之前的Seq2Seq模型:Decoder只会关注最后一个状态,容易导致遗忘
- Attention则会关注Encoder的所有状态
- Attention还会指导Decoder关注的侧重点
- 缺点:更高的计算复杂度,之前的模型只需要 O ( m + t ) O(m+t) O(m+t) 的复杂度,而Attention则需要 O ( m t ) O(mt) O(mt) 的复杂度,其中 m m m 是源序列的长度, t t t 是目标序列的长度