一、引言
2017年,由Vaswani等人在论文《Attention Is All You Need》中首次提出的Transformer模型彻底改变了自然语言处理(NLP)领域的范式。这篇论文不仅引领了深度学习模型的演进方向,更是开创了一系列技术创新,如BERT、GPT系列模型等。理解这篇论文的核心思想,对于深入学习和应用Transformer及其衍生模型至关重要。
二、背景与动机
在Transformer提出之前,RNN(Recurrent Neural Networks)及其变种LSTM(Long Short-Term Memory)和GRU(Gated Recurrent Unit)在处理序列数据时占据主导地位。然而,RNN架构存在以下主要问题:
- 计算复杂度高:RNN在处理长序列时,其前后状态依赖关系(计算第 t t t 个状态依赖于第 t − 1 t - 1 t−1个状态)使得并行化困难,计算效率低。
- 长期依赖问题:RNN在建模长距离依赖时表现不佳,由于模型的历史信息是一步一步往后传递的, 如果时序比较长的话,那么很早期的时序信息有可能丢失。
Transformer模型的提出正是为了解决这些问题,其核心理念是用自注意力机制(Self-Attention)替代RNN结构,从而提高模型的并行性和处理长序列依赖的能力。
三、Transformer架构解析
Transformer模型由编码器(Encoder) 和解码器(Decoder) 两部分组成。编码器将输入序列映射为隐藏表示,解码器则将这些表示转换为目标输出序列。
编码器和解码器都由多个相同的层(Layers)堆叠而成,编码器层和解码器层的结构虽然相似,但解码器层比编码器层多一个用于处理目标序列与编码器输出之间依赖关系的组件。
Transformer架构由以下主要部分组成:
-
编码器(Encoder):由 N N N层编码器堆叠组成,每一层包含两个子层:
- 多头自注意力机制(Multi-Head Self-Attention)
- 前馈神经网络(Feed-Forward Neural Network, FFN)
-
解码器(Decoder):由 N N N层解码器堆叠组成,每一层包含三个子层:
- 多头自注意力机制(Masked Multi-Head Self-Attention)
- 多头编码器-解码器注意力机制(Multi-Head Encoder-Decoder Attention)
- 前馈神经网络(Feed-Forward Neural Network, FFN)
-
残差连接(Residual Connection)和层归一化(Layer Normalization):用于每个子层之后以保持信息流通顺畅。
-
位置编码(Positional Encoding):为输入序列引入位置信息。
自注意力机制(Self-Attention Mechanism)
自注意力机制是Transformer的核心思想之一。它的目标是根据输入序列中的每个位置(即词或子词)的上下文信息生成新的表示。其主要操作包括计算查询(Query)、键(Key)和值(Value),然后利用这些向量计算注意力分数。
我们输入的只是一串字符,这里首先需要每个词转成我们后续可以进行操作的词向量,需要进行embedding操作,可以理解为把一个词如 love 转换为对应的词向量序列如 [ 1 , 3 , 0 , 5.. ] [1, 3, 0, 5..] [1,3,0,5..],当然为了获取词在输入序列中的位置信息,我们在后续的transformer中增加了对应词的位置信息(positional encoding)。
-
输入表示:假设输入序列为长度为 n n n的词嵌入(word embedding)向量序列 X = ( x 1 , x 2 , … , x n ) X = (x_1, x_2, \dots, x_n) X=(x1,x2,…,xn),每个词嵌入的维度为 d d d。
-
查询、键和值的计算:通过三个不同的线性变换,将输入向量 X X X 映射到查询矩阵 Q Q Q、键矩阵 K K K 和值矩阵 V V V:
Q = X W Q , K = X W K , V = X W V Q = XW_Q, \quad K = XW_K, \quad V = XW_V Q=XWQ,K=XWK,V=XWV
其中, W Q , W K , W V W_Q, W_K, W_V WQ,WK,WV 是分别用于生成查询、键和值的权重矩阵,其维度分别为 d × d k d \times d_k d×dk, d × d k d \times d_k d×dk, d × d v d \times d_v d×dv。(通常 d k = d v = d / h d_k = d_v = d / h dk=dv=d/h,其中 h h h 是注意力头的数量。)
最开始的 W W W权值矩阵需要初始化,在后续BP的过程中, W W W 的具体数值会不断更新学习,这样做的好处不仅仅是可以提高模型的非线性程度,还能提高模型拟合能力,通过不断学习让注意力权值正确分布。 -
注意力分数的计算:注意力分数通过查询和键的点积计算得到:
Attention ( Q , K , V ) = softmax ( Q K ⊤ d k ) V \text{Attention}(Q, K, V) = \text{softmax}\left( \frac{QK^\top}{\sqrt{d_k}} \right)V Attention(Q,K,V)=softmax(dkQK⊤)V
其中, Q K ⊤ QK^\top QK⊤ 是查询和键的点积。内积(点乘)的几何意义包括:
- 表征或计算两个向量之间的夹角
-
a
a
a 向量在
b
b
b 向量方向上的投影
两向量相乘得一新的向量,即 A B = C AB=C AB=C,那么这个新的向量 C C C就在一定个程度上代表向量 A A A对向量 B B B的投影大小
换个角度思考,投影度大小即输入序列中对应词与词的相关度,投影度越大(夹角越小),意味着在一定程度上两个词之间的相关度越大(词向量是文本形式的词在高维空间(抽象化)的数值形式映射)。也就是说 Q K T Q K^T QKT的结果实际上是Query向量和Key向量的相似度矩阵。
d k \sqrt{d_k} dk 是缩放因子,用于防止点积结果过大。如果矩阵中元素的方差很大,这就会使得softmax的分布变得极其陡峭,从而影响梯度稳定计算,此时我们进行一次缩放,再将方差缩放到1,softmax的分布变得平缓稳定起来,进而在之后的训练过程中保持梯度稳定。
softmax函数将每个位置的分数归一化为概率,使得权重和为1,我们只需将得到的权重乘以原来的 V V V,即可得到最终的输出,这个输出经过了一次词与词之间相关度(也就是注意力)的计算。
多头注意力机制(Multi-Head Attention)
为了增强模型的表达能力,Transformer引入了多头机制,将输入向量分为多个子空间并行计算自注意力:
MultiHead
(
Q
,
K
,
V
)
=
Concat
(
head
1
,
…
,
head
h
)
W
O
\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h)W_O
MultiHead(Q,K,V)=Concat(head1,…,headh)WO
其中每个头的计算为:
head
i
=
Attention
(
Q
W
Q
i
,
K
W
K
i
,
V
W
V
i
)
\text{head}_i = \text{Attention}(QW_Q^i, KW_K^i, VW_V^i)
headi=Attention(QWQi,KWKi,VWVi)
最后通过拼接所有注意力头并乘以线性变换权重
W
O
W_O
WO 得到多头注意力的结果。
前馈神经网络(Feed-Forward Neural Network, FFN)
前馈神经网络应用于自注意力机制之后的输出,其结构非常简单,由两个全连接层组成,中间加上ReLU激活函数:
FFN
(
x
)
=
max
(
0
,
x
W
1
+
b
1
)
W
2
+
b
2
\text{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2
FFN(x)=max(0,xW1+b1)W2+b2
其中,
W
1
W_1
W1 和
W
2
W_2
W2 是权重矩阵,
b
1
b_1
b1 和
b
2
b_2
b2 是偏置向量。
添加这一层的目的也是为了增加模型的非线性表达能力,提高模型拟合程度。
位置编码(Positional Encoding)
由于自注意力机制不具备处理序列位置信息的能力,Transformer通过位置编码引入位置信息。位置编码是一种向量,它与输入词向量相加,以确保模型能够感知输入序列的顺序。
P E ( p o s , 2 i ) = sin ( p o s 1000 0 2 i d ) PE_{(pos, 2i)} = \sin\left( \frac{pos}{10000^{\frac{2i}{d}}} \right) PE(pos,2i)=sin(10000d2ipos)
P E ( p o s , 2 i + 1 ) = cos ( p o s 1000 0 2 i d ) PE_{(pos, 2i+1)} = \cos\left( \frac{pos}{10000^{\frac{2i}{d}}} \right) PE(pos,2i+1)=cos(10000d2ipos)
其中, p o s pos pos 是词的位置, i i i 是嵌入维度的索引。该编码可以与输入词向量相加,以引入位置信息。
残差连接和层归一化(Residual Connection and Layer Normalization)
为了防止梯度消失和梯度爆炸,Transformer在每个子层之后都引入了残差连接,并对结果进行层归一化。这种设计使得信息能够更有效地在深层网络中传播。
Masked Multi-Head Attention
需要注意的是在训练阶段中,Decoder部分输入的数据是一整句,而解码器中的第一个注意力子层是Masked Multi-Head Attention,其目的就是在自注意力计算中遮蔽未来的位置,确保在预测下一个词时只能看到之前的词。具体做法实现是将未来词的位置的注意力分数设置为负无穷,以避免对这些位置的注意。
只需要初始化一个下三角矩阵为0,上三角元素均为负无穷的矩阵加到注意力矩阵上,因为注意力需要经过softmax进行归一化,所以只能让这个值尽可能小,从而将未来信息抹去。
Multi-Head Encoder-Decoder Attention
解码器的第二个注意力子层用于在生成过程中关注编码器的输出。该注意力机制的查询来自解码器的上一个子层,而键和值来自编码器的输出。
四、Transformer的优势
-
并行计算:由于Transformer不依赖序列顺序进行计算,它可以同时处理输入序列的所有位置,从而显著提高了计算效率,特别是在训练阶段。
-
长距离依赖建模:自注意力机制能够直接访问输入序列中所有位置的上下文信息,这使得Transformer在建模长距离依赖时表现优异。
-
灵活性:Transformer模型不仅适用于自然语言处理,还能扩展到其他序列建模任务,如图像处理、时间序列预测等。
五、Transformer的局限性与挑战
尽管Transformer在多个任务中取得了卓越的成绩,但它仍然存在一些局限性:
-
计算资源消耗大:Transformer的自注意力机制计算复杂度为O(n^2),对于长序列处理而言,计算和内存需求非常高。
-
缺乏位置感知能力:尽管位置编码解决了部分序列位置信息的问题,但Transformer在处理极长序列时仍存在一定的挑战。
-
数据依赖:Transformer模型需要大量数据进行训练,以便充分学习注意力机制中的模式。对于数据稀缺的任务,模型的性能可能不如传统方法。
六、总结与展望
《Attention Is All You Need》这篇论文奠定了Transformer模型的基础,为深度学习的发展提供了新的方向。Transformer通过自注意力机制和并行化处理显著提升了计算效率和模型性能。然而,Transformer的广泛应用也带来了新的挑战,如计算资源的消耗和对长序列的处理能力等。
随着技术的不断发展,研究人员已经提出了诸如Efficient Transformer、Reformer等变种,旨在提升Transformer的效率和适应性。