精读笔记: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
机构 Google Brain / Google Research / University of Toronto
发表会议 NeurIPS 2017(第31届神经信息处理系统大会)
arXiv 1706.03762(2017年6月首发)
核心一句话 提出 Transformer 架构:完全抛弃 RNN 和 CNN,只用注意力机制处理序列,速度更快、效果更好,成为现代大语言模型的基石。

阅读地图(怎么读这篇精读)

本文按论文章节顺序推进,分为五大部分:

  1. 摘要(Abstract):了解论文干了什么、结果怎么样——2分钟速览
  2. 引言(Introduction):了解为什么要做这件事、前人方法的问题——背景铺垫
  3. 模型架构(Model Architecture):这是精读核心,逐段拆解编码器、解码器、注意力机制、位置编码等所有技术细节——需要最多时间
  4. 训练与实验(Training & Results):了解怎么训练、结果有多好
  5. 结论(Conclusion):了解作者的总结和展望

新手建议:遇到看不懂的公式先跳过,先读"讲解"部分,理解直觉后再回来看公式符号。


一、Abstract(摘要)

段落 1:现有方法的问题

原文:The dominant sequence transduction models are based on complex recurrent or convolutional neural networks that include an encoder and a decoder.

翻译:主流的序列转换模型(sequence transduction models)基于复杂的循环神经网络(recurrent neural networks)或卷积神经网络(convolutional neural networks),这些模型通常包含一个编码器(encoder)和一个解码器(decoder)。

讲解
- 序列转换(sequence transduction) 是什么意思?简单说就是"把一个序列变成另一个序列"。机器翻译就是典型例子:把英文句子(序列1)翻译成中文句子(序列2)。
- RNN(循环神经网络) 是当时的主流方法,它像读书一样,一个字一个字按顺序处理,读完前一个字才能读下一个字。
- CNN(卷积神经网络) 本来是处理图像的,后来也被用于处理文本。
- 编码器-解码器(Encoder-Decoder) 是一种经典框架:编码器负责"理解"输入句子,把它压缩成一个意思向量;解码器负责根据这个意思向量"生成"输出句子。这篇论文也用了这个框架,但内部机制完全不同。


段落 2:核心提出

原文:We propose a new simple network architecture, the Transformer, based solely on attention mechanisms, dispensing with recurrence and convolutions entirely.

翻译:我们提出了一种新的简单网络架构——Transformer,它完全基于注意力机制(attention mechanisms),彻底抛弃了循环结构和卷积结构。

讲解
这是论文最核心的一句话。作者的大胆之处在于:在当时所有人都觉得 RNN 是序列建模必备工具的情况下,他们说"不,我们完全不用 RNN"。
- 注意力机制(Attention Mechanism) 是什么?可以这样理解:翻译"我爱北京天安门"时,翻译"爱"这个词时,模型需要重点"关注"中文里的"爱",同时参考周围词的上下文。注意力机制就是让模型学会"应该把注意力放在哪里"。
- dispensing with recurrence entirely(彻底抛弃循环):这是当时非常激进的做法,因为序列有顺序,大家以为必须用循环结构来捕捉顺序信息。


段落 3:实验结果

原文:Our model achieves 28.4 BLEU on the WMT 2014 English-to-German translation task, improving over the existing best results, including ensembles, by over 2 BLEU.

翻译:我们的模型在 WMT 2014 英德翻译任务上达到 28.4 的 BLEU 分数,比现有最佳结果(包括集成模型)提升超过 2 个 BLEU 分数点。

讲解
- BLEU(Bilingual Evaluation Understudy) 是机器翻译的自动评分标准,分数越高翻译越好。28.4 在当时是英德翻译的最佳成绩。
- WMT 2014 是一个国际机器翻译评测比赛,使用标准数据集,是当时最权威的翻译基准。
- 集成模型(ensemble) 是把多个模型的预测结果合并,通常效果最好但计算代价极高。Transformer 单个模型就超过了别人的集成模型,说明它本身就非常强大。
- 英法翻译达到 41.8 BLEU,也是当时最好成绩,而且训练时间只需要 3.5 天(用 8 块 GPU)。


二、Introduction(引言)

段落 1:RNN 是当时的主流

原文:Recurrent neural networks, long short-term memory and gated recurrent neural networks in particular, have been firmly established as state of the art approaches in sequence modeling and transduction problems such as language modeling and machine translation.

翻译:循环神经网络(RNN),尤其是长短期记忆网络(LSTM)和门控循环单元(GRU),已经在序列建模和序列转换任务(如语言建模和机器翻译)中被牢固确立为最先进的方法。

讲解
- LSTM(Long Short-Term Memory,长短期记忆网络):RNN 的改进版,专门设计了"记忆门"来解决普通 RNN 记不住长距离信息的问题。就像一个人有选择地记忆重要事情、忘记无关信息。
- GRU(Gated Recurrent Unit,门控循环单元):LSTM 的简化版,参数更少但效果接近。
- 2017年时,这些方法统治了 NLP 领域,就像今天大家默认用 Transformer 一样。


段落 2:RNN 的根本缺陷——无法并行

