【经典论文解读】Attention Is All You Need — Transformer 架构详解

2026-06-28

Transformer 注意力机制 深度学习 NLP 机器翻译 经典论文

目录

Attention Is All You Need — Transformer 架构详解

论文信息: Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Łukasz Kaiser, Illia Polosukhin. "Attention Is All You Need." Advances in Neural Information Processing Systems 30 (NIPS 2017).

研究机构: Google Brain, Google Research, University of Toronto


1. 引言:为什么需要 Transformer?

2017 年之前,序列建模和机器翻译领域的主流方法是基于循环神经网络(RNN)的编码器—解码器架构,具体包括长短期记忆网络(LSTM)和门控循环单元(GRU)。这些模型通过将输入序列逐步编码为隐藏状态向量,再由解码器从隐藏状态中逐步生成输出序列。

然而,RNN 有一个根本性的限制:顺序计算的本质。在 RNN 中,时刻 $t$ 的隐藏状态 $h_t$ 依赖于前一时刻的状态 $h_{t-1}$ 和当前输入 $x_t$:

$$h_t = f(h_{t-1}, x_t)$$

这种递归结构意味着模型无法在序列的不同位置之间并行计算——处理第 100 个词之前,必须先处理完前 99 个词。当序列变长时,这不仅导致训练速度极慢(内存约束限制了跨样本的批处理),而且长距离依赖的信息需要通过多个时间步传播,容易出现梯度消失或梯度爆炸问题。

注意力机制(Attention Mechanism)在此之前已经被引入序列模型。Bahdanau 等人(2014)在 RNN 编码器—解码器中加入了注意力,使得解码器在生成每个输出时可以参考编码器的所有位置,而不只是最后一个隐藏状态。但问题是——注意力始终是作为 RNN 的辅助组件使用的,核心的计算结构仍然依赖循环。

Vaswani 等人在 2017 年的这篇论文中提出了一个简单而大胆的问题:如果我们彻底抛弃循环和卷积,只用注意力机制来构建整个模型,会怎样? 答案是 Transformer——第一个完全基于注意力机制的序列转换模型。

Transformer 的核心优势有三点:

  1. 高度并行化:每个位置的计算不依赖于前一个位置的输出(除了解码器中的自回归约束),可以在训练时大幅加速。
  2. 恒定路径长度:任意两个输入/输出位置之间的信息传播只需要常数个操作步骤($O(1)$),而不是 RNN 的 $O(n)$。
  3. 更短训练时间:在 WMT 2014 英德翻译任务上,Transformer 使用 8 块 P100 GPU 仅训练 12 小时就达到了 28.4 BLEU,比当时的最佳集成模型还高出 2 个 BLEU 点。

2. 背景:为什么注意力能取代循环和卷积?

在 Transformer 出现之前,已经有一些工作尝试减少顺序计算。例如,ByteNet 和 ConvS2S 使用卷积神经网络作为基本构建块,可以对所有位置并行计算隐藏表示。但这些方法有一个共同的问题:来自任意两个位置的信号之间所需的操作数量随着它们之间的距离增长——ConvS2S 是线性增长 $O(n)$,ByteNet 是对数增长 $O(\log n)$。这意味着学习长距离依赖变得更加困难。

Transformer 将这一操作数降至常数 $O(1)$。当然,这是有代价的:由于注意力机制对输入的所有位置做加权平均,有效分辨率会下降。论文通过多头注意力(Multi-Head Attention)来弥补这一缺陷——让模型从多个不同的表示子空间同时关注信息。

自注意力(Self-Attention)在 Transformer 之前已有成功应用,包括阅读理解、文本摘要、文本蕴含等任务。但此前的所有工作都将自注意力与 RNN 结合使用。Transformer 是第一个完全依赖自注意力的模型。


3. 模型架构:逐层拆解

图 1:Transformer 模型架构图

图 1 展示了 Transformer 的完整架构。一眼看去,它由左侧的编码器(Encoder)和右侧的解码器(Decoder)组成,这是一种典型的序列到序列(Seq2Seq)结构。

