注意力机制:编码器 和 解码器
编码器
编码器如下所示,输入 先经过 嵌入层 转化为输入向量,然后在每个时间步产生一个隐藏状态,最后将每个时间步生成的向量,组合成一个矩阵
H
H
H,传入解码器
解码器
对于每个时间步,需要计算出 注意力语境向量(Context Vector),步骤如下:
第一步,计算 Score
,输入 编码器中得到的 隐藏状态矩阵
H
H
H(假设维度为 m * 3
),输出 对应每个隐藏状态的得分向量,则得分向量的维度为 1 * 3
第二步,将得到的 Score
经过 softmax
转化,得到新的向量,维度为 1 * 3
第三步,将第二步中得到的向量(1 * 3
)与 转置后的隐藏矩阵
H
T
H^T
HT执行点积运算,最终得到注意力语境向量,维度为 1 * 3
⋅
\cdot
⋅ 3 * m
= 1 * m
,其中 m
表示每个隐藏状态的向量长度
上面过程如下图所示:
Score 函数
在解码器中,计算注意力语境向量时,需要计算 编码器每个隐藏状态的评分,即 Score函数。有两种计算 Score 的算法,分别是 加法注意力 和 乘法注意力,公式如下:
加法注意力 Score 函数
e
i
j
=
v
a
T
t
a
n
h
(
W
a
s
i
−
1
+
U
a
h
j
)
e_{ij}=v_a^Ttanh(W_as_{i-1}+U_ah_j)
eij=vaTtanh(Wasi−1+Uahj)
其中
h
j
h_j
hj 表示编码器的第
j
j
j 个隐藏状态向量,
s
i
−
1
s_{i-1}
si−1表示解码器的上一个时间步的隐藏状态。
v
a
v_a
va、
W
a
W_a
Wa和
U
a
U_a
Ua是需要训练的权重矩阵。
乘法注意力 Score 函数
有三个函数可供选择,第一个称为点乘评分函数,是编码器隐藏状态和解码器
t
t
t 时间步的隐藏状态的点积。第二个是通用评分函数,用于平衡编码器隐藏状态 和 解码器隐藏状态之间维度不对应的问题。第三个与加法注意力很相似,将 两个隐藏状态相加后,乘以权重矩阵,然后双曲正切,最后再乘以另一个权重矩阵。
得到隐藏状态的评分后
应用 softmax 函数进行软化
最后计算 语境向量
这一步相当于将 软化后的向量 与 隐藏状态矩阵
H
H
H 的转置
H
T
H^T
HT 执行点击运算
最后
h
t
^
=
t
a
n
h
(
W
c
[
c
t
;
h
t
]
)
\hat{h_t}=tanh(W_c[c_t;h_t])
ht^=tanh(Wc[ct;ht])
将语境向量 和 解码器在
t
t
t 时间步的隐藏状态拼接,作为输入传入一个拥有一个隐藏层的神经网络,最后经过双曲正切函数后,得到该时间步的输出。
W
c
W_c
Wc 表示神经网络隐藏层的权重矩阵。