Skip to content
Stack Ashes
Go back

Attention Is All You Need 中文精读

本文是对论文 Attention Is All You Need 的中文精读与意译,不是逐字全文翻译。原论文由 Ashish Vaswani、Noam Shazeer、Niki Parmar、Jakob Uszkoreit、Llion Jones、Aidan N. Gomez、Lukasz Kaiser、Illia Polosukhin 撰写,最早提交于 2017 年 6 月 12 日,论文 DOI 为 10.48550/arXiv.1706.03762

这篇论文解决了什么问题

在 Transformer 出现之前,主流的序列到序列模型通常基于 RNN、LSTM、GRU 或 CNN。它们已经能做机器翻译、摘要、语音识别等任务,但有两个明显瓶颈:

  1. 难以并行:RNN 必须按时间步顺序处理 token,第 t 个状态依赖第 t - 1 个状态。序列越长,训练越慢。
  2. 长距离依赖成本高:当两个相关 token 距离很远时,信息要经过很多步传播,模型更难学到稳定关系。

论文的核心观点非常直接:序列建模不一定需要循环结构,也不一定需要卷积结构。只用注意力机制,也可以构建强大的编码器-解码器模型。

这个架构被命名为 Transformer

论文的核心贡献

Transformer 的贡献可以压缩成几句话:

今天的大语言模型大多仍然建立在这套思想之上。虽然后来的模型在规模、训练目标、归一化位置、激活函数、位置编码、注意力变体等方面做了大量改造,但“用注意力在 token 之间建立动态连接”这个底层思路没有变。

从 Encoder-Decoder 说起

论文仍然采用经典的 encoder-decoder 框架:

区别在于,Transformer 的 encoder 和 decoder 都不使用循环层。每一层主要由两类模块组成:

encoder 堆叠 6 层。decoder 也堆叠 6 层,但 decoder 额外包含一个 encoder-decoder attention,用于在生成目标序列时关注源序列。

Transformer Encoder-Decoder 结构图

Attention 的直觉

注意力机制可以理解为一次“按相关性加权的信息检索”。

给定一个当前位置的查询向量 Q,模型会拿它和所有候选位置的键向量 K 做相似度计算,再用 softmax 得到权重,最后对值向量 V 加权求和。这样当前位置就能从整段序列里取回和自己最相关的信息。

在机器翻译中,如果正在生成某个英文单词,decoder 可以通过 attention 找到源语言句子里最相关的词或短语。在 self-attention 中,每个 token 也可以观察同一个序列里的其他 token,从而建立句内关系。

缩放点积注意力

论文使用的核心公式是:

Attention(Q, K, V) = softmax(QKT / sqrt(dk))V

Scaled Dot-Product Attention 流程图

这里:

为什么要除以 sqrt(dk)

当向量维度变大时,点积结果的方差也会变大。过大的 logits 会让 softmax 进入饱和区,梯度变小,训练不稳定。缩放因子可以把数值拉回更合适的范围。

这个设计很朴素,但很关键。后来的大模型仍然沿用这一类 scaled dot-product attention。

Multi-Head Attention

单个 attention 头只能在一个表示空间里计算相关性。论文提出 multi-head attention:先把 QKV 投影到多个低维子空间,在每个子空间里独立做 attention,再把结果拼接起来。

可以把它理解成“多组观察角度”:

论文中的基础模型使用 8 个 attention head。每个 head 的维度较小,因此总计算量和单头高维 attention 接近,但表达能力更强。

Multi-Head Attention 示意图

Self-Attention 的优势

论文从三个角度比较 self-attention、RNN 和 CNN:

  1. 每层计算复杂度。
  2. 可并行程度。
  3. 长距离依赖路径长度。

self-attention 的最大优势是:任意两个 token 之间的路径长度是 1。一个位置可以直接关注另一个位置,不需要像 RNN 那样一步步传递,也不需要像 CNN 那样堆很多层扩大感受野。

这也是 Transformer 特别适合 GPU/TPU 的原因。训练时,同一层的所有位置可以并行计算,不再被时间步顺序锁住。

当然,self-attention 也有代价:标准 attention 对序列长度是平方复杂度。序列长度为 n 时,注意力矩阵大小是 n x n。这也是后来长上下文模型不断优化 attention 的原因之一。

