Transformer 结构及其应用详解
引言
在介绍 Transformer 之前,我们先回顾一下 RNN(循环神经网络)的结构。
RNN 存在两个明显的问题:
- 效率问题:需要逐个词进行处理,后一个词要等到前一个词的隐状态输出以后才能开始处理,无法并行。
- 长距离依赖问题:如果传递距离过长,还会有梯度消失、梯度爆炸和遗忘问题。
为了解决这些问题,设计了各种各样的 RNN cell,最著名的两个就是 LSTM(Long Short Term Memory)和 GRU(Gated Recurrent Unit)。但正如业界比喻,给马车换车轮不如直接换成汽车。于是就有了本文的核心——Transformer。
Transformer 是 Google Brain 在 2017 年提出的一篇工作,它针对 RNN 的弱点进行重新设计,解决了 RNN 的效率问题和传递中的缺陷等,在很多问题上超过了 RNN 的表现。Transformer 的基本结构是一个 N 进 N 出的结构,每个 Transformer 单元相当于一层的 RNN 层,接收一整个句子所有词作为输入,然后为句子中的每个词都做出一个输出。与 RNN 不同的是,Transformer 能够同时处理句子中的所有词,并且任意两个词之间的操作距离都是 1,很好地解决了效率问题和距离问题。

每个 Transformer 单元都有两个最重要的子层,分别是 Self-Attention 层与 Feed Forward 层。文章使用 Transformer 搭建了一个类似 Seq2Seq 的语言翻译模型,并为 Encoder 与 Decoder 设计了两种不同的 Transformer 结构。
Decoder Transformer 相对于 Encoder Transformer 多了一个 Encoder-Decoder Attention 层,用来接收来自于 Encoder 的输出作为参数。最终只要按照下图的方式堆叠,就可以完成 Transformer Seq2Seq 的结构搭建。

工作流程示例
举个例子介绍下如何使用这个 Transformer Seq2Seq 做翻译:
- Transformer 对原语言的句子进行编码,得到 memory。
- 第一次解码时输入只有一个标志,表示句子的开始。
- 解码器通过这个唯一的输入得到的唯一的输出,用于预测句子的第一个词。
- 第二次解码,将第一次的输出 Append 到输入中,输入就变成了和句子的第一个词 (ground truth 或上一步的预测),解码生成的第二个输出用于预测句子的第二个词。以此类推。
了解了 Transformer 的大致结构后,接下来看看详细结构。
Transformer 核心组件
Self Attention
Self Attention 就是句子中的某个词对于本身的所有词做一次 Attention。算出每个词对于这个词的权重,然后将这个词表示为所有词的加权和。每一次的 Self Attention 操作,就像是为每个词做了一次 Convolution 操作或 Aggregation 操作。
具体操作如下:首先,每个词都要通过三个矩阵 Wq, Wk, Wv 进行一次线性变化,一分为三,生成每个词自己的 query, key, vector 三个向量。以一个词为中心进行 Self Attention 时,都是用这个词的 key 向量与每个词的 query 向量做点积,再通过 Softmax 归一化出权重。然后通过这些权重算出所有词的 vector 的加权和,作为这个词的输出。
归一化之前需要通过除以向量的维度 dk 来进行标准化,所以最终 Self Attention 用矩阵变换的方式可以表示为: $$\text{Attention}(Q, K, V) = \text{softmax}(\frac{QK^T}{\sqrt{d_k}})V$$
最终每个 Self Attention 接受 n 个词向量的输入,输出 n 个 Aggregated 的向量。