3.1 编码器和解码器堆栈

编码器(Encoder)由 $N = 6$ 个相同的层堆叠而成。每一层包含两个子层:

  1. 多头自注意力(Multi-Head Self-Attention)子层
  2. 逐位置全连接前馈网络(Position-wise Feed-Forward Network)子层

每个子层的输出都经过残差连接(Residual Connection)和层归一化(Layer Normalization)。用公式表示就是:

$$\text{Output} = \text{LayerNorm}(x + \text{Sublayer}(x))$$

为了残差连接的便利,模型中所有子层以及嵌入层都产生相同维度的输出:$d_{\text{model}} = 512$

解码器(Decoder)同样由 $N = 6$ 个相同的层堆叠而成。除了编码器中的两个子层外,解码器在每个层中插入第三个子层,对编码器的输出执行多头注意力——这就是通常所说的编码器—解码器注意力(Encoder-Decoder Attention)。与编码器一样,每个子层后都有残差连接和层归一化。

此外,解码器的自注意力子层做了特殊处理:掩码(Masking)。通过将 Softmax 输入中对应非法连接的值设为 $-\infty$,防止位置 $i$ 关注到位置 $j > i$(即不能"看到未来")。结合输出嵌入向右偏移一个位置的事实,这确保了位置 $i$ 的预测只能依赖于位置小于 $i$ 的已知输出,保持了自回归性质。

3.2 注意力机制:模型的核心

注意力函数可以理解为将查询(Query)和一组键—值对(Key-Value Pairs)映射到一个输出。输出是值的加权和,每个值的权重由查询与对应键的兼容性函数计算得到。

3.2.1 缩放点积注意力(Scaled Dot-Product Attention)

图 2(左):缩放点积注意力

如图 2(左)所示,缩放点积注意力的计算流程为:

  1. 计算查询 $Q$ 与所有键 $K$ 的点积:$QK^T$
  2. 将点积除以 $\sqrt{d_k}$($d_k$ 是键向量的维度)进行缩放
  3. 应用 Softmax 函数得到权重分布
  4. 用权重对值 $V$ 进行加权求和

最终的数学表达式是:

$$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V \tag{1}$$

在实际计算中,我们将一组查询打包为矩阵 $Q$,键和值打包为矩阵 $K$ 和 $V$,这样的矩阵运算可以利用高度优化的线性代数库高效执行。

为什么除以 $\sqrt{d_k}$? 这是论文中一个很关键的细节。注意力机制有两种常见形式:加性注意力(Additive Attention)和点积注意力(Dot-Product Attention)。两者在理论复杂度上相似,但点积注意力在实践中更快、更节省空间,因为它可以用矩阵乘法实现。

然而,当键向量的维度 $d_k$ 较大时,点积的结果会变得很大(因为点积是 $d_k$ 个随机变量的和,其方差为 $d_k$)。较大的点积值会将 Softmax 函数推到梯度极小的饱和区域。论文通过除以 $\sqrt{d_k}$ 来抵消这种放大效应,使点积的方差保持在 1。

论文假设 $q$ 和 $k$ 的各个分量是独立的随机变量,均值为 0,方差为 1,那么点积 $q \cdot k = \sum_i q_i k_i$ 的均值为 0,方差为 $d_k$。缩放后,方差变为 1,Softmax 的输入保持在合理范围内。

3.2.2 多头注意力(Multi-Head Attention)

图 2(右):多头注意力

与其只使用一个注意力函数来处理 $d_{\text{model}}$ 维的键、值和查询,论文发现将查询、键和值分别用不同的、可学习的线性投影映射 $h$ 次更加有益。具体来说:

  • 使用 $h = 8$ 个并行的注意力"头"
  • 每个头的维度:$d_k = d_v = d_{\text{model}} / h = 512 / 8 = 64$

每个头的计算为:

$$\text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V)$$

其中 $W_i^Q \in \mathbb{R}^{d_{\text{model}} \times d_k}$,$W_i^K \in \mathbb{R}^{d_{\text{model}} \times d_k}$,$W_i^V \in \mathbb{R}^{d_{\text{model}} \times d_v}$ 是投影矩阵。所有头的输出拼接后,再进行一次线性变换:

