这篇文章想帮你建立什么直觉?
2017 年发表的 Attention Is All You Need 提出了一种名为 Transformer 的编码器–解码器架构:它完全用注意力机制替代了当时主流的循环层与卷积层来建立序列表示,在机器翻译等任务上取得了当时顶尖的效果,同时显著提升了训练的并行度。此后,BERT、GPT 系列以及当今的大规模语言模型,几乎都可以看作这一骨架的变体与放大。
本文不逐行复现论文证明,而是希望你带走四样东西:它解决了什么历史痛点、注意力在设计上想表达什么、这种选择在工程与数学上带来什么收益、以及在哪些场景下它仍然不够理想。若你已读过本站《理解 LSTM 网络》与《理解 Embedding》,可以把本文当作从「循环记忆」到「全局可组合查询」的自然延伸。
一、背景:序列建模在 Transformer 之前卡在哪里?
在 2010 年代中期,神经机器翻译与序列建模的主流范式是 RNN / LSTM / GRU 及其编码器–解码器结构:模型沿着时间步依次更新隐状态 \(h_t\),用 \(h_t\) 概括「读到第 \(t\) 个符号为止」的上下文。配合 Bahdanau 等人提出的注意力,解码器可以在每一步「回看」编码器各位置,缓解把整句压进单一向量所带来的信息瓶颈。
这一路线非常成功,但有一个结构性矛盾:训练时的计算沿时间步串行。序列越长,越难在单条样本内充分并行;而 GPU 恰恰擅长大规模并行矩阵运算。与此同时,长序列还带来梯度传播路径变长、优化变慢等经典难题(与 LSTM 试图缓解的「长期依赖」问题同源,只是表现形式不同)。
另一条并行化思路是用 一维卷积(如 ByteNet、ConvS2S)在「所有位置同时」计算中间表示。卷积能高效利用硬件,但两个任意位置之间的依赖往往需要堆叠多层才能让感受野覆盖全句:依赖距离越远,所需层数或卷积核设计越复杂,学习远距离对齐有时不如注意力直接。
历史脉络可以压缩成一句话:社区先在 RNN 上叠加「软对齐」的注意力以提升表达力,再逐步意识到——若能把「对齐与聚合」本身做成核心算子,也许可以反过来弱化甚至去掉循环与卷积,换取更强的并行与更短的信息路径。
二、注意力的设计理念:把「相关性」变成可微的加权求和
在抽象层面,注意力函数做一件事:给定一个 查询(query) 与一组 键–值(key–value) 对,输出是各 value 的凸组合,组合系数由 query 与各个 key 的「匹配程度」决定。匹配越强的位置,权重越大。于是,离散意义上的「指向某段上下文」被松弛成连续权重,整个模块对参数端到端可导。
与早期在 RNN 解码器上使用的加性注意力相比,点积注意力把兼容性函数实现为向量内积,便于打包成矩阵乘法,一次算完所有位置。Vaswani 等人采用的 缩放点积注意力(Scaled Dot-Product Attention) 在点积之后除以 \(\sqrt{d_k}\),再 softmax 得到权重。直觉上,当维度 \(d_k\) 较大时,点积的数值方差会变大,softmax 容易进入梯度极小的饱和区;缩放把量级「拉回」更温和的区域,训练更稳定。
当 \(Q,K,V\) 都来自同一句子的不同位置时,就得到 自注意力(self-attention):每个位置直接向全序列发问——「在当前表示下,哪些位置对我最重要?」这使得任意两个位置之间,理论上可以在常数层深度内建立直接联系(与 RNN 需要 \(O(n)\) 步串行传播形成对照)。
多头注意力(Multi-Head Attention) 进一步把设计理念写清楚:一次全局加权平均,容易「抹平」细粒度模式;不如让模型并行维护多组 \(Q,K,V\) 投影,在多个子空间里各自做注意力,再拼接回整体维度。它对应的人类直觉是:不同的「关注点」同时存在——有的头偏句法,有的头偏共指,有的头偏局部 n-gram(具体分工由数据与初始化涌现,并不手工指定)。
三、Transformer 如何把上述理念落成网络架构?
Transformer 仍沿用编码器–解码器范式:编码器把输入符号序列映射为一串连续向量;解码器自回归地生成输出。每一层大致由两类子层交替构成:多头自注意力与位置前馈网络(FFN,可看作逐位置的 MLP),二者都包在 残差连接 + LayerNorm 的包裹里,即「先子层再加回输入再归一化」的 Pre-LN/Post-LN 变体思想(原论文采用后者形式写作 \(\mathrm{LayerNorm}(x+\mathrm{Sublayer}(x))\))。
解码器额外包含对编码器输出的交叉注意力:query 来自解码器一侧,key/value 来自编码器,用于对齐源语言与目标语言。对解码器中的自注意力,还要用因果掩码挡住「看到未来词」,以保持自回归生成的合法性。
由于模型不再内置时间递归或局部卷积,位置信息必须显式注入。论文采用正弦/余弦位置编码与词向量相加;也实验了可学习位置嵌入并取得相近结果。位置编码的选择影响外推到更长序列时的行为,这一点在后来的 RoPE、ALiBi 等改进里被持续讨论。
四、好处:为什么 Transformer「值得」成为默认骨架?
- ·训练并行度高:自注意力与 FFN 的主体都是矩阵乘,适合 GPU/TPU 上大规模批处理;相比逐步展开 RNN,更容易吃满算力。
- ·长程依赖路径短:单层自注意力即可在任意位置对之间建立直接权重;这对信号在前向与反向传播中跨越整个序列更有利(论文用「最大路径长度」对比了自注意力、循环与卷积)。
- ·表达灵活、扩展路径清晰:同一套块堆深、加宽、加头数即可放大模型;配合残差与归一化,优化实践上可扩展到极大参数量(当然这已经超出原论文量级,属于工程与系统研究的胜利)。
- ·可解释性接口:注意力权重可视化能展示模型在特定层、特定头上「看向哪里」,虽不等于因果归因,但对调试与分析仍有帮助。
五、局限性与反思:它并非「免费午餐」
计算与内存随序列长度二次增长。标准自注意力的代价大致是 \(O(n^2 d)\)(\(n\) 为序列长度)。当上下文从几千 token 推到十万、百万级时,瓶颈迅速从「算力」转向「注意力本身的复杂度」。稀疏注意力、线性注意力、分块注意力、FlashAttention 等方向,本质上都在与这一定律讨价还价。
归纳偏置更弱。卷积显式编码局部性,RNN 显式编码顺序累积;纯注意力更「一般」,有时需要更多数据或更强正则才能学到数据高效的结构。对图像、音频等模态,往往需要额外设计(如 patch 嵌入、二维位置编码)才能与 CNN 或专用架构匹敌。
对超长序列的外推仍是开放问题。训练见过的最大长度之外,位置表示与注意力模式能否稳定泛化,依赖具体编码与训练策略;这也是近年来位置编码与外推研究活跃的原因。
「注意力图」不等于解释模型决策的全部。权重可以多种方式重参数化而不改变函数行为;解释部署仍需谨慎。
六、收束:从一篇论文到一种基础设施
Transformer 的意义不仅在于 BLEU 分数的提升,而在于它把序列建模的核心操作,重写成了一种高度规则化、可堆叠、可并行的原语:自注意力 + FFN + 残差归一化。之后的大规模预训练,本质上是在这一骨架上把数据与算力推到极致。
若你继续深入,建议直接对照原文中的架构图与复杂度表格,把「路径长度」「每步并行度」与「单层复杂度」三条轴放在一起看——你会更清楚:今天我们在长上下文、多模态与端侧部署上所做的一切修补,多半都能回溯到这三条轴上的取舍。
参考文献(BibTeX)
以下为原文引用条目,便于在 LaTeX 或文献管理软件中直接使用。
@article{vaswani2017attention,
title={Attention is all you need},
author={Vaswani, Ashish and Shazeer, Noam and Parmar, Niki and Uszkoreit, Jakob and Jones, Llion and Gomez, Aidan N and Kaiser, {\L}ukasz and Polosukhin, Illia},
journal={Advances in neural information processing systems},
volume={30},
year={2017}
}