《Attention Is All You Need》阅读笔记

论文:Ashish Vaswani 等,Attention Is All You Need,2017。 阅读版本:arXiv:1706.03762v7 论文 PDF:Attention Is All You Need

写在前面

今天回看这篇论文,最容易犯的错误,是带着大语言模型已经成功的结论去阅读它。2017 年的作者并不是在回答“怎样构造通用智能”,而是在解决一个更具体的问题:序列到序列任务是否必须依赖循环或卷积,才能建模输入与输出之间的关系?

论文给出的答案是 Transformer:用注意力机制承担主要的信息交互,再配合位置编码、前馈网络、残差连接与归一化,完全移除循环和卷积。

我的核心感受是:这篇论文真正重要的地方,不只是提出了一个新模块,而是重新安排了序列模型的计算路径。过去模型让信息沿时间步或卷积层逐步传播,Transformer 则让任意两个位置可以通过一次注意力计算直接交换信息。

一、论文想解决什么问题

1. 当时的主流方案

论文发表时,机器翻译等序列转换任务通常采用编码器—解码器结构,其中主体是 RNN、LSTM、GRU 或卷积网络。注意力机制已经存在,但更多是附着在循环网络上的辅助组件。

这些模型面临两类结构性问题:

  1. 训练难以充分并行。 循环网络的第 tt 个状态依赖第 t1t-1 个状态,时间步之间存在串行依赖。
  2. 长距离信息路径较长。 两个相距很远的词,往往需要经过多个循环状态或卷积层才能发生信息交互。

2. 论文的核心假设

作者提出:如果注意力已经能够根据内容动态连接任意位置,那么是否可以让它成为主体,而不再依赖循环或卷积?

这个假设带来三项直接目标:

  • 缩短长距离依赖的传播路径;
  • 提高训练阶段的并行度;
  • 在机器翻译质量不下降的前提下减少训练成本。

二、先看 Transformer 全景

原始 Transformer 是一个完整的编码器—解码器模型:

Transformer 编码器—解码器总体架构,左侧为编码器,右侧为带掩码自注意力和交叉注意力的解码器

图 1:原始 Transformer 模型架构。截取自 Vaswani 等人的原论文 Figure 1;左侧编码器和右侧解码器均重复堆叠 NN 层。

这张图最值得沿着箭头阅读:左侧编码器把输入序列变成上下文化表示;右侧解码器先读取已生成的目标序列,再通过中间的编码器—解码器注意力读取源序列,最后输出下一个词的概率。

每个编码器层包含:

  1. 多头自注意力;
  2. 逐位置前馈网络。

每个解码器层包含:

  1. 带因果掩码的多头自注意力;
  2. 编码器—解码器注意力;
  3. 逐位置前馈网络。

每个子层外部都有残差连接和 Layer Normalization。论文采用的写法是:

LayerNorm(x+Sublayer(x))\operatorname{LayerNorm}(x+\operatorname{Sublayer}(x))

这属于后来常说的 Post-LN 结构:先做残差相加,再归一化。现代大模型常使用 Pre-LN 或 RMSNorm,因此阅读论文时不能把今天常见的实现细节自动投射回原始版本。

三、核心机制:缩放点积注意力

1. Q、K、V 的角色

输入表示经过三个可学习投影,得到 Query、Key 和 Value:

Q=XWQ,K=XWK,V=XWVQ=XW_Q,\qquad K=XW_K,\qquad V=XW_V

我的理解是:

  • QQ 表示当前位置正在寻找什么;
  • KK 表示每个位置可以凭什么被匹配;
  • VV 表示匹配后实际传递什么内容。

Q、K 共同完成“寻址”,V 负责“取值”。把匹配依据与传递内容分开,是注意力机制具有表达力的重要原因。

2. 公式

论文使用缩放点积注意力:

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

计算过程可以拆成四步:

  1. QKTQK^\mathsf{T} 计算查询与所有键之间的匹配分数;
  2. 除以 dk\sqrt{d_k}
  3. 使用 Softmax 把分数转为权重;
  4. 按权重汇总所有 Value。

缩放点积注意力与多头注意力的计算结构

图 2:缩放点积注意力与多头注意力。截取自原论文 Figure 2。左图对应从 QKTQK^\mathsf{T}、缩放、可选掩码、Softmax 到加权 VV 的计算链;右图展示多组线性投影如何并行进入多个注意力头。

3. 为什么除以 dk\sqrt{d_k}

当向量维度增加时,点积的绝对值通常会变大,Softmax 容易进入梯度很小的饱和区域。缩放因子用于控制分数尺度,使优化更稳定。

这不是为了让权重之和等于 1——Softmax 本身已经完成归一化;它主要解决的是输入 Softmax 前的数值尺度问题。

四、多头注意力为什么重要

Transformer 并不是只计算一次注意力,而是把表示投影到多个子空间中并行计算:

headi=Attention(QWiQ,KWiK,VWiV)\text{head}_i=\operatorname{Attention}(QW_i^Q,KW_i^K,VW_i^V) MultiHead(Q,K,V)=Concat(head1,,headh)WO\operatorname{MultiHead}(Q,K,V)= \operatorname{Concat}(\text{head}_1,\ldots,\text{head}_h)W^O

