写在前面

论文题目:

Attention Is All You Need. Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, ?ukasz Kaiser, Illia Polosukhin. NIPS 2017

文章摘要:

这篇文章提出了一个基于 self Attention 的 Encoder-Decoder 模型,在 Attention 领域有承上启下的意义,它既把 NLP 领域的 Attention 推向了一个新的高潮,又为之后 Bert 等 Language model 作了铺垫。

相关链接:

  1. 论文地址
  2. TensorFlow 项目源码
  3. Pytorch 项目源码

1 Encoding 方法

在大型 Language Model 出来之前,NLP 任务中对句子编码的方式一般是先将句子转换为 char-level embedding 或 word-level embedding,然后用 CNN 或 RNN 进行建模,而 Transformer 的提出,提供了多一种 Encoding 的选择。

  • CNN:可捕获局部信息,可并行,相当于深度版的 n-gram 模型,但不具备长距离依赖建模能力,一般用于对句子关键词比较敏感的任务中。
  • RNN:变种有 LSTM/GRU,可为单层或多层,也可为单向或双向,可对长距离依赖进行建模,但无法捕获局部信息,不可并行,一般用于对上下文敏感的任务中。
  • Transformer:应用 self attention 和 position encoding 来捕获局部信息和全局信息,可并行,在大型数据集上一般有比较好的表现。但其主要缺点在于需要很大的存储空间存储所有元素对的对齐分数(alignment scores),对存储空间的需求随序列长度呈二次方增长。

2 Attention 本质

Attention 函数的本质为一个查询(query)到一系列键值对的映射。

Attention 计算可分为三步:

  • 将 query 和每个 key 进行相似度计算得到权重,常用的相似度函数有点积,拼接,感知机等
  • 用 softmax 函数将权重归一化
  • 将权重和相应的键值 value 进行加权求和得到最后的 Attention

关于 Attention 更细致的讲解可见 Attention based model 是什么,它解决了什么问题?

3 Self Attention

传统 Attention 基于 source 端和 target 端的 hidden state 计算 Attention,得到的是源端的每个词与目标端每个词之间的依赖关系。但 Self Attention 则分别在 source 端和 target 端进行。

实际上,在这篇文章出来之前,已经有些文章提出了简单的 self attention,在 A Structured Self-attentive Sentence Embedding 一文中,作者提出了 self attention 的计算方式:

 A = softmax(W_{s2}tanh(W_{s1}H^T))

当然也可以用去掉公式中的一些操作,简化计算。

Attention is all you need 一文中提出的 self attention 如下图所示,它的提出是为了解决机器翻译问题,在 Encoder 和 Decoder 部分都用了 self attention,另外由于 self attention 忽略了位置信息,所以文中还提出了基于三角函数的 position encoding。

Transformer 架构图

Multi-Head Attention 单元更细致的结构如下图所示,其由多个结构相似的 Scaled Dot-Product Attention 单元组成,self attention 也是在 Scaled Dot-Product Attention 单元里面实现的。self attention 的计算过程如下:

  1. 把输入 Input 经过线性变换分别得到 Q、K、V。Q、K、V 都来自于 Input,只不过是线性变换的矩阵的权值不同。这里可通过一个全连接层,将 K、V、Q 映射到维度较低的子空间。
  2. 对 Q 和 K 做 dot Product,得到输入 Input 词与词之间的依赖关系,然后经过尺度变换(scale)、掩码(mask)和 softmax 操作,得到最终的 self attention 矩阵。尺度变换是为了防止输入值过大导致训练不稳定,mask 是为了保证时间的先后关系(用于解码器)。

Attention(Q,K,V)=softmax(frac{QK^T}{sqrt{d_k}})V, where  Q in R^{n 	imes d_k}, K in R^{m 	imes d_k}, V in R^{m 	imes d_v}

如果忽略激活函数 softmax,那么实际上就等价于 n 	imes d_k, d_k 	imes m , m 	imes d_v 三个矩阵相乘,最终结果就是一个 n 	imes d_v 的矩阵。因此可以认为:这个 Attention 层将 n 	imes d_k 的序列 Q 编码成了一个新的 n 	imes d_v 的序列。

所谓「多头」(Multi-Head),就是只多做几次同样的事情(参数不共享),然后把结果拼接。

Multi-Head Attention 单元结构图

self attention 并不能捕捉序列的顺序,即如果将句子中的词序打乱,那么 Attention 的结果还是一样的。这表明了 Attention 模型顶多是一个精妙的「词袋模型」。

而对于 NLP 任务来说,顺序是很重要的信息,它代表著局部甚至是全局的结构,学习不到顺序信息,效果将大打折扣。

于是文章提出了 Position Embedding,即「位置向量」,将每个位置编号,每个编号对应一个向量,通过结合位置向量和词向量(拼接或相加,论文中用的是后者),就给每个词都引入了一定的位置信息,这样 Attention 就可以分辨出不同位置的词了。

4 总结

Transformer 虽然以发布将近两年,但依然被很多人讨论,它提出的思路也被应用到很多工作中。正是因为 Transformer,才有了 Bert 的大放异彩。


推荐阅读:
相关文章