Attention机制
回顾RNN结构
- 讲attention之前先回顾一下RNN的各种结构
N to N
- 如:语音处理,时间序列处理
N to 1
- 如:情感分析,输入一段视频判断类型
1 to N
或
- 如:从图像生成文字,从类别生成语音或音乐
N to M
- 这种就够又叫
encoder-decoder
模型,或Seq2Seq
模型
或
- 如:机器翻译,文本摘要,阅读理解,语音识别……
回归正题Attention
在
encoder-decoder
结构中,显然当要处理的信息长度很长的时候,一个c存储不了那么多信息,导致处理精度下降所以我们打算计算很多个c
每一个c会去选取和当前所要输出的y最合适的上下文信息。
具体的,我们用$a_{ij}$来衡量encoder中第j阶段的$h_j$(hidden state),和当前decoder中第i阶段的相关性
以机器翻译为例
- 上图标有红色的地方就是和decoder当前阶段最相关的地方,对应的值较大;其他的地方对应的值较小。这里就是attention的精髓所在了——每个decoder的状态对于每个encoder的状态分配注意力(当然,$\sum_{j=1}^{T_x}a_{ij}=1$)
$$
h_t=RNN_{enc}(x_t,h_{t-1})\\
h'_t=RNN_{dec}{(c_t,h'_{t-1})}\\
c_i=\sum_{j=1}^{T_x} a_{ij}h_j\qquad (T_x是x总长)
$$
-
接下来就是求$a_{ij}$
- $$
b_{ij}=score(h’{i-1},h_j)\qquad (我们的h’是从0开始的)\
a{ij}=\frac{e^{b_{ij}}}{\sum e^{b_{ik}}}
$$
- $$
那么我们的score是怎么计算的呢
- 最简单的方方法就是直接计算点乘,点积类似计算相似度。
而,attention极值就是来解决这个问题的,定义如下
- 给定一组向量集合
value
,以及一个向量集合query
,attention机制就是根据query
计算value
的加权求和机制
- 给定一组向量集合
主要也就一块代码
1 | class AttDecoder_RNN(nn.Module): |