原文:Recurrent models typically factor computation along the symbol positions of the input and output sequences...they generate a sequence of hidden states h_t, as a function of the previous hidden state h_{t-1} and the input for position t. This inherently sequential nature precludes parallelization within training examples, which becomes critical at longer sequence lengths.

翻译:循环模型通常沿输入和输出序列的符号位置分解计算……它们生成一系列隐藏状态 h_t,该状态是前一隐藏状态 h_{t-1} 和位置 t 的输入的函数。这种内在的顺序性阻止了训练样本内部的并行化,当序列较长时这一问题变得尤为突出。

讲解
这段道出了 RNN 最致命的弱点,用一个比喻来理解:

  • RNN 的工作方式:像流水线工人,必须一步步来。处理第 5 个词时,必须先处理完第 1、2、3、4 个词,因为 h_5 依赖 h_4,h_4 依赖 h_3,以此类推。
  • 这意味着什么? 即使你有 1000 块 GPU,RNN 也没法充分利用它们,因为计算本质上是串行的——必须等上一个位置算完才能算下一个。
  • 隐藏状态(hidden state)h_t:可以理解为 RNN 在读到第 t 个词时,脑子里存的"记忆摘要"。
  • Transformer 如何解决? 注意力机制让每个位置可以直接"看到"所有其他位置,不需要经过中间环节,因此可以完全并行计算。

段落 3:注意力机制已有应用,但仍配合 RNN 使用

原文:Attention mechanisms have become an integral part of compelling sequence modeling and transduction models in various tasks, allowing modeling of dependencies without regard to their distance in the input or output sequences. In all but a few cases, however, such attention mechanisms are used in conjunction with a recurrent network.

翻译:注意力机制已经成为各种任务中优秀序列建模和转换模型不可或缺的组成部分,它允许建模输入或输出序列中无论距离远近的依赖关系。然而,除少数情况外,这类注意力机制都是与循环网络结合使用的。

讲解
- 注意力机制在 2014-2017 年间已经被广泛使用,但都是"配角"——用来辅助 RNN,让 RNN 翻译时"知道该看哪个位置"。
- 这篇论文的创新:把注意力机制从"配角"变成"主角",完全替代 RNN,这才是革命性的。
- "无论距离远近的依赖关系":比如翻译时,句子开头的"虽然"和句子末尾的"但是"是强关联的,但在长句子中距离很远。注意力机制可以直接建立这种长距离联系,而 RNN 需要通过一步步传递来保持这种联系,容易"遗忘"。


段落 4:提出 Transformer

原文:In this work we propose the Transformer, a model architecture eschewing recurrence and instead relying entirely on an attention mechanism to draw global dependencies between input and output. The Transformer allows for significantly more parallelization and can reach a new state of the art in translation quality after being trained for as little as twelve hours on eight P100 GPUs.

翻译:在本文中,我们提出 Transformer,这是一种摒弃循环结构、完全依赖注意力机制来捕捉输入与输出之间全局依赖关系的模型架构。Transformer 允许显著更多的并行化,并且仅需在 8 块 P100 GPU 上训练 12 小时便能达到翻译质量的新高水平。

讲解
- 全局依赖(global dependencies):序列中任意两个位置之间的关系,不管它们距离多远。
- "12小时训练达到最优":对比当时的方法,有的需要数周训练,这个效率提升是巨大的商业价值。
- P100 GPU:NVIDIA 2016 年的数据中心级 GPU,当时的顶级训练卡。


三、Model Architecture(模型架构)——精读核心

架构总体描述:Transformer 遵循经典的编码器-解码器框架,但编码器和解码器都完全由注意力层和前馈网络层构成,没有任何循环结构。


3.1 整体架构图解读(Figure 1)

论文中的图 1 展示了 Transformer 的完整结构,以下是详细的文字解读:

输入序列 → [输入嵌入 + 位置编码]
              ↓
    ┌─────────────────────────┐
    │        编码器栈          │  ← 6个相同的层叠加
    │  ┌───────────────────┐  │
    │  │ 多头自注意力机制   │  │
    │  │  (Add & Norm)     │  │
    │  ├───────────────────┤  │
    │  │  前馈神经网络      │  │
    │  │  (Add & Norm)     │  │
    │  └───────────────────┘  │
    └─────────────────────────┘
              ↓ (编码器输出,传给解码器)

输出序列(右移) → [输出嵌入 + 位置编码]
              ↓
    ┌─────────────────────────┐
    │        解码器栈          │  ← 6个相同的层叠加
    │  ┌───────────────────┐  │
    │  │ 掩码多头自注意力   │  │  ← 防止"看未来"
    │  │  (Add & Norm)     │  │
    │  ├───────────────────┤  │
    │  │ 多头编解码注意力   │  │  ← 关注编码器输出
    │  │  (Add & Norm)     │  │
    │  ├───────────────────┤  │
    │  │  前馈神经网络      │  │
    │  │  (Add & Norm)     │  │
    │  └───────────────────┘  │
    └─────────────────────────┘
              ↓
         线性层 + Softmax
              ↓
         输出概率分布

关键结构特点
- 编码器每层有 2个子层:多头自注意力 + 前馈网络
- 解码器每层有 3个子层:掩码多头自注意力 + 编解码注意力 + 前馈网络
- 每个子层都有 残差连接(Add)+ 层归一化(Norm)
- 输入和输出都加入了位置编码(因为注意力本身没有位置信息)


