seq2seq中的attention机制

博客已迁至知乎,本文链接: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[hi1,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αtieti=i=1Tαtihi=k=1Texp(etk)exp(eti)=vatanh(Wa[si1,hi])

其中 c t {\color{Red} {c_t}} ct 是 t 时刻的语义向量; e t i e_{ti} eti 是Encoder中 i 时刻 Encoder隐层状态 h i h_i hi 对Decoder中 t 时刻隐层状态 s t s_t st 的影响程度;通过softmax函数(第二个式子)将 e t i e_{ti} eti 概率归一化为 α t i \alpha_{ti} αti

第二步,传递隐层信息并预测:

s t = t a n h ( W [ s t − 1 , y t − 1 , c t ] ) o t = s o f t m a x ( V s t ) \begin{aligned} s_t &=tanh(W[s_{t-1},y_{t-1},{\color{Red} {c_t}}])\\ o_t &=softmax(Vs_t) \\ \end{aligned} stot=tanh(W[st1,yt1,ct])=softmax(Vst)


第二种attention结构:Luong Attention

该模型来自于Luong et.al(2015),模型框架如下图:

与第一种attention结构区别在Decoder部分,Encoder部分完全相同。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 ) s t = t a n h ( W [ s t − 1 , y t − 1 ] ) e t i = s t ⊤ W a 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})}\\ {\color{Green} {s_t}} &=tanh(W[s_{t-1},y_{t-1}])\\ e_{ti} &={\color{Green} {s_t^{\top}W_ah_i}}\\ \end{aligned} ctαtisteti=i=1Tαtihi=k=1Texp(etk)exp(eti)=tanh(W[st1,yt1])=stWahi

可以看出区别在计算影响程度 e t i e_{ti} eti 这个公式,这里我只写出了最优公式,有兴趣可以研读下论文。

第二步,传递隐层信息并预测:
s ~ t = t a n h ( W c [ s t , c t ] ) o t = s o f t m a x ( V s ~ t ) \begin{aligned} {\color{Green} {\widetilde{s}_t}} &=tanh(W_c[{\color{Green} {s_t}},{\color{Red} {c_t}}]) \\ o_t &=softmax(V{\color{Green} {\widetilde{s}_t}}) \\ \end{aligned} s tot=tanh(Wc[st,ct])=softmax(Vs t)

先计算出初始的隐层状态 s t s_t st,再计算注意力层的隐层状态 s ~ t {\color{Green} {\widetilde{s}_t}} s t,最后送入softmax层输出预测分布。


总结

Bahdanau Attention与Luong Attention两种注意力机制大体结构一致,区别在于计算影响程度的对齐函数。在计算 t t t时刻的影响程度时,前者使用 h i h_i hi s t − 1 s_{t-1} st1 来计算,后者使用 h i h_i hi s t s_{t} st 来计算。从逻辑来看貌似后者更合逻辑,但两种机制现在都有在用,TensorFlow中两者都有对应的函数,效果应该没有很大差别。


References:

[1] Bahdanau et.al (2014) Neural Machine Translation by Jointly Learning to Align and Translate
[2] Luong et.al (2015) Effective Approaches to Attention-based Neural Machine Translation

你可能感兴趣的:(深度学习)