Attention is all you need

Google 的团队抛弃 RNN 和 CNN 的结构使用纯 Attetntion 机制做 Seq2Seq 的任务,并在 WMT 2014 翻译任务上取得 state -of-the-art 的BLEU 分数。

Problems

主流的序列转换模型都是基于 RNN 或 CNN 实现的 encoder-decoder 框架,再结合使用 Attention 机制。然而,RNN 难以处理长序列的句子,无法实现并行,并且面临对齐问题。

Contributions

  • 提出基于 Self-Attention 的 Transformers 模型;
  • 提出 Scaled Dot-Product Attention & Multi-Head Attention

Architecture

Transformer 使用基于 self-attention 和 point-wise 的 encoder-decoder 框架,如图 1 所示:



Encoder:

  • 由 6 个 block 堆叠,每 block 由 multi-head self-attention 和 全连接 feed-forward network(其实就是一个卷积核大小为1的卷积层);
  • 每一个子层都一个 residual connection,之后在接一个 layer normalization;
  • Positional Encoding 输入位置编码。

Decoder:

  • 同样由 6 个层堆叠;
  • Masked Multi-Head Self Attention,采用 0-1 mask 消除右侧单词对当前单词 attention 的影响。


Scaled Dot-Product Attention

定义如下:
$$
Attention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_k}})V \\
Q \in \mathbb{R}^{n \times d_k}, K \in \mathbb{R}^{m \times d_k}, V \in \mathbb{R}^{m \times d_v},
$$
其中 $\sqrt{d_k}$ 起到调节作用,使内积不至于太大,否则 softmax 之后,就非 0 即 1 。这个 Attention 可以理解为,将 $n \times d_k$ 的序列 $Q$ 编码成一个新的 $n \times d_v$ 的序列。

Multi-Head Attention

Multi-Head 就是将上面的 attetion 过程重复 h 次,再把结果拼接起来:
$$
MultiHead(Q,K,V)=Concat(head_1,\cdots,head_h) W^O \\
head_i = Attention(QW_i^Q, KW_i^k,VW_i^V)
$$
这里的多头,有点像 CNN 中多核的概念。

其他细节内容请详看论文!

另外本文的另一大亮点就是 Self-Attention。它表明了内部注意力在机器翻译(甚至是一般的 Seq2Seq 任务)的序列编码上是相当重要的,而之前关于 Seq2Seq 的研究基本都只是把注意力机制用在解码端。文献2中解释得很好。

References

请作者吃酒!