3.1 编码器与解码器栈

编码器(Encoder)

原文:The encoder is composed of a stack of N=6 identical layers. Each layer has two sub-layers. The first is a multi-head self-attention mechanism, and the second is a simple, position-wise fully connected feed-forward network. We employ a residual connection around each of the two sub-layers, followed by layer normalization. All sub-layers in the model, as well as the embedding layers, produce outputs of dimension d_model=512.

翻译:编码器由 N=6 个相同层的堆叠构成。每层有两个子层:第一个是多头自注意力机制,第二个是简单的逐位置全连接前馈网络。我们在每个子层周围采用残差连接,之后进行层归一化。模型中的所有子层以及嵌入层的输出维度均为 d_model=512。

讲解

N=6 个相同层:想象一个加工厂,有 6 道完全相同的工序,原材料依次经过每道工序,越来越精细。

两个子层的作用
- 第一个子层(多头自注意力):让每个词"看看"句子里所有其他词,理解语境
- 第二个子层(前馈网络):对每个词的表示做进一步的非线性变换,提取更高级特征

残差连接(Residual Connection,即 Add)
- 公式形式:output = LayerNorm(x + Sublayer(x))
- 直觉理解:假设子层的输入是 x,经过子层计算得到 F(x),最终输出是 x + F(x),而不是只有 F(x)。
- 为什么这样做?这是受 ResNet(残差网络)启发的设计。如果子层学不出有用的东西,至少可以"学恒等映射"(把输出设为0),这样总输出还是 x,不会变差。这让深层网络更容易训练。
- 比喻:就像在原有基础上做修改,而不是从头重写——保留原信息,只叠加改动量。

层归一化(Layer Normalization,即 Norm)
- 对每个样本的特征维度做归一化(均值为0,方差为1),保证数值稳定,加速训练。
- 与批归一化(Batch Norm)的区别:Batch Norm 在批次维度做归一化,Layer Norm 在特征维度做归一化,后者在序列任务中更常用。

d_model=512:每个词被表示为 512 维的向量。这个数字是个超参数,作者选了 512。


解码器(Decoder)

原文:The decoder is also composed of a stack of N=6 identical layers. In addition to the two sub-layers in each encoder layer, the decoder inserts a third sub-layer, which performs multi-head attention over the output of the encoder stack. We also modify the self-attention sub-layer in the decoder stack to prevent positions from attending to subsequent positions. This masking, combined with fact that the output embeddings are offset by one position, ensures that the predictions for position i can depend only on the known outputs at positions less than i.

翻译:解码器同样由 N=6 个相同层的堆叠构成。在编码器每层的两个子层之外,解码器额外插入了第三个子层,该子层对编码器栈的输出执行多头注意力。我们还修改了解码器中的自注意力子层,以防止位置 i 关注到后续位置。这种掩码(masking),结合输出嵌入偏移一个位置的做法,确保位置 i 的预测只能依赖于位置 i 之前已知的输出。

讲解

解码器比编码器多了一个子层,共三个:
1. 掩码多头自注意力(Masked Multi-Head Self-Attention):解码器处理"已生成的输出词"时,不能"偷看"还没生成的未来词。比如生成第 3 个词时,只能参考第 1、2 个词,不能参考第 4、5 个词。这通过"掩码"(把未来位置的注意力权重设为负无穷,经过 softmax 后变为0)来实现。
2. 编解码注意力(Encoder-Decoder Attention):解码器的这个子层专门"看"编码器的输出,相当于"参考原文"。这是编码器和解码器之间信息流动的桥梁。
3. 前馈网络:与编码器中相同。

自回归(autoregressive):解码器生成序列时,是一个词一个词地生成,每次用已生成的词作为下一步的输入。"输出嵌入偏移一个位置"就是指:训练时,目标序列整体向右偏移一格,使得第 i 个位置的预测目标是"第 i 个输出词",但输入只有"第 i-1 个及之前的词"。


3.2 注意力机制

注意力机制的总体定义

原文:An attention function can be described as mapping a query and a set of key-value pairs to an output, where the query, keys, values, and output are all vectors. The output is computed as a weighted sum of the values, where the weight assigned to each value is computed by a compatibility function of the query with the corresponding key.

翻译:注意力函数可以描述为:将一个查询(query)和一组键-值对(key-value pairs)映射到一个输出,其中查询、键、值和输出都是向量。输出被计算为值(values)的加权和,其中分配给每个值的权重由查询与对应键的兼容性函数计算得出。

讲解

这段定义非常抽象,用一个"图书馆查找"的比喻来理解:

  • Query(查询):你去图书馆,提出的检索需求,比如"我想找关于深度学习的书"
  • Keys(键):每本书的索引卡片上的关键词标签,比如"机器学习"、"神经网络"、"数据库"等
  • Values(值):每本书的实际内容
  • 注意力权重:你的查询("深度学习")和每本书的标签(key)的相似度,相似度越高,权重越大
  • 输出:把所有书的内容(values)按权重加权平均,权重高的书贡献更多