$$\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, ..., \text{head}_h) W^O$$

其中 $W^O \in \mathbb{R}^{h d_v \times d_{\text{model}}}$。

为什么需要多个头? 单个注意力头只能从一种"视角"关注信息——它会给每个位置分配一组固定的权重。而不同的头可以学习关注不同类型的关系:有的头可能关注句法结构(如主语—谓语关系),有的头可能关注语义相关性,有的头可能关注位置邻近性。通过 $h$ 个头并行工作,模型可以在不同的表示子空间中同时捕捉多种依赖关系。

由于每个头的维度被降低(从 512 降到 64),$h$ 个头拼接后的总计算量与单头全维注意力相似。这是一个非常精巧的设计:用同样的计算成本,换取了更丰富的表示能力。

3.2.3 Transformer 中的三种注意力

Transformer 在三个不同的位置使用了多头注意力:

  1. 编码器—解码器注意力(Encoder-Decoder Attention):查询 $Q$ 来自上一个解码器层,键 $K$ 和值 $V$ 来自编码器的输出。这让解码器的每个位置都能关注输入序列的所有位置,模仿了经典的 Seq2Seq 注意力机制。

  2. 编码器自注意力(Encoder Self-Attention):$Q$、$K$、$V$ 全部来自同一个地方——编码器中上一层的输出。编码器的每个位置可以关注上一层编码器的所有位置。

  3. 解码器掩码自注意力(Decoder Masked Self-Attention):与编码器自注意力类似,但通过掩码防止位置 $i$ 关注位置 $j > i$,保持自回归性质。在实现中,我们将 Softmax 输入中对应非法连接的值设为 $-\infty$,使得 Softmax 后的权重为零。

3.3 逐位置前馈网络(Position-wise FFN)

除了注意力子层外,编码器和解码器的每一层都包含一个全连接前馈网络,该网络对每个位置独立且相同地应用。它由两个线性变换和一个 ReLU 激活函数组成:

$$\text{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2$$

内部维度 $d_{ff} = 2048$,即第一个线性层将维度从 512 扩展到 2048,第二个线性层再将其缩减回 512。

这个结构可以理解为两个 $1 \times 1$ 卷积(对于文本序列而言,每个位置独立处理),或者是每个位置在注意力机制聚合了上下文信息后,再进行一次非线性变换以进一步增强表示能力。

3.4 嵌入和 Softmax

与其他序列转换模型类似,Transformer 使用可学习的嵌入将输入和输出 token 转换为 $d_{\text{model}}$ 维的向量。在解码器输出端,使用线性变换和 Softmax 将解码器输出转换为预测下一个 token 的概率。

论文还采用了一个常见的技巧:嵌入层和 Softmax 前的线性层共享权重矩阵(Tied Embeddings)。此外,嵌入层的输出乘以 $\sqrt{d_{\text{model}}}$ 进行缩放,防止嵌入值相对于位置编码过小。

3.5 位置编码(Positional Encoding)

由于 Transformer 完全不包含循环和卷积,模型本身不具备感知序列顺序的能力。为了让模型知道 token 在序列中的位置,论文在编码器和解码器底部的输入嵌入中添加了位置编码(Positional Encoding)

位置编码与嵌入具有相同的维度 $d_{\text{model}}$,因此可以直接相加。论文选择了正弦和余弦函数:

$$ PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i / d_{\text{model}}}}\right) $$

$$ PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i / d_{\text{model}}}}\right) $$

其中 $pos$ 是位置索引,$i$ 是维度索引。这意味着每个维度对应一个不同频率的正弦波:波长从 $2\pi$ 到 $10000 \cdot 2\pi$ 呈几何级数增长。

为什么选择正弦函数? 论文的假说是:这种编码能让模型轻松学习按相对位置进行关注。因为对于任意固定的偏移量 $k$,$PE_{pos+k}$ 可以表示为 $PE_{pos}$ 的线性函数——这是正弦函数的加法性质决定的。

