Transformer 论文阅读
一、背景
NLP 领域模型主要有三种经典架构:自 CV 领域沿袭而来的卷积神经网络(CNN)、用于序列类任务的循环神经网络(RNN)(包括其变体 LSTM)、在 NLP 任务中表现良好具有独特优势的注意力机制(attention)。在2017年以前,以序列类任务为主流的 NLP 领域还是循环神经网络及其变体的天下,其具有的时序特征捕捉、序列到序列转换能力使其成为各个任务中的第一选择。
2017年,Vaswani 等人在 NLP 领域顶级会议上发表了论文《Attention Is All You Need》,提出了 NLP 历史上里程碑的模型——Transformer。Transformer 创造性地抛弃了经典的 CNN、RNN 结构,仅使用 attention 机制和全连接网络搭建,在序列到序列(Seq2Seq)任务上取得了良好效果,以更小的时间成本达到了更高的 the-state-of-art 效果。自 Transformer 始,attention 机制取代了 RNN 的主流地位,成为了新一代的霸主。例如效果优越、具有开创性的预训练模型 BERT,其即使用了 Transformer 的模型架构,在17个 NLP 任务中达到最佳性能。
本文阅读并总结了该经典论文,并详细介绍了 Transformer 的原理及架构。
二、目的
RNN 及其变体 LSTM 在很长一段时间中占据了 NLP 领域的主流地位。与以分类任务为主的 CV 不同,NLP 任务最重要的任务形式即序列到序列,包括机器翻译、语义标注、阅读理解等,都需要实现 Seq2Seq 任务。由于 CNN 结构并不能很好地捕捉序列时间信息,RNN 凭借其捕捉时序信息、适合序列生成的优点成为了 NLP 任务的首选甚至是唯一选择。
但 RNN 及 LSTM 虽然在众多任务中表现良好,却有两个难以弥补的缺陷:
① 序列依序计算的模式能够很好地模拟时序信息,但限制了计算机并行计算的能力。由于序列需要依次输入、依序计算,GPU 并行计算的能力受到了极大限制,导致 RNN 为基础架构的模型虽然参数量不算特别大,但计算时间成本却很高。
② RNN 难以捕捉长序列的相关关系。在 RNN 架构中,距离越远的输入之间的关系就越难被捕捉,同时 RNN 需要将整个序列读入内存依次计算,也限制了序列的长度。虽然 LSTM 中通过门机制对此进行了一定优化,但对于较远距离相关关系的捕捉,RNN 依旧是不如人意的。
针对上述问题,作者吸取了在前人工作中常常被融入 RNN 架构的 attention 机制,搭建了一个完全由 attention 机制构成,摒弃了 CNN、RNN 结构的新模型,证明了 attention 机制在 Seq2Seq 任务中的独特优势,解决了上述两个问题。
三、Seq2Seq
Seq2Seq 任务是 NLP 领域新兴的,更适用于阅读理解、机器翻译等高级 NLP 任务的任务类型。Seq2Seq 模型一般有着固定架构,即 Encoder-Decoder (编码器-解码器)架构。
一般而言 ,Encoder 用于将输入的符号序列编码成向量序列。
E
n
c
o
d
e
r
(
x
)
=
z
x
=
(
x
1
,
x
2
,
.
.
.
x
n
)
z
=
(
z
1
,
z
2
,
.
.
.
z
n
)
Encoder(x) = z\\ x = (x_1, x_2, ...x_n)\\ z = (z_1, z_2, ...z_n)
Encoder(x)=zx=(x1,x2,...xn)z=(z1,z2,...zn)
其中,x 为输入的符号序列,例如通过 one-hot 编码之后的输入文本。z 为 Encoder 编码后的向量序列。
Decoder 则用于将 Encoder 编码出的向量序列解码成输出的符号序列。
D
e
c
o
d
e
r
(
z
)
=
y
z
=
(
z
1
,
z
2
,
.
.
.
z
n
)
y
=
(
y
1
,
y
2
,
.
.
.
y
m
)
Decoder(z) = y\\ z = (z_1, z_2, ...z_n)\\ y = (y_1, y_2, ...y_m)
Decoder(z)=yz=(z1,z2,...zn)y=(y1,y2,...ym)
y 为 Decoder 解码后的符号序列,即 Seq2Seq 任务的输出。注意,y 和 x 不一定长度相同。
四、模型架构
针对 Seq2Seq 任务特点,结合 RNN 结构的缺陷,作者完全使用 attention 机制搭建了 Transformer 模型,模型的主要结构如下:
如图,Transformer 同样沿用了 Encoder-Decoder 架构,在其内部通过多头注意力机制搭建,并无卷积层或者隐含层。接下来依次介绍其各组件。
1. attention 机制
attention 机制最初也是在 CV 领域被使用,在 NLP 领域被发扬光大,其特点为通过计算查询值与键值的相关性为真值加权求和,从而拟合序列中每个词同其他词的相关关系。其大致计算过程为:
① 通过输入与参数矩阵,得到查询值 q,键值 k,真值 v,其中,v 与 k 的长度相等。可以理解为,q 是计算注意力的另一个句子(或词组),v 为待计算句子,k 为待计算句子中每个词(即 v 的每个词)的对应键。
② 对 q 的每个元素 qi ,对 qi 与 k 做点积并进行 softmax,得到一组向量,该向量揭示了 qi 对整个句子每一个位置的注意力大小。
③ 以上一步输出向量作为权重,对 v 进行加权求和,将 q 的所有元素得到的加权求和结果拼接得到最后输出。
在实际训练过程中,为提高并行计算速度,直接使用 q、k、v 拼接而成的矩阵进行一次计算即可。
具体到 Transformer 模型中,计算公式如下:
A
t
t
e
n
t
i
o
n
(
Q
,
K
,
V
)
=
s
o
f
t
m
a
x
(
Q
K
T
d
k
)
V
Attention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_k}})V
Attention(Q,K,V)=softmax(dkQKT)V
其中,dk 为模型维度,除以根号 dk 主要作用是归一化减小维度,提高训练过程中的梯度。
通过上述计算机制可以看出,attention 机制可以拟合两个序列中每个词的相关关系,从而实现了并行计算拟合长序列相关关系的效果。
2. self-attention 与 multi-head attention
self-attention(自注意机制)是 attention 机制的最常用变体,即 Q、K、V 都通过同一个输入计算得到,从而拟合的相关关系是同一个序列中每个词同序列其他词的相关关系,实现了序列自身的关系拟合。
multi-head attention(多头注意力机制)也是 attention 机制的变体之一。普通的 attention 机制虽然能够拟合词之间的相关关系,但由于参数固定,只能拟合一种关系,表达能力有限。为提升拟合能力,使用多个头对一个序列进行注意力计算,即使用不同的参数多次计算一个序列,从而拟合序列中的多种注意力关系,能够取得较好的拟合效果。
在 Transformer 中,都使用了 multi-head attention 代替了基本的 attention。
3. 位置向量
由于 attention 机制会捕捉全局词之间的相关关系,就丢失了词相对位置信息,这是 attention 机制相较于 RNN 的一大劣势。为保留相对位置信息,Transformer 首先对序列进行了位置编码,然后将位置编码加入到输入中。位置编码有很多方式,只要能够保留词之间的相对位置信息即可。在 Transformer 中,使用的位置编码方式为:
P
E
(
p
o
s
,
2
i
)
=
s
i
n
(
p
o
s
/
1000
0
2
i
/
d
m
o
d
e
l
)
P
E
(
p
o
s
,
2
i
+
1
)
=
c
o
s
(
p
o
s
/
1000
0
2
i
/
d
m
o
d
e
l
)
PE(pos, 2i) = sin(pos/10000^{2i/d_{model}})\\ PE(pos, 2i+1) = cos(pos/10000^{2i/d_{model}})
PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)
可以看出,该方法是分别对奇数位词和偶数位词使用 sin 函数和 cos 函数进行位置编码。
位置向量如何加入到输入的方法也很多,在 Transformer 中,使用了最基本的词袋方法,即直接与输入序列求和。
4. Encoder 与 Decoder
如上所属,Encoder 主要用于对输入进行编码。在 Transformer 中,Encoder 由两个子层构成。
第一个子层为 multi-head self-attention 层,即使用多头注意力机制对输入向量进行注意力计算,再进行标准化。
第二个子层为全连接网络,输入为 multi-head self-attention 层的输出,同样会对输出进行标准化。
类似,Decoder 也完全由 attention 机制构成,同 Encoder 结构不同点在于 Decoder 有三个子层。
第一个子层同 Encoder 一样为 multi-head self-attention 层。
第二个子层则是一个 multi-head attention 层,取 Encoder 的输出计算 Q, 取上一个子层的输出计算 K 与 V,接着进行注意力计算与标准化。
第三个子层就同 Encoder 的第二个子层相同为全连接网络。
5. 残差连接
Transformer 使用了残差连接(residual connection)来连接 Encoder 与 Decoder 中的各个子层。残差连接的思想为允许最底层信息直接传到最高层,让高层专注于残差的学习,避免模型的退化。
例如,在 Encoder 中,在第一个子层,输入进入多头自注意力层的同时会直接传递到该层的输出,然后该层的输出会与原输入相加,再进行标准化。在第二个子层也是一样。即:
o
u
t
p
u
t
=
L
a
y
e
r
N
o
r
m
(
x
+
S
u
b
l
a
y
e
r
(
x
)
)
output = LayerNorm(x + Sublayer(x))
output=LayerNorm(x+Sublayer(x))
LayerNorm 为该层的标准化操作,Sublayer 为该子层的操作(多头注意力计算或全连接计算)。
6. 整体模型
Transformer 整体便由上述组件组合而成。整个 Transformer 网络有 N(论文中取 N=6)个 Encoder 与 N 个 Decoder,原序列输入 Encoder 进行计算,Encoder 的输出与输出序列一起在 Decoder 中进行解码,最后通过 softmax 计算输出序列概率。
Transformer 是一个自回归模型,因此在训练时,输出序列会进行遮蔽,从而保证使用历史信息预测未来信息。具体而言,在训练时,原序列会直接输入 Encoder,输出序列则会右移一位,在计算中被遮蔽,模型将使用原序列与输出序列的历史信息依次生成输出概率,例如通过 x1 生成 x2,通过 x1 与 x2 生成 x3 等。
特别的,Transformer 使用了 teacher forcing 机制,即无论模型预测的输出是什么,下一个预测时使用的都是真实的历史输出,从而实现了并行化,实际无需一个个依次预测,一次并行生成全部输出即可。
四、写在最后
在论文的后半部分,作者还介绍了 Transformer 在机器翻译等任务上取得的良好效果,证明了 Transformer 的优越性能,同时也据此论述了 attention 机制的优点。总结来说,便是针对了 RNN 的上述两点不足。自 Transformer 始,attention 机制成为了 NLP 领域最热门的机制,例如 BERT、XLNet 等众多预训练模型都基于 Transformer 架构实现。
不过,论文题为《Attention Is All You Need》,意在揭示 attention 机制的优越性并完全抛弃 RNN、CNN 架构。此文虽然具有里程碑意义,但也引起众多学者对此进行辩驳,以证明 attention 机制虽好,RNN、CNN 等传统架构却也并不能够被抛弃。辩驳的条理性暂不论,但时至今天,事实证明我们确实不仅需要 attention 机制,RNN 尤其是 LSTM 等传统架构仍然在一些最新、最优越模型中发挥着重要作用。