在机器翻译中:当解码器翻译某个词时,Query 是当前正在翻译的位置,Keys 和 Values 来自编码器的输出(即原文的表示),注意力权重告诉模型"翻译这个词时,应该重点参考原文的哪些位置"。


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

原文:We call our particular attention "Scaled Dot-Product Attention". The input consists of queries and keys of dimension d_k, and values of dimension d_v. We compute the dot products of the query with all keys, divide each by √d_k, and apply a softmax function to obtain the weights on the values.

翻译:我们将所使用的特定注意力称为"缩放点积注意力"。输入由维度为 d_k 的查询和键,以及维度为 d_v 的值组成。我们计算查询与所有键的点积,将每个结果除以 √d_k,然后应用 softmax 函数来获得值的权重。

核心公式

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

逐符号解释

符号 含义 直觉理解
Q Queries 矩阵,形状 [序列长度, d_k] "我想问什么"
K Keys 矩阵,形状 [序列长度, d_k] "我有哪些信息可以回答"
V Values 矩阵,形状 [序列长度, d_v] "每条信息的实际内容"
QK^T 查询和所有键的点积,形状 [序列长度, 序列长度] "每个位置和每个位置的相似度矩阵"
√d_k 缩放因子(d_k 的平方根) "防止数值过大导致梯度消失"
softmax(...) 把相似度分数转化为概率分布(和为1) "归一化注意力权重"
最终结果 值向量的加权和 "综合各位置信息得出输出"

讲解(为什么要除以 √d_k)

原文:"For large values of d_k, the dot products grow large in magnitude, pushing the softmax function into regions where it has extremely small gradients."

当 d_k 很大时(比如512维),Q 和 K 的点积数值会变得很大(想象两个512维向量相乘,结果可能很大)。softmax 函数对于很大的输入会趋向于"极化"——某个位置权重接近1,其他所有位置权重接近0。这导致梯度非常小(梯度消失),网络无法学习。

除以 √d_k 相当于把注意力分数"压缩"到合理范围,让 softmax 工作在更平滑的区间。

直觉:就像考试分数要归一化——不同满分的试卷需要统一换算成百分制,才能公平比较。


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

原文:Instead of performing a single attention function with d_model-dimensional keys, values and queries, we found it beneficial to linearly project the queries, keys and values h times with different, learned linear projections to d_k, d_v and d_k dimensions, respectively. On each of these projected versions of queries, keys and values we then perform the attention function in parallel, yielding d_v-dimensional output values.

翻译:我们发现,不是用 d_model 维的键、值和查询执行单一的注意力函数,而是将查询、键和值分别用不同的、可学习的线性投影 h 次映射到 d_k、d_v 和 d_k 维,然后在每组投影后的查询、键和值上并行执行注意力函数,得到 d_v 维的输出值,这样做更有益。

核心公式

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

$$\text{其中} \quad \text{head}_i = \text{Attention}(Q W_i^Q,\ K W_i^K,\ V W_i^V)$$

参数说明
- h = 8(8个注意力头)
- d_k = d_v = d_model / h = 512 / 8 = 64
- W_i^Q:第 i 个头的查询投影矩阵,形状 [d_model, d_k] = [512, 64]
- W_i^K:第 i 个头的键投影矩阵,形状 [d_model, d_k] = [512, 64]
- W_i^V:第 i 个头的值投影矩阵,形状 [d_model, d_v] = [512, 64]
- W^O:输出投影矩阵,形状 [h × d_v, d_model] = [512, 512]

讲解

为什么需要"多头"注意力?用一个比喻:

想象你在分析一篇文章,需要同时从多个角度理解:
- 头 1 专注于语法结构(主谓关系)
- 头 2 专注于语义相关性(近义词、反义词)
- 头 3 专注于指代关系("他"指的是前文哪个人)
- 头 4~8 各自关注其他不同方面

单个注意力头只能从一个角度"看",而多头注意力相当于同时派出 8 个专家,每个专家都有自己独特的理解角度(通过不同的 W^Q、W^K、W^V 学习得到),最后把 8 个专家的意见合并(Concat)起来。

为什么维度要除以 h? d_model=512,8个头,每个头用 64 维而不是 512 维。这样总计算量与单头注意力相似(8×64×64 ≈ 512×64),不会增加计算成本,却获得了多视角的理解能力。

原文:Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions. With a single attention head, averaging inhibits this.

翻译:多头注意力使模型能够在不同位置上联合关注来自不同表示子空间的信息。使用单个注意力头时,平均化会抑制这种能力。

讲解:"不同表示子空间"就是说,8个头各自学到了数据的不同方面的表示。单头注意力只能在一个空间里综合,多头则能在多个独立空间分别计算,再汇总,表达能力更强。


3.2.3 注意力在模型中的三种用法

原文(三种用法)

  1. "In encoder-decoder attention layers, the queries come from the previous decoder layer, and the memory keys and values come from the output of the encoder."

  2. "The encoder contains self-attention layers. In a self-attention layer all of the keys, values and queries come from the same place, in this case, the output of the previous layer in the encoder."

  3. "Self-attention layers in the decoder allow each position in the decoder to attend to all positions in the decoder up to and including that position. We need to prevent leftward information flow in the decoder to preserve the auto-regressive property. We implement this inside of scaled dot-product attention by masking out (setting to −∞) all values in the input to the softmax which correspond to illegal connections."

