前文

今天我和大家聊聊FaceBook的《Convolutional Sequence to Sequence Learning》和Google的《Attention is All You Need》,它们都算是Seq2Seq上的创新,本质上来说,都是抛弃了RNN结构来做Seq2Seq任务。

这篇文章中,笔者对《Attention is All You Need》做一点简单的分析。网上已经有很多解读了(不过很多解读都是直接翻译论文的,鲜有自己的理解),因此这里尽可能多自己的文字,尽量不重复网上各位大佬已经说过的内容。


序列编码


Attention层

① Attention定义



② Multi-Head Attention



③ Self Attention



④ Position Embedding


一些不足之处



代码实现


tensorflow版

下面是tf的实现:

https://github.com/bojone/attention/blob/master/attention_tf.py


Keras版

https://github.com/bojone/attention/blob/master/attention_keras.py


代码测试



计算量分析

可以看到,事实上Attention的计算量并不低。比如Self Attention中,首先要对XX做三次线性映射,这计算量已经相当于卷积核大小为3的一维卷积了,不过这部分计算量还只是O(n)O(n)的;然后还包含了两次序列自身的矩阵乘法,这两次矩阵乘法的计算量都是O(n2)O(n2)的,要是序列足够长,这个计算量其实是很难接受的。

这也表明,restricted版的Attention是接下来的研究重点,并且将Attention与CNN、RNN混合使用,才是比较适中的道路。


结语

感谢Google提供的精彩的使用案例,让我等在大开眼界之余,还对Attention的认识更深一层。Google的这个成果在某种程度上体现了“大道至简”的理念,的确是NLP中不可多得的精品。本文围绕着Google的大作,班门弄斧一番,但愿能够帮助有需要的读者更好的理解Attention。