Transformer:Attention Is All You Need
论文名称:Attention Is All you Need
作者:Ashish Vaswani,Noam Shazeer,Niki Parmar,Jakob Uszkoreit,Llion Jones,Aidan N. Gomez,Łukasz Kaiser,Illia Polosukhin
code:https://github.com/jadore801120/attention-is-all-you-need-pytorch
前言
基于 RNN 或 CNN 的 Encoder-Decoder 模型在 NLP 领域占据大壁江山,然而她们也并非是完美无缺的:
- LSTM,GRU 等 RNN 模型受限于固有的循环顺序结构,无法实现并行计算,在序列较长时,计算效率尤其低下,虽然最近的工作如因子分解技巧 1,条件计算 2在一定程度上提高了计算效率和性能,但是顺序计算的限制依然存在;
- Extended Neural GPU3, ByteNet 4,和 ConvS2S 5 等 CNN 模型虽然可以进行并行计算,但是学习任意两个位置的信号的长距离关系依旧比较困难,其计算复杂度随距离线性或对数增长。
而谷歌选择抛弃了主流模型固有的结构,提出了完全基于注意力机制的 Transformer,拥有其他模型无法比拟的优势:
- Transformer 可以高效的并行训练,因此速度十分快,在8个 GPU 上训练了3.5天;
- 对于长距离关系的学习,Transformer 将时间复杂度降低到了常数,并且使用多头注意力来抵消位置信息的平均加权造成的有效分辨率降低
- Transform 是一种自编码(Auto-Encoding)模型,能够同时利用上下文
整体结构
Transformer 的整体结构是一个 Encoder-Decoder,自编码模型主要应用于语意理解,对于生成任务还是自回归模型更有优势

我们可以将其分为四个部分:输入,编码块,解码块与输出

接下来让我们按照顺序来了解整个结构,希望在阅读下文前你可以仔细观察这幅图,阅读时也请参考该图
输入
使用 nn.Embedding
进行 Word Embedding,论文中嵌入维度
在嵌入时,左右两部分的权重会共享
得到词嵌入向量后需要乘以 ,其原因可能是为了相对减小位置编码的影响
同时会将上一层的输出加入进来,网络的第一层则会直接使用 Inputs 充当“上一层”
在输入之后会进行位置编码,使得 Transformer 拥有捕捉序列顺序的能力
Encoder-Decoder
整体结构如图

Encoder-Decoder 的内部结构如下图:

-
Encoder:编码块是由6个完全相同的 layer 组成的,每个 layer 有两个子层
第一层包括一个 、 和残差连接
第二层包括一个二层的全连接前馈层: ,中间层的维度为2048;同样包含 和残差连接
-
Decoder:解码块同样由6个完全相同的 layer 组成,每个子层同样有残差连接和
额外添加了第三个子层—— ,这是针对于上一层输出的,将在下文详细解读
此外,还修改了子注意力子层(如上图,由原来的 Self-Attention 变 Encoder-Decoder Attention)
Layer Normalization:NLP 任务中主要使用 而不是 ,因为在批次上进行归一化会混乱不同语句之间的信息,我们需要在每个语句之中进行归一化。
输出
对解码器的输出使用普通的线性变化与 ,作为下一层的输入
注意力机制
Self-Attention
具体内容可参考我的另一篇博客——注意力机制
缩放点积注意力
缩放点积注意力,图式如下:
其公式为
缩放点积指的是其中的打分函数
常见的注意力模型有加性模型和点积模型,点积模型相较于加性模型效率更高,但是当输入向量维度过高,点积模型通常有较大的方差,从而导致softmax函数梯度很小,而缩放点积模型可以很好地解决这个问题。
另为,Transformer 在实现过程中使用了残差连接
我们知道,的作用是拉大数据之间的差距
对于一组数据,让我们给其赋不同的值,来观察方差和的变化
import numpy as np
x = np.array([np.exp([i, i, 2*i]) for i in [1, 10, 100]])
print(np.square(np.linalg.norm(x, axis=1, ord=2))) # 方差S
print(x[:, 2]/x.sum(axis=1).T) # S3
即使数据之间成比例,在数量级较大时,Softmax将几乎全部的概率分布都分配给了最大的那个数
Softmax 的梯度为
当出现上述的情况时,softmax 会输出一个近似 one-hot 的向量 ,此时梯度为
缩放点积为什么有效?
在论文的注脚中给出了如下假设:
**假设向量 和 的各个分量是互相独立的随机变量,均值是0,方差是1,那么点积 的均值是0,方差是 **
具体推理过程可参考我的另一篇博客概率论 2.3.5和2.3.6节
我们在高二就学过方差的一个基本性质,对于随机变量
所以除以 可以将方差控制为1,从而有效地解决梯度消失的情况
Multi-Head Attention
多头注意力,图式如下
相比于使用 维数(此处为512维)的 来执行一个 ,使用不同的线性映射得到多个 来并行得执行 效果更佳,原因如下:
- 其增强了模型专注于不同信息的能力
- 为注意力层提供了多个“表示子空间”
具体操作:
对于每一个头,我们使用一套单独的权重矩阵 ,并且将其维度降至
生成 H 个不同的注意力矩阵,将其拼接在一起
最后使用一个单独的权重矩阵 得到最终的注意力权重
由于维度做了缩放,多头注意力的总代价和仅使用一个注意力的代价相近
与卷积的关系:
我们可以发现,多头注意力实际上与卷积有着异曲同工之妙
正如多个头可以注意不同的信息,不同的卷积核可以提取图像中不同的特征
同样,正如特征图多个通道内的信息冗余,多头注意力也存在着信息冗余