翻译

  1. 在编解码注意力层中,查询来自前一个解码器层,而记忆的键和值来自编码器栈的输出。

  2. 编码器包含自注意力层。在自注意力层中,所有的键、值和查询都来自同一个地方,即编码器前一层的输出。

  3. 解码器中的自注意力层允许每个位置关注解码器中该位置及之前的所有位置。为保持自回归特性,我们需要防止解码器中的信息向左流动。我们通过在缩放点积注意力内部将对应非法连接的输入掩盖掉(设为 −∞)来实现这一点。

讲解

Transformer 中注意力机制出现了三次,每次角色不同:

第1种——编解码注意力(跨序列注意力)
- 翻译场景:生成中文词时,Query=解码器当前状态,Key/Value=原始英文的编码表示
- 相当于"对照原文翻译",让每个输出词知道它最对应原文的哪些词

第2种——编码器自注意力(Self-Attention)
- Q、K、V 全部来自同一个序列(编码器的输入/上一层输出)
- 每个词都"看"整个输入序列,捕捉词与词之间的关系
- 比如"bank"这个词,通过自注意力看到了前后的词,可以判断是"银行"还是"河岸"

第3种——解码器掩码自注意力
- 与编码器自注意力类似,但只能看"当前位置及之前的位置"
- 设为 −∞ 后经过 softmax 变成 0,相当于"这些位置不存在"
- 这确保了生成时的因果性:生成第 i 个词时,不能"提前知道"第 i+1 个词是什么


3.3 逐位置前馈网络(Position-wise Feed-Forward Networks)

原文:In addition to attention sub-layers, each of the layers in our encoder and decoder contains a fully connected feed-forward network, which is applied to each position separately and identically. This consists of two linear transformations with a ReLU activation in between.

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

核心公式

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

参数规格
- 输入/输出维度:d_model = 512
- 内部隐藏层维度:d_ff = 2048(扩大了 4 倍)

讲解

前馈网络(FFN)是 Transformer 中另一个重要组件,补充注意力机制的不足:

  • 注意力机制做什么:在不同位置之间"传递和整合信息"——位置 i 的词学到了其他词的信息
  • FFN 做什么:在单个位置上做"深度加工"——对每个词的 512 维表示做非线性变换,提取更高级的特征

"逐位置(position-wise)"的含义:FFN 对序列中每个词独立地、用相同的参数执行。就像一道工序对流水线上的每个零件独立操作,但每个零件用的是相同的操作步骤。

内部扩展到 2048 维:先把 512 维扩展到 2048 维(第一个线性层),通过 ReLU 激活,再压缩回 512 维(第二个线性层)。这种"先扩展再压缩"的结构让模型有更大的表达空间来提取特征,类似于"先发散思维,再归纳总结"。

ReLU:一种激活函数,ReLU(x) = max(0, x),即负数变0,正数不变。它引入了非线性,让神经网络能学习复杂的函数关系。


3.4 嵌入与 Softmax(Embeddings and Softmax)

原文:Similarly to other sequence transduction models, we use learned embeddings to convert the input tokens and output tokens to vectors of dimension d_model. We also use the usual learned linear transformation and softmax function to convert the decoder output to predicted next-token probabilities. In our model, we share the same weight matrix between the two embedding layers and the pre-softmax linear transformation. In the embedding layers, we multiply those weights by √d_model.

翻译:与其他序列转换模型类似,我们使用可学习的嵌入(embeddings)将输入词元和输出词元转换为维度为 d_model 的向量。我们还使用通常的可学习线性变换和 softmax 函数将解码器输出转换为预测下一词元的概率。在我们的模型中,我们在两个嵌入层和预 softmax 线性变换之间共享同一权重矩阵。在嵌入层中,我们将这些权重乘以 √d_model。

讲解

词嵌入(Word Embedding):计算机不能直接处理文字,需要把词转成数字。嵌入层就是一个查找表:词汇表中每个词对应一个 512 维的向量,这个向量是训练过程中学习得到的。语义相近的词,其嵌入向量在空间中距离也接近。

共享权重矩阵:输入嵌入、输出嵌入、最后的 softmax 投影层,这三者共用同一个权重矩阵。为什么?因为它们本质上都在做"词汇表向量空间"相关的映射,共享参数可以减少模型参数量,同时让这三个操作保持一致性。

乘以 √d_model 的原因:嵌入层初始化时权重较小,乘以 √d_model(≈22.6)把嵌入向量的数值放大到与位置编码相近的量级,确保两者加和时数值均衡。

最后的 Softmax:解码器最终输出一个 d_model=512 维的向量,经过线性变换映射到词汇表大小(比如 32000 维),再经过 softmax 转成概率分布,选概率最高的词作为预测结果。


3.5 位置编码(Positional Encoding)

原文:Since our model contains no recurrence and no convolution, in order for the model to make use of the order of the sequence, we must inject some information about the relative or absolute position of the tokens in the sequence. To this end, we add "positional encodings" to the input embeddings at the bottoms of the encoder and decoder stacks. The positional encodings have the same dimension d_model as the embeddings, so that the two can be summed.

