2017 年,Google Brain 八位作者用一篇仅 15 页的论文,用一句"注意力就是你需要的全部",彻底改写了序列建模的规则——从此 RNN 和卷积在序列任务上退场。Transformer 这一架构在五年内催生了 BERT、GPT、ChatGPT、Claude,几乎所有今天你听过的大模型。本文是这篇论文的中文精校版,逐章讲透:自注意力是什么、缩放点积怎么算、多头注意力为什么必要、位置编码用了什么妙招,以及为什么这套设计在质量、并行度、训练速度上全面碾压了 RNN。
在 2017 年之前,序列建模的霸主是 RNN、LSTM、GRU 这类循环神经网络。它们的根本问题:必须按时间步顺序计算,无法并行;而且长距离依赖很难学。
注意力机制让模型可以建立任意距离的依赖关系,但此前大多与 RNN 配合使用——仍未摆脱顺序计算的桎梏。
这篇论文提出:完全抛弃循环和卷积,只用注意力机制,构建一个可以高度并行训练的序列转录架构。
在 2017 年之前,如果你想做机器翻译、文本摘要、语音识别这类"把一个序列映射到另一个序列"的任务,标准做法是用循环神经网络——尤其是 LSTM 和 GRU。它们是当时序列建模和转录任务的 SOTA。
但 RNN 有一个绕不开的痛点。它的计算沿着序列位置展开:当前位置的隐状态 $h_t$ 是上一位置 $h_{t-1}$ 和当前输入的函数。换句话说,第 $t$ 步必须等第 $t-1$ 步算完才能开始。这种内禀的顺序性,使得训练样本内部无法并行——在序列变长时尤其致命,因为内存约束会限制批次大小。
当时注意力机制已经成为序列模型的必备组件,因为它能无视距离地建立依赖关系——句首和句尾的两个词,不再像 RNN 那样需要通过中间几十个时间步辗转传递信号。但绝大多数工作里,注意力是和 RNN 一起用的,没有摆脱顺序计算的根本约束。
这篇论文的贡献,是完全抛弃了循环结构。Transformer 仅仅依赖注意力机制,就建立起了输入和输出之间的全局依赖。这带来两件事:第一,并行度大幅提高;第二,在八块 P100 GPU 上仅训练 12 小时,就达到了新的翻译质量 SOTA。
注意力机制已经被广泛使用,但几乎总是和循环网络绑在一起。
我们提出的 Transformer,完全摒弃循环,只靠注意力。
Transformer 保留了 seq2seq 时代的编码器-解码器结构,但两边各 6 层完全由注意力 + 前馈网络组成。编码器把输入序列映射为连续表示,解码器以自回归的方式逐位置生成输出。
大多数有竞争力的序列转录模型都是编码器-解码器结构。编码器把输入符号序列 $(x_1, ..., x_n)$ 映射到一个连续表示序列 $z = (z_1, ..., z_n)$。给定 $z$,解码器一次生成一个输出符号 $(y_1, ..., y_m)$。每一步都是自回归的——把已生成的符号作为额外输入,再生成下一个。
Transformer 沿用了这个总体框架,但用堆叠的自注意力层 + 位置式全连接层替代了之前的 RNN 或 CNN。整个网络的左半边是编码器,右半边是解码器。
编码器由 $N = 6$ 层相同结构堆叠而成。每层有两个子层:第一个是多头自注意力机制,第二个是一个位置式的全连接前馈网络。每个子层周围加一个残差连接,后接 Layer Normalization。也就是说,每个子层的输出形式是:
其中 $\text{Sublayer}(x)$ 是子层本身实现的函数。为了支持这种残差连接,所有子层(包括嵌入层)的输出维度都统一为 $d_{model} = 512$。
解码器也由 $N = 6$ 层堆叠。除了编码器里的两个子层之外,解码器在中间插入了第三个子层——对编码器输出做多头注意力。我们仍然在每个子层周围加残差连接和 LayerNorm。
关键的一点:我们要修改解码器里的自注意力子层,阻止某个位置注意到它之后的位置。这个掩码操作,再加上输出嵌入整体右移一位的设定,保证了对位置 $i$ 的预测,只能依赖位置 $i$ 之前的已知输出。这就是自回归生成的关键约束。
注意力的本质:把一个 Query 和一组 Key-Value 对 映射成一个输出。输出是 Value 的加权和,权重由 Query 和对应 Key 的兼容性函数计算。缩放因子 $1/\sqrt{d_k}$ 是防止 softmax 进入梯度极小区的关键技巧。
一个注意力函数,可以描述为:把一个 Query 和一组 Key-Value 对,映射成一个输出。其中 Query、Keys、Values、输出全都是向量。输出被计算成 Values 的加权和——而权重,由 Query 和对应 Key 之间的"兼容性函数"算出来。
论文给这个特定形式起了名字叫 "Scaled Dot-Product Attention"(缩放点积注意力)。输入是维度 $d_k$ 的 Queries 和 Keys,以及维度 $d_v$ 的 Values。我们计算 Query 和所有 Keys 的点积,每个除以 $\sqrt{d_k}$,再应用 softmax 得到 Values 的权重。
实际中,我们会把一批 Queries 打包成矩阵 $Q$,把 Keys 和 Values 也分别打包成矩阵 $K$ 和 $V$,一次计算所有的输出:
这是整篇论文最核心的一个公式。让我们慢慢拆解。$Q K^T$ 计算所有 Query 和所有 Key 的点积相似度,得到一个 $n \times n$ 的"相似度矩阵"。除以 $\sqrt{d_k}$ 做缩放,然后用 softmax 把每一行归一化成概率分布。最后乘以 $V$,得到每个位置的"加权 Values 和"。
注意力函数有两种常见形式:加性注意力和点积(乘性)注意力。点积注意力跟我们用的几乎一样,只是没有 $1/\sqrt{d_k}$ 的缩放因子。加性注意力用一个带单隐层的前馈网络计算兼容性函数。两种在理论复杂度上类似,但点积注意力实际中快得多、内存也省,因为可以用高度优化的矩阵乘法代码来实现。
对于较小的 $d_k$,两种机制表现差不多;但对于较大的 $d_k$,不带缩放的点积注意力会比加性注意力差。我们怀疑:当 $d_k$ 变大时,点积的幅度会变大,把 softmax 推到梯度极小的区域。为了对抗这个效应,我们用 $1/\sqrt{d_k}$ 做缩放。
直观解释:假设 $q$ 和 $k$ 的每个分量都是均值 0、方差 1 的独立随机变量,那么它们的点积 $q \cdot k$ 均值为 0、方差为 $d_k$。所以 $d_k$ 越大,点积的数量级越大——softmax 会饱和。
与其用 $d_{model}$ 维做一次大注意力,不如把 Q、K、V 用不同的可学习线性投影投到 $h$ 份较低维度的子空间,每个子空间并行做注意力,再拼接结果。这样模型可以同时关注不同表示子空间中、不同位置的信息——单头注意力会因为平均而抑制这种多样性。
与其用 $d_{model}$ 维的 Keys、Values、Queries 做一次注意力,作者发现:把它们线性投影 $h$ 次——每次用不同的可学习线性投影投到 $d_k$、$d_k$、$d_v$ 维,然后并行地做注意力,得到 $h$ 个 $d_v$ 维的输出。把这些拼接起来,再做一次投影,得到最终结果:
这里的投影矩阵是参数:$W_i^Q \in \mathbb{R}^{d_{model} \times d_k}$,$W_i^K \in \mathbb{R}^{d_{model} \times d_k}$,$W_i^V \in \mathbb{R}^{d_{model} \times d_v}$,$W^O \in \mathbb{R}^{h d_v \times d_{model}}$。
论文用了 $h = 8$ 个并行注意力头。对每个头,$d_k = d_v = d_{model} / h = 64$。由于每个头的维度变小了,总计算成本和单头但全维度的注意力相当。
多头注意力让模型可以同时关注
不同位置、不同表示子空间里的信息。
单头注意力的"平均效应",会抑制这种多样性。
Transformer 用了三种不同方式的多头注意力:
第一种,编码器-解码器注意力。Queries 来自上一层的解码器,而 Keys 和 Values 来自编码器的输出。这让解码器的每个位置都能"看到"输入序列的所有位置——这正是经典 seq2seq 里那种编码器-解码器对齐的本质。
第二种,编码器里的自注意力。Keys、Values、Queries 都来自同一个地方——上一层编码器的输出。编码器里的每个位置都能注意到前一层所有位置。
第三种,解码器里的(带掩码)自注意力。同样让每个位置能注意到所有之前的位置,但必须阻止"看到未来"——通过在 softmax 输入里把非法连接的位置设为 $-\infty$ 实现。
注意力机制本身没有时序——把序列打乱,输出不变。要让模型理解"语序",必须把位置信息显式注入嵌入向量里。论文选用了不同频率的正弦/余弦函数,因为这种形式让模型容易学到"相对位置",而且能推广到比训练时更长的序列。
这里有一个非常微妙的问题:Transformer 没有循环、没有卷积——它本质上对输入顺序是不敏感的。把句子里的词打乱顺序,自注意力的计算结果一模一样。但词的顺序对语义至关重要——"狗咬人"和"人咬狗"完全不同。
为了让模型利用序列顺序信息,必须显式注入"位置"。论文的方案是把"位置编码"加到输入嵌入上——位置编码的维度和嵌入维度 $d_{model}$ 相同,可以直接相加。
位置编码有许多种选择,包括"学到的"和"固定的"。论文使用了不同频率的正弦和余弦函数:
其中 $pos$ 是位置,$i$ 是维度。位置编码每个维度都对应一个正弦曲线,波长从 $2\pi$ 到 $10000 \cdot 2\pi$ 按几何级数排列。
论文给了两个理由。第一,对任何固定的偏移量 $k$,$PE_{pos+k}$ 都能表示成 $PE_{pos}$ 的线性函数——这让模型很容易学到"相对位置"的概念。第二,正弦版本可以外推到比训练时更长的序列——位置编码不需要训练,纯靠数学定义。
作者也实验过学到的位置嵌入,两种方案结果几乎一样(见消融表中的 (E) 行)。最终选择正弦版本,是出于可外推性的考虑。
作者用三个维度对比了自注意力、循环、卷积三种层:每层计算复杂度、可并行化的计算量、长距离依赖的"路径长度"。结论:自注意力在第二和第三项上全面胜出——尤其是路径长度只有 $O(1)$,意味着任何两个位置之间一步直达。
为什么要选自注意力?作者从三个维度对比了自注意力层、循环层、卷积层。
第一,每层的总计算复杂度。第二,可以被并行化的计算量——以"所需的最少顺序操作数"来衡量。第三,网络中长距离依赖的路径长度。
第三点尤其关键。学习长距离依赖,是许多序列转录任务的关键挑战。影响这种学习能力的一个重要因素,就是信号在网络里前向和反向必须穿越的路径长度。路径越短,越容易学到长距离依赖。
看下面这张表(论文里的 Table 1):
| 层类型 | 每层复杂度 | 顺序操作数 | 最大路径长度 |
|---|---|---|---|
| 自注意力 | $O(n^2 \cdot d)$ | $O(1)$ | $O(1)$ |
| 循环 (RNN) | $O(n \cdot d^2)$ | $O(n)$ | $O(n)$ |
| 卷积 | $O(k \cdot n \cdot d^2)$ | $O(1)$ | $O(\log_k(n))$ |
| 自注意力(受限到邻域 $r$) | $O(r \cdot n \cdot d)$ | $O(1)$ | $O(n/r)$ |
自注意力层用常数次顺序操作就把所有位置连起来;而循环层需要 $O(n)$ 次顺序操作。在计算复杂度方面,当序列长度 $n$ 小于表示维度 $d$ 时——这通常是机器翻译里词片表示的情形——自注意力比循环更快。
作为附带好处,自注意力可能产生更可解释的模型。论文检查了模型的注意力分布,发现不仅每个头能明显学到不同的任务,而且许多头表现出与句法和语义结构相关的行为——比如指代消解、动词与远距离修饰语的关联。
训练数据用了 WMT 2014 标准数据集——英德 450 万句子对,英法 3600 万句子对。词表用字节对编码(BPE),英德 37000 token,英法 32000 token。
硬件方面,作者用了一台装有 8 块 NVIDIA P100 GPU 的机器。对于使用文中超参的基础模型,每步训练约 0.4 秒,训练 10 万步约 12 小时。对于大模型,每步约 1.0 秒,训练 30 万步约 3.5 天。
优化器用 Adam,关键参数 $\beta_1 = 0.9$、$\beta_2 = 0.98$、$\epsilon = 10^{-9}$。学习率不是固定的,而是按下面的公式变化:
这等于在前 4000 步里线性增加学习率("热身"),之后按步数的反平方根衰减。这个"热身 + 衰减"配方后来被大量后续工作沿用。
正则化用了三招:第一,Residual Dropout——每个子层输出在加到子层输入并归一化之前,先做 dropout,基础模型用 $P_{drop} = 0.1$。第二,对嵌入和位置编码相加之后做 dropout。第三,Label Smoothing,平滑值 $\epsilon_{ls} = 0.1$——这会让 perplexity 变差,但准确率和 BLEU 反而提升。
结果令人震撼:在 WMT 2014 英德翻译上,大模型拿到 28.4 BLEU,比之前所有公开报告的模型(包括集成)高出 2 分以上。在英法翻译上,单模型拿到 41.8 BLEU,而训练成本不到之前 SOTA 的四分之一。
论文做了详尽的消融研究,关键发现:
· 单头注意力比最佳设置差 0.9 BLEU;但太多头也会变差
· 减小 attention key 的维度 $d_k$ 会伤害质量——说明"兼容性"的计算不是那么简单
· 模型越大越好;dropout 对避免过拟合非常关键
· 把正弦位置编码换成学到的位置嵌入,结果几乎一样
更令人惊讶的是泛化能力——作者把 4 层 Transformer 用在英文短语结构解析(WSJ Penn Treebank)上,几乎没有任务特定的调参,居然在小数据(仅 4 万句)和半监督设定下都超过了大多数之前的方法。这说明 Transformer 的设计不是机器翻译的特例,而是通用的序列建模工具。
这篇论文表面上是一个机器翻译模型的改进,实际上是 AI 历史的转折点。它做了三件事:第一,证明纯注意力架构可以全面超越 RNN;第二,开启了大规模并行训练的可能,让后续的百亿、千亿参数模型成为现实;第三,论文末尾那句"我们计划把 Transformer 应用到图像、音频、视频"——精准预言了之后五年的 AI 路线图。
2017 年 6 月,这篇论文挂上 arXiv 时,没有人意识到它会改变什么。它的标题甚至带着一丝俏皮——《Attention Is All You Need》(注意力就是你需要的全部)。
但回头看,这是过去十年里最重要的一篇 AI 论文,没有之一。它做了三件深远的事。
第一件,证明纯注意力架构可以全面超越 RNN。在当时,把 RNN 彻底扔掉是反共识的——业界默认序列任务就该用 RNN。这篇论文用 BLEU 分数和训练成本数据说服了所有人。
第二件,让大规模并行训练成为可能。因为 Transformer 没有顺序计算的瓶颈,整个序列可以一次性塞进 GPU。这直接催生了 BERT、GPT-2、GPT-3、ChatGPT、Claude——所有今天你听过的大语言模型,底层架构都是这篇论文的直接产物。
第三件,开启了跨模态的可能性。论文结尾作者写道:"我们计划把 Transformer 扩展到文本之外的模态——图像、音频、视频"。三年后,ViT 把图像切成 Patch 喂进 Transformer,证明这条路完全走得通;今天,多模态大模型已经是默认配置。
这篇论文最重要的贡献,
不是它给出的某个数字,
而是它给整个 AI 领域指出的一个方向:
用最简单的注意力,撬动最复杂的智能。
如果你今天要研究 AI、用 AI、或者把 AI 整合进自己的产品——这篇论文是所有故事的起点。下一集,我们会继续讲它的"图像版"续集——Vision Transformer(ViT)。看 Google 团队是如何把这个为文字设计的架构,用一个简单到令人发笑的技巧——"把图像切成 16×16 的 Patch"——直接搬到计算机视觉,最终让 CNN 在某些任务上也开始让位。