引言:颠覆NLP领域的新架构
2017年,一篇名为《Attention Is All You Need》的论文横空出世,正如其标题所揭示的,它宣告了一个仅凭"注意力机制"就能独当一面的新时代。这篇论文介绍的Transformer模型,彻底颠覆了当时自然语言处理(NLP)领域的格局。
在Transformer出现之前,序列建模任务(如机器翻译)一直由循环神经网络(RNN)及其变体(如长短期记忆网络LSTM)所主导。然而,这类模型存在一个根本性的瓶颈:它们的计算过程具有"内在的顺序性"(inherently sequential nature)。这意味着模型必须按顺序处理序列中的每一个词,这种机制严重限制了计算的并行性,也使得学习长距离的词语依赖关系变得异常困难。
为了解决这一问题,研究者们提出了Transformer------一个完全摒弃了循环和卷积结构,完全基于注意力机制(based solely on attention mechanisms)的新型网络架构。它不仅在性能上超越了以往所有的模型,更凭借其出色的并行计算能力,极大地缩短了训练时间。论文指出,Transformer模型"可以在八块P100 GPU上仅训练十二个小时"就能达到当时最先进的翻译质量。
本文将遵循原论文的脉络,从整体架构、核心机制到关键组件,为您深入浅出地解析Transformer的精髓。
1. Transformer的整体架构:宏观视角
从宏观上看,Transformer遵循了当时主流序列建模任务中非常成熟的编码器-解码器(Encoder-Decoder)结构。

