博客已迁至知乎,本文链接:https://zhuanlan.zhihu.com/p/70905983
前言
本文来讲一讲应用于seq2seq模型的两种attention机制:Bahdanau Attention和Luong Attention。文中用公式+图清晰地展示了两种注意力机制的结构,最后对两者进行了对比。seq2seq传送门:click here.
文中为了简洁使用基础RNN进行讲解,当然现在一般都是用LSTM,这里并不影响,用法是一样的。另外同样为了简洁,公式中省略掉了偏差。
第一种attention结构:Bahdanau Attention
两种机制基于上篇博客第一种seq2seq结构。Encoder生成的语义向量 c {\color{Red} {c}} c 会传给Decoder的每一时刻,传给每一时刻的语义向量都是同一个 c {\color{Red} {c}} c,这是不合理的。比如翻译一句话,I like watching movie.
翻译成:我喜欢看电影。
,其中喜欢
基本上是由like
得来的,I like watching movie.
中每个词对翻译成喜欢
的影响是不同的。所以,在Decoder中,每个时刻的语义向量 c t {\color{Red} {c_t}} ct 都应该是不同的。
该模型来自于Bahdanau et.al(2014),模型框架如下图:
计算公式如下更方便理解。
Encoder:
h i = t a n h ( W [ h i − 1 , x i ] ) o i = s o f t m a x ( V h i ) \begin{aligned} h_i &=tanh(W[h_{i-1},x_i])\\ o_i &=softmax(Vh_i) \\ \end{aligned} hioi=tanh(W[hi−1,xi])=softmax(Vhi)
Decoder:
分为两步:
第一步,生成该时刻语义向量:
c t = ∑ i = 1 T α t i h i α t i = e x p ( e t i ) ∑ k = 1 T e x p ( e t k ) e t i = v a ⊤ t a n h ( W a [ s i − 1 , h i ] ) \begin{aligned} {\color{Red} {c_t}} &=\sum ^T_{i=1} \alpha_{ti}h_i\\ \alpha_{ti} &=\frac{exp(e_{ti})}{\sum^T_{k=1}exp(e_{tk})}\\ e_{ti} &=v_a^{\top}tanh(W_a[s_{i-1},h_i])\\ \end{aligned} ct