Paper:1508.04025v5.pdf
Code:文章未提供,见 Appendix
核心思想:通过在 Decoder 的每一步使用 Encoder 信息,并对 Encoder 信息赋予不同权重来获得更好的 Decoder 结果。
What
动机和核心问题
针对 Attention 机制的研究比较少,本文主要探讨了两种方法的 Attention 机制:全局方法和局部方法,前者使用所有源词,类似(Bahdanau et al 2015)的模型,但架构上更简单;后者每个 time step 使用所有源词的一个子集,可以看作是在(Xu 等人,2015)中提出的硬注意力模型和软注意力模型之间的有趣混合,它比全局注意力(或软注意力)更加容易计算,而且(不像硬注意力)几乎处处可微,更加容易训练和使用。
模型和算法
几乎所有的翻译模型都是 Encoder-Decoder 架构:
Decoder 基本都使用 RNN,但 RNN 的结构和 Encoder 计算源句子表征 s 的方法不同(详见《相关工作》)。
使用 stacking LSTM 架构,优化:
给定 target hidden state ht 和 source-side context vector ct:
该结果将通过 softmax 得到 token yt。所以主要是怎么计算 ct。
Global Attention
考虑 Encoder 中所有的 hidden states,此时 at 的 size 等于 source side 的 time step 数,at 就是权重向量。
其中,hs 就是 source side 的每一个 hidden state。分数的计算有三种方案:
ct 就是所有 source side hidden states 的加权平均。
与 Bahdanau et al. (2015) 相比更加简化和具有一般性:
- Encoder 和 Decoder 使用 Stack 顶层的 hidden state,Bahdanau 拼接了 Encoder 的双向 LSTM 的 hidden state 和 Decoder 的非 Stack 单向 LSTM hidden state。
- 计算过程:ht →at →ct →h ̃t,Bahdanau 在每一个 time step 根据前一个 hidden state 计算:ht−1 → at → ct → ht。实际每一步都重新计算了 s(见下)。
- 使用了三种计算分数的方法,Bahdanau 只使用了拼接方法。
Bahdanau 的机制:
每个 target yi 有一个 ci 对应。e 是 input j 附近与 output i 位置的 match 程度。si 其实就是 ht,即 target i 时刻的 hidden state。
进一步,稍微详细总结一下两者的计算过程:
Luong Attention:
- 计算 decoder 每一步的 output,即 ht
- 根据 ht 和 hs 计算 at
- 根据 at 和 hs 计算 ct(context vector)
- 拼接 ct 和 ht 得到 h ̃t(即 Attention 后的 output)
Bahdanau Attention:
- 计算 decoder 每一步的 output,即 ht-1
- 根据 ht-1 和 hs 计算 at
- 根据 at 和 hs 计算 ct
- 根据 ct 和 ht-1 计算得到 ht
Stackoverflow 上找到一张图比较直观:
接下来看一下代码:
1 | # 参考自:https://github.com/kevinlu1211/pytorch-batch-luong-attention |
注意,这里使用了 general 计算 score,其他的类似。
Local Attention
Global Attention 要注意 source 里面的所有词,但是针对太长的文本序列(比如段落、文章)就太低效了。受 Xu et al.2015 等人 soft 和 hard 注意力模型的启发提出 Local Attention。
具体做法是关注一个窗口的上下文,具体而言:
- 为每个 t 时刻的 target word 生成一个对齐的位置 pt。
- ct 在 [pt−D,pt+D] 窗口范围内的 source hidden states 上加权平均计算,D 靠经验选择。
文中考虑了两个变种:
- Monotonic alignment (local-m) : pt = t
- Predictive alignment (local-p): w 和 p 是模型参数,用来学习位置,S 是源句子的长度,pt ∈ [0, S],以 pt 为中心的高斯分布处理对齐: align 函数和 global 的一样,根据经验设置 σ = D/2,pt 是实数,s 是窗口内以 pt 为中心的整数。
Input-feeding
注意力机制的决策不应该是相互独立的,应该对过去的对齐信息予以考虑。具体而言,就是将 h ̃t 和 decoder 每一步的 input 拼接后作为输入。这样就相当于携带了历史的对齐信息。
特点和创新
- 探讨了 Global Attention 和 Local Attention;
- Global Attention 简化了过程,使用了多种计算分数的方法;
- Local Attention 提高了计算效率,在长文本下更加有效。
How
如何构造数据
Attention 最先在使用 NMT 上使用,不过其实是可以使用在任何序列建模中的(Self-Attention),我们这里以 NMT 为例,所以数据就是平行语料,首先分别处理成 one-hot 编码,需要说明的是,如果使用 SGD,长度可以不统一,如果使用 batch 训练,至少在 batch 这个层面是要统一长度的,即每个 batch 确定一个最大长度或以最大长度的 sequence 为标准,对其他的 sequence 进行 padding。
可以参考 Tensorflow 和 PyTorch 的官方教程
- Neural machine translation with attention | TensorFlow Core
- NLP From Scratch: Translation with a Sequence to Sequence Network and Attention — PyTorch Tutorials 1.4.0 documentation
这里以上面模型的仓库代码为例,它是在 batch 层面进行 padding 的。
1 | # 代码来自:https://github.com/kevinlu1211/pytorch-batch-luong-attention |
这个数据会直接喂入 Encoder 中,Decoder 时喂入的就是一行,因为要按 time step 一个个生成。
如何开始训练
基本步骤和其他模型类似:
1 | # 代码来自:https://github.com/kevinlu1211/pytorch-batch-luong-attention |
这里使用的 loss function 需要 mask 掉 pad 的 Token,代码如下:
1 | # 代码来自:https://github.com/kevinlu1211/pytorch-batch-luong-attention |
sequence_mask
返回一个 target_var 的 mask Tensor。比如:
1 | """ |
其余的都一目了然。
如何使用结果
Encoder 和训练时一样的,只需改一下 Decoder 每一个 time step 的 input 就可以了,代码如下:
1 | for t in range(max_target_length): |
数据和实验
使用了 WMT 英德互译的平行语料,结果如下:
另外有个 Attention 机制的结果可以注意下:
作者得出的结论为:
- Global + location 效果不好
- Concat 效果不好
- Global + dot 效果不错
- Local + general 效果不错
Discussion
相关工作
计算源句子表征和选择 Decoder RNN 结构的不同:
- 使用标准 RNN 作为 Decoder,CNN 去表征源句子, s 只在初始化 decoder hidden state 时被使用。
- [Kalchbrenner and Blunsom 2013] N.Kalchbrennerand P. Blunsom. 2013. Recurrent continuous translation models. In EMNLP.
- 使用 Stack LSTM 作为 Encoder 和 Decoder, s 只在初始化 decoder hidden state 时被使用。
- [Sutskever et al.2014] I. Sutskever, O. Vinyals, and Q. V. Le. 2014. Sequence to sequence learning with neural networks. In NIPS.
- [Luong et al.2015] M.-T. Luong, I. Sutskever, Q. V. Le, O. Vinyals, and W. Zaremba. 2015. Addressing the rare word problem in neural machine translation. In ACL.
- 使用 GRU 作为组件:
- s 只在初始化 decoder hidden state 时被使用。
- [Cho et al.2014] Kyunghyun Cho, Bart van Merrien- boer, Caglar Gulcehre, Fethi Bougares, Holger Schwenk, and Yoshua Bengio. 2014. Learning phrase representations using RNN encoder-decoder for statistical machine translation. In EMNLP.
- s 实际使用了一组 source hidden states。
- [Bahdanau et al.2015] D. Bahdanau, K. Cho, and Y. Bengio. 2015. Neural machine translation by jointly learning to align and translate. In ICLR.
- [Jean et al.2015] Se ́bastien Jean, Kyunghyun Cho, Roland Memisevic, and Yoshua Bengio. 2015. On using very large target vocabulary for neural ma- chine translation. In ACL.
- s 只在初始化 decoder hidden state 时被使用。
注意力机制:
- soft and hard attention: [Xu et al.2015] Kelvin Xu, Jimmy Ba, Ryan Kiros, Kyunghyun Cho, Aaron C. Courville, Ruslan Salakhutdinov, Richard S. Zemel, and Yoshua Ben- gio. 2015. Show, attend and tell: Neural image cap- tion generation with visual attention. In ICML.
- selective attention: [Gregor et al.2015] Karol Gregor, Ivo Danihelka, Alex Graves, Danilo Jimenez Rezende, and Daan Wier- stra. 2015. DRAW: A recurrent neural network for image generation. In ICML.
特殊情况
- Input-feeding:见 模型和算法 部分。
- Attention 机制选择:见 数据和实验 部分。
打开脑洞
纵观全文,核心点其实就是如何在 Decoder 的时候更好地利用 Encoder 的信息。最一开始的 Seq2Seq 架构,直接使用的是 Encoder 的 hidden state 作为 Encoder 的表征用在 Decoder 的每一步中,现在在每一步都增加了和 Encoder 的互动,这在直觉上确实很 make sense。这块其实还可以做更多的变化,不过论文中的思想确实操作简单且效果不错,而这可能正是深度学习时代所需要的——庞大的网络+简单的思想。
最后还有个小心得:看了论文才发现无论是 Tenforflow 还是 Pytorch,Tutorial 里面的 Attention 都不是原汁原味对论文的实现(想象也肯定会做一些调整的),Pytorch 没明说用的到底是哪个,Tensorflow 可是明明提到了:
This tutorial uses Bahdanau attention for the encoder.
这真的把人看的有点莫名所以。所以以后最好还是先看论文,毕竟是源头。
Appendix
- Neural machine translation with attention | TensorFlow Core
- NLP From Scratch: Translation with a Sequence to Sequence Network and Attention — PyTorch Tutorials 1.4.0 documentation
- nmt/attention_model.py at master · tensorflow/nmt
- OpenNMT-py/global_attention.py at master · OpenNMT/OpenNMT-py
- kevinlu1211/pytorch-batch-luong-attention
- Attention and Augmented Recurrent Neural Networks
- Attention and Memory in Deep Learning and NLP – WildML