原始基础模型采用 h=8h=8 个头,dmodel=512d_{model}=512,每个头的 dk=dv=64d_k=d_v=64。由于各头维度之和仍为 512,多头设计不等于把主体维度简单扩大八倍。

我的理解是,多头注意力提供了多个并行的关系建模通道。不同头有机会学习局部搭配、句法关系、指代或远距离依赖,但这只是能力上的可能性,不能保证每个头都具有稳定且可命名的人类语义。

论文中的长距离依赖可视化

编码器自注意力追踪长距离依赖的可视化,其中 making 与 more difficult 等远距离词产生较强连接

图 3:编码器第 5 层自注意力中的长距离依赖示例。截取自原论文 Figure 3;不同颜色代表不同注意力头。

原图考察单词 “making” 的注意力连接,其中一些头对远处的 “more difficult” 给出较强权重。它直观展示了自注意力如何让相距较远的位置直接交换信息。不过,这类图只能说明某层某头的信息连接模式,不能单独证明模型预测的完整因果机制。

五、三种注意力各做什么

1. 编码器自注意力

Q、K、V 都来自编码器上一层输出。源序列中的每个位置都可以读取其他位置,用于形成上下文化表示。

2. 解码器掩码自注意力

Q、K、V 都来自解码器,但会加入因果掩码。生成第 tt 个词时,只能读取第 tt 个及之前的位置,不能偷看未来答案。

在 Softmax 前,可以把未来位置对应的分数设为负无穷:

softmax(QKTdk+M)\operatorname{softmax}\left(\frac{QK^\mathsf{T}}{\sqrt{d_k}}+M\right)

其中 MM 在允许访问的位置取 0,在禁止访问的位置取 -\infty

3. 编码器—解码器注意力

Q 来自解码器,K 和 V 来自编码器输出。它让目标序列在生成时读取源序列信息,也就是传统序列到序列模型中的交叉注意力。

六、注意力之外不可忽略的组件

标题容易让人误以为模型“只有注意力”,其实 Transformer 还依赖多个关键组件。

1. 逐位置前馈网络

每个位置独立通过同一组两层全连接网络:

FFN(x)=max(0,xW1+b1)W2+b2\operatorname{FFN}(x)=\max(0,xW_1+b_1)W_2+b_2

基础模型中,内部维度从 dmodel=512d_{model}=512 扩展到 dff=2048d_{ff}=2048,再投影回 512。注意力负责位置之间的信息混合,FFN 负责每个位置内部的非线性特征变换。

2. 位置编码

自注意力本身没有递归顺序,必须显式注入位置信息。论文使用正弦、余弦位置编码:

PE(pos,2i)=sin(pos/100002i/dmodel)PE_{(pos,2i)}=\sin\left(pos/10000^{2i/d_{model}}\right) PE(pos,2i+1)=cos(pos/100002i/dmodel)PE_{(pos,2i+1)}=\cos\left(pos/10000^{2i/d_{model}}\right)

作者也实验了可学习位置嵌入,并报告两者结果相近;选择正弦位置编码的一个考虑,是希望模型可能外推到训练时未见过的更长序列。

3. 残差、归一化与 Dropout

残差连接帮助深层网络保留信息和传播梯度,Layer Normalization 稳定中间表示,Dropout 用于正则化。基础模型的 Dropout 率为 0.1。

因此,“Attention Is All You Need”更像一个有力量的研究宣言,而不是逐字准确的组件清单。

七、论文为什么强调计算路径

论文从每层计算复杂度、可并行操作数量和长距离依赖的最大路径长度比较自注意力、循环层与卷积层。

设序列长度为 nn,表示维度为 dd

层类型每层复杂度顺序操作数最大路径长度
自注意力O(n2d)O(n^2d)O(1)O(1)O(1)O(1)
循环层O(nd2)O(nd^2)O(n)O(n)O(n)O(n)
卷积层依卷积核而定O(1)O(1)通常大于 O(1)O(1)

这张表是理解论文动机的关键,但也要注意边界:当 nn 远大于 dd 时,自注意力的 n2n^2 项会变得昂贵。它解决了并行与路径长度问题,却把长序列成本集中到了注意力矩阵上。

八、训练配置与论文结果

1. 基础模型配置

论文中的 Transformer Base 主要参数为:

项目设置
编码器层数6
解码器层数6
dmodeld_{model}512
注意力头数8
dk,dvd_k,d_v64
dffd_{ff}2048
Dropout0.1
标签平滑0.1

优化器使用 Adam,论文给出的超参数为 β1=0.9\beta_1=0.9β2=0.98\beta_2=0.98ϵ=109\epsilon=10^{-9}。学习率先进行 4000 步 warmup,之后按步数的平方根倒数衰减:

lrate=dmodel0.5min(step0.5,stepwarmup_steps1.5)lrate=d_{model}^{-0.5}\cdot \min(step^{-0.5},step\cdot warmup\_steps^{-1.5})

2. 论文报告的结果

