一文读懂「Attention is All You Need」| 附代码实现

前言

2017 年中,有两篇类似同时也是笔者非常欣赏的论文,分别是 FaceBook 的Convolutional Sequence to Sequence Learning和 Google 的Attention is All You Need,它们都算是 Seq2Seq 上的创新,本质上来说,都是抛弃了 RNN 结构来做 Seq2Seq 任务。

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

序列编码

深度学习做 NLP 的方法,基本上都是先将句子分词,然后每个词转化为对应的词向量序列。这样一来,每个句子都对应的是一个矩阵 X=(x1,x2,…,xt),其中 xi 都代表着第 i 个词的词向量(行向量),维度为 d 维,故

。这样的话,问题就变成了编码这些序列了。


第一个基本的思路是 RNN 层,RNN 的方案很简单,递归式进行:

不管是已经被广泛使用的 LSTM、GRU 还是最近的 SRU,都并未脱离这个递归框架。RNN 结构本身比较简单,也很适合序列建模,但 RNN 的明显缺点之一就是无法并行,因此速度较慢,这是递归的天然缺陷。

另外我个人觉得RNN 无法很好地学习到全局的结构信息,因为它本质是一个马尔科夫决策过程

第二个思路是 CNN 层,其实 CNN 的方案也是很自然的,窗口式遍历,比如尺寸为 3 的卷积,就是:

在 FaceBook 的论文中,纯粹使用卷积也完成了 Seq2Seq 的学习,是卷积的一个精致且极致的使用案例,热衷卷积的读者必须得好好读读这篇文论。

CNN 方便并行,而且容易捕捉到一些全局的结构信息,笔者本身是比较偏爱 CNN 的,在目前的工作或竞赛模型中,我都已经尽量用 CNN 来代替已有的 RNN 模型了,并形成了自己的一套使用经验,这部分我们以后再谈。

Google的大作提供了第三个思路:纯 Attention,单靠注意力就可以。

阅读原文

你可能感兴趣的:(一文读懂「Attention is All You Need」| 附代码实现)