为什么需要位置编码

如果只使用 attention,模型本身并不知道 token 的顺序。对于 self-attention 来说,输入 token 的集合如果没有位置信息,就很难区分“我喜欢你”和“你喜欢我”。

论文使用 sinusoidal positional encoding,把位置编号映射为一组正弦和余弦函数:

PE(pos, 2i) = sin(pos / 100002i / dmodel)
PE(pos, 2i + 1) = cos(pos / 100002i / dmodel)

Positional Encoding 示意图

这样做有两个好处:

论文也尝试了 learned positional embeddings,结果相近。选择 sinusoidal 的一个理由是它可能更容易外推到训练时没见过的更长序列。

后来的模型继续围绕位置信息做了大量改进,比如 relative position、RoPE、ALiBi 等。

Encoder 层结构

每个 encoder layer 包含两个子层:

  1. multi-head self-attention
  2. position-wise feed-forward network

每个子层外面都有 residual connection 和 layer normalization。也就是说,每个子层实际形式接近:

LayerNorm(x + Sublayer(x))

论文中的 feed-forward network 是对每个位置独立应用的两层 MLP:

FFN(x) = max(0, xW1 + b1)W2 + b2

它不在不同 token 之间交换信息,token 间的信息交换主要发生在 attention 中。FFN 负责对每个位置的表示做非线性变换和特征组合。

Decoder 层结构

decoder layer 有三个子层:

  1. masked multi-head self-attention
  2. encoder-decoder attention
  3. position-wise feed-forward network

masked self-attention 用来防止模型在训练时看到未来 token。比如生成第 5 个 token 时,只能看第 1 到第 4 个 token,不能偷看答案里的第 6 个 token。

encoder-decoder attention 则让 decoder 的每个位置都能关注输入序列。这里 query 来自 decoder,key 和 value 来自 encoder 输出。

这套设计让 decoder 同时具备两种能力:

训练细节

论文在 WMT 2014 英德翻译和英法翻译任务上评估 Transformer。几个值得注意的训练设计包括:

学习率调度是论文里很有代表性的工程细节。训练开始时先 warmup,避免初期更新过大;之后按步数衰减。这个模式后来在训练大模型时也很常见。

label smoothing 则让模型不要过度相信 one-hot 标签,有助于提升泛化能力。

实验结果说明了什么

论文报告的结论是:Transformer 在机器翻译上同时获得了更高质量和更高训练效率。

在 WMT 2014 英德任务上,Transformer base 达到 27.3 BLEU,Transformer big 达到 28.4 BLEU。在 WMT 2014 英法任务上,Transformer big 达到 41.8 BLEU。

这些数字在当时很有说服力,因为模型不仅质量强,而且训练成本显著降低。论文强调的重点不是“模型更大所以更强”,而是“架构更适合并行训练,所以能更快得到强结果”。

为什么这篇论文影响这么大

Transformer 改变的不只是机器翻译。它提供了一种通用的 token 交互机制。

只要能把数据表示成 token 序列,就可以考虑用 Transformer:

BERT、GPT、T5、ViT 以及后来的大语言模型,都可以看作 Transformer 思想的延伸。它们的差别主要在训练目标、decoder-only/encoder-only/encoder-decoder 架构、数据规模和工程优化上。

需要注意的局限

Transformer 并不是没有代价。

首先,标准 self-attention 的显存和计算量随序列长度平方增长。短序列时这不是问题,但长上下文会迅速变贵。

其次,Transformer 缺少 RNN 那种天然的顺序归纳偏置。它依赖位置编码和数据学习顺序关系。这带来了灵活性,也意味着需要足够的数据和训练技巧。

最后,注意力权重并不总是可靠解释。虽然 attention map 看起来像模型在“关注”某些词,但不能简单把它等同于完整因果解释。

用一句话总结

《Attention Is All You Need》真正重要的地方在于:它把序列建模的核心从“按顺序递归处理”改成了“让所有 token 直接相互通信”。这个变化释放了并行训练能力,也给后来的大规模预训练模型铺平了道路。

参考资料


Share this post on:

Next Post
大语言模型是如何调用 Tools 的