如上图所示,模型的左半部分是编码器,右半部分是解码器。
编码器(Encoder)
编码器的核心任务是将输入的符号序列 (x1, ..., xn) 映射成一个连续的向量表示 z = (z1, ..., zn)。这个 z 包含了输入序列的全部信息。
为了实现这一目标,编码器由N=6个完全相同的层堆叠而成。每一层又包含两个核心的子层:
- 多头自注意力机制(multi-head self-attention) :负责捕捉输入序列内部的依赖关系。
- 简单的、按位置的全连接前馈网络(position-wise fully connected feed-forward network) :对注意力层的输出进行非线性变换。
值得注意的是,在每个子层的周围,都使用了一个残差连接(residual connection)和层归一化(layer normalization)操作,这有助于稳定训练过程并提升模型性能。
解码器(Decoder)
解码器的任务则是在接收编码器输出的 z 之后,生成一个输出符号序列 (y1, ..., ym)。它也同样由N=6个相同的层堆叠而成。
解码器的每一层在编码器两个子层的基础上,额外插入了第三个子层:
- 带掩码的多头自注意力机制(Masked Multi-Head Attention) :与编码器类似,但通过掩码(masking)来"防止位置关注到后续位置"(prevent positions from attending to subsequent positions)。这种掩码机制,结合训练时将输出嵌入向右偏移一个位置的做法,共同确保了在预测第
i个词时,只能依赖于i之前的输出,从而保证了模型的自回归(auto-regressive)特性。 - 编码器-解码器多头注意力(Encoder-Decoder Multi-Head Attention) :这一层执行多头注意力机制,但其查询(queries)来自前一个解码器子层,而键(keys)和值(values)则来自编码器的最终输出。这使得解码器在生成每个词时都能关注到输入序列的全部信息。
- 按位置的全连接前馈网络:结构和作用与编码器中的相同。
同样,解码器中的每个子层也采用了残差连接和层归一化。
2. 核心机制:深入理解注意力
既然注意力(Attention)是Transformer的唯一核心,那么它究竟是如何工作的呢?
2.1 什么是注意力?
论文中将注意力机制描述为一个映射过程:它将一个查询(Query)和一组键值对(Key-Value pairs)映射到一个输出。
可以这样理解:
- Query (Q) :代表当前需要关注的焦点。
- Key (K) :代表序列中可供注意的各个元素。
- Value (V) :代表这些元素实际包含的信息。
注意力的输出是所有值(Values) 加权和(weighted sum) 。而每个值对应的权重,则是由查询(Query)与它对应的 键(Key)通过一个兼容性函数(compatibility function)计算得出的。简单来说,就是Q和K越匹配,对应V的权重就越大。
2.2 缩放点积注意力 (Scaled Dot-Product Attention)
Transformer中使用的具体注意力实现被称为"缩放点积注意力"。
其计算过程可以分解为以下四步:
- 计算点积:计算查询(Q)与所有键(K)的点积,得到它们之间的相似度分数。
- 缩放 :将上一步得到的所有分数除以一个缩放因子
√dk(其中dk是键向量的维度)。论文的脚注解释了为何需要缩放:当dk的值较大时,点积的结果量级会变得很大,这会将Softmax函数推向梯度极小的区域,不利于模型训练。缩放操作可以有效缓解这个问题。 - Softmax归一化:将缩放后的分数输入Softmax函数,得到范围在0到1之间的权重。所有权重之和为1。
- 加权求和:用这些权重乘以对应的值(V),然后将它们相加,得到最终的注意力输出。
整个过程可以用一个简洁的公式来表示: Attention(Q, K, V) = softmax( (QK^T) / √dk ) V
2.3 多头注意力 (Multi-Head Attention)
论文作者发现,与其用d_model(模型维度,如512)维度的Q、K、V执行一次注意力计算,不如将它们分别进行h次线性投影,变换到更低的维度(dk, dk, dv),然后并行地执行h次注意力计算。
这个过程如下:
- 将原始的Q、K、V通过不同的线性变换(权重矩阵不同)投影
h次。 - 并行地对这
h组投影后的Q、K、V分别执行一次"缩放点积注意力"计算。 - 将
h个注意力计算的输出结果拼接(concatenate)起来。 - 将拼接后的结果再次进行一次线性投影,得到最终的输出。
这种机制的好处在于,正如论文所说:"多头注意力允许模型在不同位置共同关注来自不同表示子空间的信息。"(Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions.)换句话说,不同的"头"(head)可以学习关注不同方面的信息,比如有的头关注语法结构,有的头关注语义关联,从而增强了模型的表达能力。
在论文中,作者使用了h=8个并行的注意力头。对于维度为512的d_model,每个头处理的维度被缩小为dk = dv = 512/8 = 64。这清晰地体现了将一个大问题分解为多个小问题并行处理的思想。
3. 注意力在Transformer中的三大应用场景
多头注意力机制在Transformer模型中有三种不同的应用方式:
-
编码器-解码器注意力 (Encoder-Decoder Attention)
- 这是连接编码器和解码器的桥梁。它的查询(queries) 来自前一个解码器层,而键(keys)和值(values)则来自编码器的最终输出。
- 这使得解码器在生成每一个输出词时,都能够关注到输入序列中的所有位置,这与传统的序列到序列模型中的注意力机制非常相似。
-
编码器中的自注意力 (Encoder Self-Attention)
- 在编码器的自注意力层中,所有的键、值和查询(keys, values, and queries)都来自同一个地方------即编码器中前一层的输出。
- 这使得编码器中的每个位置都能关注到前一层输出的所有位置,从而捕捉输入序列内部的依赖关系。
-
解码器中的自注意力 (Decoder Self-Attention)
- 解码器中的自注意力层工作方式与编码器类似,但有一个关键区别:为了保持其自回归特性,必须阻止信息向左流动。
- 这是通过在缩放点积注意力中引入掩码(masking)实现的。具体而言,在计算softmax之前,它会把所有对应于非法连接(即关注当前位置之后的位置)的值设置为负无穷(-∞)。这样一来,这些位置在经过softmax函数后,其权重会变为0,从而确保预测时只能依赖于已生成的输出序列。
4. 不可或缺的辅助组件
虽然注意力是核心,但Transformer的成功也离不开一些关键的辅助组件。
4.1 位置编码 (Positional Encoding)
由于Transformer模型完全摒弃了循环和卷积,它本身无法感知序列中词语的顺序。例如,对于模型来说,"我爱你"和"你爱我"在没有位置信息的情况下是完全一样的。为了解决这个问题,模型必须引入一些关于序列顺序的信息。
解决方案是在编码器和解码器堆栈底部的输入嵌入(input embeddings)中加入"位置编码"。论文中使用了一种基于不同频率的正弦(sine)和余弦(cosine)函数的固定编码方法。作者选择这种函数的原因是,他们假设这能让模型更容易地学习通过相对位置来进行关注,并且这种方法可能让模型能够推广到比训练时遇到的序列更长的序列。
4.2 按位置的前馈网络 (Position-wise Feed-Forward Networks)
在每个编码器和解码器层中,除了注意力子层外,还有一个全连接的前馈网络。这个网络被独立且相同地应用于序列中的每一个位置。
它由两个线性变换和一个ReLU激活函数组成,可以用以下公式表示:
FFN(x) = max(0, xW1 + b1)W2 + b2
这个组件为模型增加了非线性变换能力,进一步增强了模型的表达能力。在论文的模型中,输入和输出的维度d_model是512,而网络中间层的维度d_ff是2048。这意味着前馈网络首先将表示从512维扩展到2048维,经过ReLU激活后再投影回512维,从而增加了模型的表征容量。
5. 为什么是自注意力?
与当时主流的循环层(Recurrent Layer)相比,自注意力机制究竟有何优势?论文从三个方面进行了比较。
| 特性 | 自注意力层 (Self-Attention) | 循环层 (Recurrent) |
|---|---|---|
| 每层计算复杂度 | O(n² · d) | O(n · d²) |
| 可并行计算量 | O(1) | O(n) |
| 长距离依赖的学习路径长度 | O(1) | O(n) |
- 计算复杂度 :当序列长度
n小于表示维度d时,自注意力层的计算速度比循环层更快。这在最先进的机器翻译模型中是非常常见的情况。 - 并行度 :自注意力机制的计算是常数级别的(O(1)个顺序操作),因为它一次性计算所有位置的注意力,可以大规模并行。而循环层需要
O(n)个顺序操作,必须按时间步逐个计算,限制了并行能力。 - 长距离依赖 :在自注意力网络中,任意两个位置之间的信号传播路径长度都是
O(1),因为它们可以直接交互。而在循环网络中,信号需要从头到尾依次传播,路径长度是O(n)。路径越短,学习长距离依赖关系就越容易,也更能避免RNN中常见的梯度消失或爆炸问题。
6. 成果与结论
Transformer模型在两个主流的机器翻译任务上取得了卓越的成果。在WMT 2014英德翻译任务上,它取得了28.4的BLEU分数,比之前包括集成模型在内的最佳结果高出整整2.0分。同样地,在WMT 2014英法翻译任务上,该模型也创造了新的单模型SOTA记录,BLEU分数达到了41.8。
更重要的是它的训练效率。论文指出,Transformer的训练速度"明显更快"(significantly faster),其训练成本仅为其他竞争模型的一小部分。
最后,论文的核心贡献可以总结为:提出了Transformer,这是第一个完全基于注意力机制的序列转导模型。它用多头自注意力(multi-headed self-attention)取代了编码器-解码器架构中最常用的循环层,为序列建模领域开辟了一条全新的、更高效的道路。
论文信息
- 论文标题: Attention Is All You Need
- 作者: Ashish Vaswani, Noam Shazeer, Niki Parmar, et al.
- 发表会议: NIPS 2017