此外,正弦编码还有一个额外优势:即使测试序列比训练序列更长,模型也可以外推(因为正弦函数在任何位置都有定义),而可学习的位置嵌入无法做到这一点。消融实验(Table 3 行 (E))也证实,可学习的位置嵌入和正弦位置编码取得了几乎相同的结果。


4. 为什么选择自注意力?

论文的第四节从三个维度系统比较了自注意力层与循环层、卷积层:

层类型 每层复杂度 顺序操作数 最大路径长度
自注意力 $O(n^2 \cdot d)$ $O(1)$ $O(1)$
循环层 $O(n \cdot d^2)$ $O(n)$ $O(n)$
卷积层 $O(k \cdot n \cdot d^2)$ $O(1)$ $O(\log_k(n))$
受限自注意力 $O(r \cdot n \cdot d)$ $O(1)$ $O(n/r)$

这张表(Table 1)揭示了自注意力的几个关键优势:

  1. 并行化(Sequential Operations):自注意力只需要 $O(1)$ 的顺序操作,所有位置可以同时计算。而 RNN 需要 $O(n)$ 步,完全无法并行。

  2. 最大路径长度(Maximum Path Length):前向和后向信号在网络中传播时经过的最大路径长度。自注意力为 $O(1)$——任意两个位置之间的信息一次注意力操作就能到达。RNN 是 $O(n)$,信息需要一步一步传播。这直接影响了模型学习长距离依赖的能力。

  3. 计算复杂度(Complexity per Layer):当序列长度 $n$ 小于表示维度 $d$ 时(机器翻译中 $n$ 通常在几十到几百,而 $d = 512$),自注意力的 $O(n^2 \cdot d)$ 实际上优于 RNN 的 $O(n \cdot d^2)$。

此外,自注意力还有一个附加好处:可解释性。通过检查注意力权重的分布,我们可以直观地看到模型在生成每个输出时"关注"了输入的哪些部分。论文在附录中展示了多个注意力头的分布,不同的头确实学会了执行不同的"任务"——有的关注句法结构,有的关注语义相关词。


5. 训练细节

5.1 训练数据和批处理

  • WMT 2014 英德:约 450 万句对,使用字节对编码(BPE),共享约 37000 token 的词表
  • WMT 2014 英法:约 3600 万句对,使用 32000 word-piece 词表

每个训练批次包含约 25000 个源 token 和 25000 个目标 token。

5.2 硬件和训练时长

  • 使用 8 块 NVIDIA P100 GPU
  • 基础模型(base):每步约 0.4 秒,共 100K 步,训练 12 小时
  • 大模型(big):每步约 1.0 秒,共 300K 步,训练 3.5 天(约 84 小时)

相比之下,当时其他 SOTA 模型的训练成本通常是 Transformer 的几倍到几十倍(以 FLOPs 计)。

5.3 优化器

使用 Adam 优化器,参数设置为:

  • $\beta_1 = 0.9$,$\beta_2 = 0.98$,$\epsilon = 10^{-9}$
  • 学习率采用 warmup + decay 策略:

$$lrate = d_{\text{model}}^{-0.5} \cdot \min(step\_num^{-0.5}, step\_num \cdot warmup\_steps^{-1.5})$$

其中 $warmup\_steps = 4000$。这意味着学习率在前 4000 步线性增加(warmup),之后按步数的平方根反比衰减。这种策略在训练初期避免了因模型随机初始化导致的大梯度破坏性更新。

5.4 正则化

论文使用了三种正则化技术:

  1. 残差 Dropout:每个子层的输出在加到输入并进行层归一化之前,先应用 $P_{drop} = 0.1$ 的 dropout。此外,嵌入和位置编码相加后也应用了 dropout。对于大模型(big),英法翻译任务上使用了 $P_{drop} = 0.1$ 而非 0.3。

  2. 标签平滑(Label Smoothing):在训练期间使用 $\epsilon_{ls} = 0.1$ 的标签平滑。虽然这会使困惑度变差(模型变得更"不确定"),但可以提高准确率和 BLEU 分数——因为模型不再过于自信地只输出最高概率的结果。

  3. 模型平均(Checkpoint Averaging):基础模型平均最后 5 个检查点(每 10 分钟保存一次),大模型平均最后 20 个检查点。


