虽然一直在改进ABCNN,但是对于attention总是看了又忘,忘了又看,今天总结一下(方便自己日后复习即可)。
一、attention 机制思路
以一个例子讲解。机翻 “i am a student” 为 “我 是 一个 学生”。常规的方法是使用RNN,考虑连续语义输出。
但是以翻译“a”为例,我们人类的翻译往往翻译思路是首先将 “a” 翻译为 “一个”,而希望其他英文单词对翻译“a”单词的影响尽可能的小。这并不像常规RNN,在翻译“a”时会考虑 "i am",并且考虑的程度不小。以此类推,可以概括为希望网络在翻译单词时会将注意力放在当前正在翻译的单词上。
二、attention 机制实现
![](https://img.haomeiwen.com/i17624987/b41fda9b56c0214a.png)
以Sep2Sep模型为例。输入英文句子" i am a student "到一个两层的LSTM编码网络中,经过编码后输入到另外一个两层的LSTM解码网络。
ht是第一个解码时刻的隐含状态,在解码第一个时刻(ht)时,想要将注意力放在`h1上,很显然要增加解码`h1时对应的权重。这又分为两步。1、判断是否应该将注意力放在`h1上面/判断应该将注意力放在哪个编码时刻的隐含状态。2、依照各个隐含状态与待解码状态的相似程度来改变编码状态`h1,`h2,`h3,`hs的权重,之后与解码中的隐含态ht结合共同得到输出结果。
1、判断哪一个`hx与h1最相似
相似计算很简单也很难,此时的 ht 与编码部分的隐含状态都处于同一个Embedding space,所以可通过判断哪一个`hx与ht最相似来解决,在机翻中按常规思路依照下面公式计算即可
![](https://img.haomeiwen.com/i17624987/928442647d3b96fb.png)
其中score就是相似度计算函数(同时进行了softmax归一化),并且通常有两种计算方式
![](https://img.haomeiwen.com/i17624987/757d2efff6bf3a86.png)
2、计算权重,得到ht(context vector)
当网络分别得到当前解码时刻与所有编码时刻对应的相似度系数之后(图中的attention weights),再以加权就和的形式将所有的编码状态累加起来得到context vector(解码层翻译第一个单词的第一个输入),最终与 ht(解码层翻译第一个单词的第二个输入)组合得到当前解码时刻的输出。(之所以要以加权求和的形式进行是因为,虽然此时的ht仅仅只与 `h1 最为相关,但同样也受其它编码状态的影响(例如到句型复杂的时候)。但是,若是换了应用场景,只进行对应权重乘以对应隐含状态,不进行累加也是可以的。
按照上面思路,有了下面的公式:
![](https://img.haomeiwen.com/i17624987/84ad68037f376cd0.png)
![](https://img.haomeiwen.com/i17624987/94ebef4488ad1158.png)
三、attention改进点
通过以上分析我们可以发现,要运用注意力机制最为重要的一点就是能找到一个相似度对比的过程,也就是图中
ht与所有隐含状态对比的例子
网友评论