翻译:由于我们的模型不包含循环也不包含卷积,为了让模型能够利用序列的顺序信息,我们必须向序列中的词元注入一些关于其相对或绝对位置的信息。为此,我们在编码器和解码器栈的底部将"位置编码"加到输入嵌入中。位置编码与嵌入具有相同的维度 d_model,因此两者可以相加。

核心公式(正弦/余弦位置编码):

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

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

符号说明

符号 含义
pos 词在序列中的位置(0, 1, 2, ...)
i 嵌入向量的维度索引(0, 1, 2, ..., d_model/2-1)
2i 偶数维度(使用 sin)
2i+1 奇数维度(使用 cos)
10000 固定的基频常数

讲解

为什么需要位置编码? 这是 Transformer 一个关键问题。RNN 天然知道顺序(因为它按顺序处理),但 Transformer 的注意力机制是"无序"的——对于"我爱你"和"你爱我",如果不加位置信息,注意力机制看到的词袋是一样的。因此必须手动告诉模型"这个词在句子的第几位"。

为什么用正弦余弦函数?

直觉理解:把位置信息想象成一个时钟系统:
- 维度 0、1:像秒针,变化最快(频率最高)——区分相邻位置
- 维度 2、3:像分针,变化中等
- 维度 510、511:像年针,变化最慢——区分远距离位置

每个位置 pos 得到一个 512 维的向量,其中 256 对 sin/cos 以不同的频率编码位置信息。

关键性质
1. 相对位置可表示:对于固定的偏移量 k,PE_{pos+k} 可以用 PE_{pos} 的线性变换来表示。这让模型可以学到"位置 A 在位置 B 前面 k 步"这样的相对关系。
2. 可外推:正弦函数的值域是固定的(-1到1),因此对于训练时没见过的更长序列,位置编码仍然有意义。
3. 唯一性:每个位置的编码向量都不同,模型能区分不同位置。

为什么不用学习的位置嵌入? 作者实验发现,可学习的位置嵌入和正弦位置编码效果几乎一样,但正弦版本可以外推到更长序列,所以选择了正弦版本。


四、Why Self-Attention(为什么用自注意力)

三个维度的对比

原文:In this section we compare various aspects of self-attention layers to the recurrent and convolutional layers...We consider three desiderata: the total computational complexity per layer, the amount of computation that can be parallelized..., and the path length between long-range dependencies in the network.

翻译:在本节中,我们从多个方面比较自注意力层与循环层和卷积层……我们考虑三个标准:每层的总计算复杂度、可并行化的计算量,以及网络中长距离依赖之间的路径长度。

Table 1 对比(原论文 Table 1)

层类型 每层复杂度 顺序操作数 最长路径
自注意力(Self-Attention) O(n² · d) O(1) O(1)
循环(Recurrent) O(n · d²) O(n) O(n)
卷积(Convolutional) O(k · n · d²) O(1) O(log_k(n))
局部自注意力(restricted) O(r · n · d) O(1) O(n/r)

讲解

  • n:序列长度(句子中词的数量)
  • d:表示维度(d_model=512)
  • k:卷积核大小

逐行解读

  1. 自注意力:计算复杂度 O(n²·d)——每个词要和所有 n 个词计算注意力,有 n² 对;但顺序操作数 O(1)——所有计算可以完全并行!最长路径 O(1)——任意两个词可以直接"一步"互相关注,不需要经过中间节点。

  2. 循环层:计算复杂度 O(n·d²)——每步循环是个矩阵乘法 O(d²),共 n 步;但顺序操作数 O(n)——必须串行计算,无法并行;最长路径 O(n)——序列末尾的词要"影响"序列开头的词,信息需要经过 n 步传递,容易遗忘。

  3. 卷积层:卷积核大小为 k,一次只能看 k 个词,需要叠加 log_k(n) 层才能覆盖整个序列,所以最长路径是 O(log_k(n))。

自注意力的优势:当 n < d 时(实际中句子长度通常远小于512),自注意力比循环更快;且完全并行,GPU 利用率最高;任意两个词之间只需"一步"就能互相影响,长距离依赖建模能力最强。

自注意力的可解释性:作者还提到,自注意力层能产生更可解释的模型,可以观察到不同注意力头学到了不同的语法、语义关系。


五、Training(训练)

5.1 训练数据与批次

原文:We trained on the standard WMT 2014 English-German dataset consisting of about 4.5 million sentence pairs...Sentence pairs were batched together by approximate sequence length. Each training batch contained a set of sentence pairs containing approximately 25000 source tokens and 25000 target tokens.

翻译:我们使用标准的 WMT 2014 英德数据集进行训练,该数据集包含约 450 万个句子对……句子对按近似序列长度分批。每个训练批次包含约 25000 个源语言词元和 25000 个目标语言词元的句子对。

讲解
- WMT 2014:国际机器翻译评测数据集,英德约450万对句子,英法约3600万对。
- 字节对编码(BPE):原文使用 BPE 对词进行子词切分(比如"playing"切成"play"+"ing"),共享英德词汇表约37000个词元,英法使用词块(word-piece)编码约32000个词汇。
- 按长度分批:类似长度的句子放在同一批次,减少填充,提高效率。


5.2 硬件与训练时间

原文:We trained our models on one machine with 8 NVIDIA P100 GPUs. For our base models using the hyperparameters described throughout the paper, each training step took about 0.4 seconds. We trained the base models for a total of 100,000 steps or 12 hours. For our big models...step time was 1.0 seconds. The big models were trained for 300,000 steps (3.5 days).

翻译:我们在一台配备 8 块 NVIDIA P100 GPU 的机器上训练模型。对于使用论文中描述的超参数的基础模型,每个训练步骤约需 0.4 秒。我们共训练基础模型 100,000 步(即 12 小时)。对于大型模型……步骤时间为 1.0 秒,训练了 300,000 步(即 3.5 天)。

讲解
- 基础模型(base model):约1.5天 GPU 时间,3.5天是大型模型
- 对比当时其他方法需要数周的训练,这个效率优势是 Transformer 被广泛采用的重要原因之一


5.3 优化器设置

原文:We used the Adam optimizer with β₁=0.9, β₂=0.98 and ε=10⁻⁹. We varied the learning rate over the course of training, according to the formula: lrate = d_model^(−0.5) · min(step_num^(−0.5), step_num · warmup_steps^(−1.5)) with warmup_steps = 4000.

翻译:我们使用 Adam 优化器,参数 β₁=0.9,β₂=0.98,ε=10⁻⁹。我们在训练过程中按以下公式调整学习率:lrate = d_model^(−0.5) · min(step_num^(−0.5), step_num · warmup_steps^(−1.5)),其中 warmup_steps=4000。

学习率公式解析

$$lrate = d_{model}^{-0.5} \cdot \min\left(step_num^{-0.5},\ step_num \cdot warmup_steps^{-1.5}\right)$$

讲解

这个学习率调度策略非常有创意:

  • warmup 阶段(step_num < warmup_steps = 4000):学习率线性增长。训练初期参数很随机,用小学习率慢慢热身,避免一开始就大步走进错误方向。
  • decay 阶段(step_num > 4000):学习率按 step^(−0.5) 衰减(逐渐减小),让模型精细调整。

直觉:就像骑车——刚开始缓慢加速(warmup),到了高速后逐渐减速(decay)找到最优停靠点。

Adam 优化器:一种自适应学习率优化方法,比普通 SGD 收敛更快,现在已成为深度学习训练的标准选择。


5.4 正则化

原文:We apply dropout to the output of each sub-layer, before it is added to the sub-layer input and normalized. In addition, we apply dropout to the sums of the embeddings and the positional encodings in both the encoder and decoder stacks. For the base model, we use a rate of P_drop=0.1.

翻译:我们对每个子层的输出应用 dropout,在它被加到子层输入并归一化之前。此外,在编码器和解码器栈中,我们对嵌入和位置编码的求和结果也应用 dropout。基础模型使用的丢弃率为 P_drop=0.1。

讲解

Dropout(丢弃):训练时随机将10%的神经元输出设为0。强迫网络不能依赖任何单一神经元,从而学到更鲁棒的表示,防止过拟合。

标签平滑(Label Smoothing,ε_ls=0.1):训练时不用硬标签(正确答案概率=1,其他=0),而是软化为(正确答案=0.9,其他词均分0.1)。这让模型不要太"自信",提高泛化能力,但会损失一点困惑度(perplexity)指标——这是准确率和校准度之间的权衡。


六、Results(实验结果)

6.1 机器翻译结果(Table 2)

原文:The big transformer model outperforms the best previously reported models (including ensembles) by more than 2.0 BLEU, establishing a new state-of-the-art BLEU score of 28.4 on the WMT 2014 English-to-German translation task...Our big model achieves a BLEU score of 41.8 on the English-to-French translation task, outperforming all of the previously published single models, at less than 1/4 the training cost of the previous state of the art model.

翻译:大型 Transformer 模型在 WMT 2014 英德翻译任务上以超过 2.0 BLEU 的优势超越了此前所有已报告的最佳模型(包括集成模型),建立了 28.4 BLEU 的新最优成绩……我们的大型模型在英法翻译任务上达到 41.8 BLEU,超越了所有此前发表的单模型,而训练代价不足此前最佳模型的四分之一。

主要结果对比(Table 2 关键数据)

模型 EN-DE BLEU EN-FR BLEU 训练代价(FLOPs)
ByteNet 23.75 - -
Deep-Att + PosUnk Ensemble - 39.2 -
GNMT + RL(集成) 26.30 41.16 1.4×10²⁰
ConvS2S(集成) 26.36 40.46 1.5×10²⁰
Transformer(base) 27.3 38.1 3.3×10¹⁸
Transformer(big) 28.4 41.8 2.3×10¹⁹

讲解
- Transformer (big) 英德翻译 28.4 BLEU,比最强集成模型高 2 分以上
- 英法翻译 41.8 BLEU,超越所有单模型
- 训练代价(FLOPs)仅为竞争对手的 1/6 到 1/7
- 这张表格证明了:Transformer 既快又好,是真正的突破


6.2 模型变体消融实验(Table 3)

原文:To evaluate the importance of different components of the Transformer, we varied our base model in different ways, measuring the change in performance on English-to-German translation on the development set...we observe that while single-head attention is 0.9 BLEU worse than the best setting, quality also drops off with too many heads.

翻译:为了评估 Transformer 各组件的重要性,我们以不同方式对基础模型进行变体实验,测量在英德翻译开发集上的性能变化……我们观察到,单头注意力比最佳设置差 0.9 BLEU,但头数过多时质量也会下降。

讲解
消融实验(ablation study)逐一移除或改变各个组件,验证每个设计选择的贡献:

  • 注意力头数:h=1 时差 0.9 BLEU,h=8 最优,h=16 又有所下降——太少不够,太多也浪费
  • d_k 大小:减小 d_k 会损害模型质量,说明注意力计算的精度很重要
  • 大模型更好:增加层数和维度确实有帮助
  • Dropout 有效:去掉 dropout 后性能下降
  • 位置编码:可学习的嵌入位置编码与固定正弦位置编码效果几乎相同

6.3 英语句法分析(English Constituency Parsing)

原文:To evaluate if the Transformer can generalize to other tasks we performed experiments on English constituency parsing...a 4-layer transformer with d_model = 1024 performed surprisingly well, outperforming the BerkeleyParser even when training only on the WSJ training set of 40K sentences.

翻译:为了评估 Transformer 是否能泛化到其他任务,我们在英语成分句法分析上进行了实验……一个 d_model=1024 的 4 层 Transformer 表现出色,即使只在 4 万个句子的 WSJ 训练集上训练,也超越了 BerkeleyParser。

讲解
这个实验很重要,它表明 Transformer 不只适合翻译,也适合其他 NLP 任务(句法分析是结构预测任务)。这预示了 Transformer 将成为通用 NLP 基础架构——后来 BERT、GPT 等都验证了这一点。


七、Conclusion(结论)

原文:In this work, we presented the Transformer, the first sequence transduction model based entirely on attention, replacing the recurrent layers most commonly used in encoder-decoder architectures with multi-headed self-attention...The Transformer can be trained significantly faster than architectures based on recurrent or convolutional layers. We achieved a new state of the art on English-to-German and English-to-French translation tasks. We are excited about the future of attention-based models and plan to apply them to other tasks...We also plan to investigate local, restricted attention mechanisms to efficiently handle large inputs and outputs such as images, audio and video.

翻译:在本文中,我们提出了 Transformer,这是第一个完全基于注意力的序列转换模型,用多头自注意力替代了编码器-解码器架构中最常用的循环层……Transformer 的训练速度明显快于基于循环或卷积层的架构。我们在英德和英法翻译任务上达到了新的最优水平。我们对基于注意力的模型的未来充满期待,并计划将其应用于其他任务……我们还计划研究局部受限注意力机制,以有效处理图像、音频和视频等大型输入输出。

讲解

结论部分作者的展望惊人地准确:
- "应用于其他任务"——后来 BERT(2018)把 Transformer 用于文本理解,GPT 系列用于文本生成,ViT 用于图像识别
- "局部受限注意力机制"——后来发展出了 Longformer、BigBird 等处理超长序列的方法
- Transformer 的影响远超机器翻译,成为了整个深度学习领域最重要的架构


附录:核心概念速查表

术语 英文 一句话解释
注意力机制 Attention Mechanism 让模型学会"关注哪里"的加权求和机制
自注意力 Self-Attention 序列内部每个位置互相关注,捕捉上下文
多头注意力 Multi-Head Attention 同时从多个角度计算注意力,增强表达能力
缩放点积注意力 Scaled Dot-Product Attention 用点积计算相似度并除以√d_k防止梯度消失
编码器 Encoder 理解输入序列,输出每个位置的表示向量
解码器 Decoder 基于编码器输出逐步生成目标序列
位置编码 Positional Encoding 用正弦/余弦函数为每个位置注入位置信息
残差连接 Residual Connection 将输入直接加到子层输出,防止梯度消失
层归一化 Layer Normalization 对每个样本的特征维度做归一化,稳定训练
前馈网络 Feed-Forward Network 两层线性变换+ReLU,对每个位置独立处理
掩码 Masking 将未来位置的注意力权重设为-∞防止"偷看"
BLEU BLEU Score 机器翻译自动评分,越高越好
词元/词元 Token 文本的基本处理单元,可以是词或子词
嵌入 Embedding 将离散词映射为连续向量的可学习查找表
Dropout Dropout 训练时随机丢弃神经元输出,防止过拟合
d_model d_model 模型隐藏层维度,论文中取512
d_ff d_ff 前馈网络内部维度,论文中取2048
d_k, d_v d_k, d_v 注意力的键/值维度,多头时=d_model/h=64
h h 注意力头数,论文中取8
N N 编码器/解码器层数,论文中取6

附录:架构超参数总结

参数 基础模型 大型模型
层数 N 6 6
d_model 512 1024
d_ff 2048 4096
注意力头数 h 8 16
d_k = d_v 64 64
Dropout 0.1 0.3
训练步数 100K(12小时) 300K(3.5天)
EN-DE BLEU 27.3 28.4
EN-FR BLEU 38.1 41.8

精读完成。本文约 10000 字,覆盖论文 Abstract、Introduction、Model Architecture(全部子章节)、Training、Results、Conclusion 章节。