6. 实验结果

6.1 机器翻译

模型 BLEU (英德) BLEU (英法) 训练成本 (英德 FLOPs)
ByteNet 23.75
GNMT + RL 24.6 39.92 $2.3 \times 10^{19}$
ConvS2S 25.16 40.46 $9.6 \times 10^{18}$
MoE 26.03 40.56 $2.0 \times 10^{19}$
ConvS2S Ensemble 26.36 41.29 $7.7 \times 10^{19}$
Transformer (base) 27.3 38.1 $3.3 \times 10^{18}$
Transformer (big) 28.4 41.0 $2.3 \times 10^{19}$

(Table 2 数据,部分省略了集成模型)

在 WMT 2014 英德翻译任务上,Transformer (big) 以 28.4 BLEU 刷新了 SOTA,比之前的最佳集成模型高出 2 个 BLEU 以上。即使是基础模型(27.3 BLEU),也超越了所有已发表的模型和集成——而其训练成本仅为竞争模型的几分之一。

在 WMT 2014 英法翻译任务上,Transformer (big) 以 41.0 BLEU 取得单模型 SOTA,训练成本不到之前最佳模型的 1/4。

6.2 消融实验

论文在 Table 3 中进行了详尽的消融实验(所有指标基于英德翻译开发集 newstest2013)。以下是关键发现:

(A) 注意力头数:将头数从 8 减少到 1 会导致 BLEU 从 25.8 降至 24.9,困惑度从 4.92 升至 5.29。这说明多个注意力头确实重要。有趣的是,减少 $d_k$(单头时从 64 增到 512)可以在一定程度上弥补,但不能完全补偿。

(B) 注意力键的维度:将 $d_k$ 从 64 减小到 16 或 32 会导致模型质量下降。论文推测,确定键和查询之间的兼容性并不简单,可能需要比简单点积更复杂的兼容性函数。

(C) 更大模型:使用更大的隐藏维度($d_{model} = 1024$,$d_{ff} = 4096$,$h = 16$)确实带来了更好的性能——big 模型在开发集上达到 26.4 BLEU。

(D) Dropout:不做 dropout($P_{drop} = 0.0$)会导致 BLEU 从 25.8 降至 24.6,验证了 dropout 对防止过拟合至关重要。

(E) 位置编码:将正弦位置编码替换为可学习的位置嵌入,结果几乎相同(25.7 vs 25.8 BLEU)。这证明正弦编码同样有效,且具有可以外推到更长序列的优势。


7. 总结与影响

Transformer 的贡献可以凝练为三点:

  1. 架构创新:第一个完全基于注意力机制的序列转换模型,抛弃了当时被认为是不可或缺的循环和卷积结构。通过多头自注意力、位置编码和残差连接的组合,实现了在并行效率和模型质量上的双重突破。

  2. 训练效率革命:在 WMT 2014 英德翻译任务上,Transformer 以远低于竞争模型的训练成本达到了更好的性能。这种效率优势使之成为大规模 NLP 应用的理想选择。

  3. 后续研究的基石:Transformer 的影响远不止于机器翻译。其编码器结构直接催生了 BERT(2018),开创了预训练语言模型的新范式;其解码器结构被 GPT 系列采用,成为生成式语言模型的标准架构。Transformer 的核心思想——自注意力和多头注意力——已经成为几乎所有现代 NLP 系统的标准构建块,甚至扩展到了计算机视觉(ViT)、语音处理、多模态学习等领域。

从 2026 年的视角回望,很难想象在 Transformer 出现之前,所有主流序列模型都依赖循环结构。这篇论文是深度学习历史上真正的范式转折点——它证明了有时候,最好的创新不是"做得更多",而是"去掉不需要的东西"。


注:本文中的图片均提取自原始论文 PDF,版权归原作者所有。