论文在 WMT 2014 英德翻译任务上报告 28.4 BLEU,在英法翻译任务上报告 41.8 BLEU。作者同时强调训练并行性和成本优势,并展示模型可迁移到英语成分句法分析任务。

这些数字应放回 2017 年的数据处理、硬件、评测脚本和对比系统中理解。它们证明了当时的实验主张,但不适合作为今天模型性能的直接基准。

九、我认为最关键的贡献

1. 把注意力从辅助模块提升为主干

论文之前已有注意力机制。真正的突破不是“第一次发明注意力”,而是证明一个完全以注意力为核心的编码器—解码器可以在重要任务上成立。

2. 改变序列模型的并行方式

移除时间步递归后,一个训练样本的多个位置可以同时计算。这种结构更适合 GPU/TPU 的矩阵运算,也为后续扩大数据、模型和算力规模创造了条件。

3. 建立高度可复用的模块接口

注意力、FFN、残差和归一化组成规则、重复的积木。后来研究可以替换位置编码、注意力模式、归一化、激活函数或训练目标,而不必放弃整个架构。

4. 让“关系”成为动态计算结果

卷积的连接模式主要由局部窗口预先规定,循环模型的信息路径由时间顺序规定;自注意力则根据当前输入动态计算位置之间的连接强度。这种内容寻址能力是 Transformer 通用性的一个来源。

十、阅读中容易产生的误解

误解 1:论文发明了所有注意力机制

不是。注意力在神经机器翻译中已有重要工作。本文的贡献重点是仅依靠注意力构建主干架构。

误解 2:注意力权重就是模型解释

注意力权重描述某一层某一头中的信息混合比例,但最终预测还受到多层残差、FFN、输出投影等影响。把热力图直接视为完整因果解释并不可靠。

误解 3:多头一定各司其职

不同头可以学习不同模式,但可能存在冗余,也不保证每个头都能被赋予清晰语义。

误解 4:Transformer 天然知道顺序

标准自注意力对位置排列没有足够的顺序感知,必须加入位置编码或其他位置机制。

误解 5:标题意味着其他组件不重要

没有 FFN、残差、归一化、位置编码、掩码、优化策略和数据处理,原始 Transformer 并不能按论文方式工作。

十一、局限与后来的变化

1. 二次复杂度

标准全局注意力需要构造 n×nn\times n 的分数矩阵,序列增长时计算和显存成本迅速增加。后续工作从稀疏注意力、局部窗口、线性注意力和高效内核等方向改进这一问题。

2. 原始位置编码不是终点

正弦绝对位置编码具有简洁性,但后续模型广泛探索相对位置、旋转位置编码等方案。原论文提供了起点,而不是最终答案。

3. 原始架构与现代大语言模型并不相同

原论文是面向机器翻译的编码器—解码器。很多生成式大语言模型采用仅解码器结构,同时在归一化、激活函数、位置表示、注意力实现和训练目标上都有显著变化。

4. 并行优势不等于推理完全并行

训练时,已知完整目标序列,可以通过掩码并行计算各位置;自回归生成时,下一个 token 仍依赖此前 token,解码过程依旧逐步进行。KV Cache 可以减少重复计算,但不会消除自回归依赖。

十二、如果我要复现这篇论文

我会按下面的顺序推进,而不是一开始追求完整 WMT 指标:

  1. 用小张量手写单头缩放点积注意力,逐项检查形状;
  2. 加入多头拆分、拼接和输出投影;
  3. 实现因果掩码与 Padding Mask,并用可控样例验证;
  4. 组合编码器层和解码器层,确认残差与归一化位置;
  5. 在小型复制任务或字符级翻译任务上过拟合一个 batch;
  6. 加入论文学习率调度、标签平滑和权重共享;
  7. 最后再处理 WMT 数据、分词、批次策略与 BLEU 评测。

实现时最值得持续打印的是张量形状:

输入:          [batch, seq_len, d_model]
拆分多头后:    [batch, heads, seq_len, d_head]
注意力分数:    [batch, heads, query_len, key_len]
加权结果:      [batch, heads, query_len, d_head]
拼接后:        [batch, query_len, d_model]

十三、我的阅读结论

这篇论文的价值可以概括为三层:

  1. 模型层面: 提出了不依赖循环和卷积的 Transformer 编码器—解码器;
  2. 计算层面: 用全局、动态、可并行的关系计算替代逐时间步传播;
  3. 研究层面: 提供了一套易于缩放和改造的通用架构积木。

如果只记住 QKTQK^\mathsf{T} 的公式,就会低估这篇论文。它最深远的改变,是把序列建模从“沿着序列逐步传递状态”,转向“让所有位置直接协商应该从哪里读取信息”。

不过,论文标题中的“All”也应谨慎理解:Attention 是结构核心,但模型的成功来自一整套设计共同工作。保持这种区分,既能看到论文的突破,也不会把历史叙事简化成一句口号。

延伸阅读

阅读信息

  • 阅读日期:2026-07-16
  • 系列:经典论文选读
  • 系列序号:第 1 篇
  • 关键词:Transformer、Self-Attention、Multi-Head Attention、位置编码、机器翻译