attention机制来自于视觉的感知,对某些关键区域聚焦,其应用在图片上可行,是否可以应用在文本处理。答案是可行的,其实当我们快读阅读或者读长篇文本的时候,我们的注意力是集中在关键词,事件或实体上。通过大量实验证明,将attention机制应用在机器翻译,摘要生成,阅读理解等问题上,取得的成效显著。本文不做过多分析,只指出大概的机制。主要方便自己复习。
非attention:
非attention机制的encoder-decoder模型如下图所示: 即生成目标句子单词的过程成了下面的形式:
可以简单理解为:x序列经过RNN产生的最后状态hm来生成中间语义向量C,再由C产生输出y序列。 y1,H1 = RNN(EOS,C) y2,H2 = RNN(y1,H1) y3,H3 = RNN(y2,H2) .... .... ....
attention机制:
attention机制相当于C由h1、h2、...hm共同决定,且每输出一个字符,C是动态变化的。 其模型如下图所示: 即生成目标句子单词的过程成了下面的形式:
其中Ci可以表示为: aij是encoder层状态hj影响下一个输出字符的权重。
那么aij怎么得到呢?,看下图: (上图Si-2应该为Hi-2)通过函数F(hj,Hi-1)来获得目标单词yi和每个输入单词对应的对齐可能性,这个F函数在不同论文里可能会采取不同的方法,可以是
- 余弦相似度
- 一个简单的 神经网络,输入为hh和ww,输出为αα
- 或者矩阵变换α=hTWzα=hTWz (Multiplicative attention,Luong et al., 2015)
然后函数F的输出经过Softmax进行归一化就得到了符合概率分布取值区间的注意力分配概率分布数值。
公式汇总一下: H0 = 初始化状态(decoder隐藏层初始化状态),y0 = EOS
- aij = F(hj, Hi-1),aij = sorfmax(ai1,ai2,..aim)
- Ci = sum(aij*hj), j= 1,2,...m
- Hi = f(Ci , yi-1), yi = g(Hi),函数f,g合并在RNN中 yi,Hi = RNN(Ci , yi-1)
上图表示不是很清楚,可以理解为: y1,H1 = RNN(EOS,C1) , C1 = sum(aij*hj), aij = F(hj, H0), H0为初始化状态 y2,H2 = RNN(y1,C2) , C2 = sum(aij*hj), aij = F(hj, H1) y3,H3 = RNN(y2,C3) , C3 = sum(ai*hj), aij = F(hj, H2) ... ... ... 补充一张更详细的google教程上的图:
训练阶段:
通过(x---y)训练修正--->F参数、RNN参数。
具体过程逻辑:
可以参考google程序seq2seq: 自己总结如下:
其中:函数cov_2d是卷积提取特征,f是变换函数得到权重,Liner是线性变换(matul(W([attns0,y0])+B) 在程序中如果loop_function存在,上图则为 OP1,H1 = F(<EOS>, hm, [O1,O2,..Om]), OP2,H2 = F(OP1, H1, [O1,O2,..Om]), OP3,H3 = F(OP2, H2, [O1,O2,..Om]), ...
参考: