从注意力机制到大模型骨架,重新理解《Attention Is All You Need》
第一次听到 Transformer 这个名字时,我其实很难把它和“理解语言”联系起来。它不像 CNN、RNN 那样从名字里还能猜出一点结构特点,反倒像某种科幻电影里的机械装置。但后来越学越发现,今天很多大模型能走到现在,确实绕不开这个看似有些陌生的名字。
如果只用一句话解释 Transformer,我会说:它是一种用“注意力机制”处理序列信息的神经网络结构。它最早在 2017 年的论文《Attention Is All You Need》中被系统提出,起初主要用于机器翻译,后来却成了大语言模型、图像生成、多模态模型背后的核心架构之一。下面我不打算把论文逐段翻译一遍,只想沿着几个最关键的问题,把它为什么重要讲清楚。
假设我们要让模型理解这句话:
“我把钥匙放进书包,因为它明天上课还要用。”
人读这句话时,几乎不用停下来思考,就知道“它”大概率指的是“钥匙”,而不是“书包”。可机器没有这种天然语感,它必须从词和词之间的关系里慢慢判断:谁在被使用,谁只是容器,哪个词和当前词更相关。
传统的循环神经网络(RNN)会按顺序读句子:先读“我”,再读“把”,再读“钥匙”……它像一个人从左到右做笔记,后面的判断依赖前面留下的隐藏状态。这种方式很好理解,但也有些吃力:一方面很难并行,训练速度慢;另一方面句子一长,前面的信息就容易被压缩、被遗忘。
Transformer 换了个想法:与其一步一步传话,不如把整句话摊开,让每个词直接去看那些和自己有关的词。也就是说,它不再只靠顺序传递信息,而是通过注意力机制建立词与词之间的直接联系。
注意力机制的直觉并不高深:当模型处理某个词时,不应该把其他词一视同仁,而应该给更相关的词更高权重。比如处理“它”时,模型应该更关注“钥匙”;处理“上课”时,模型可能更关注“明天”。
Transformer 里的 self-attention 就是在同一个句子内部计算这种相关性。每个 token 会被映射成三个向量:Query、Key、Value,常简写为 Q、K、V。
Query:当前 token 想找什么信息。
Key:每个 token 提供一个可匹配的索引。
Value:真正被汇总进来的内容。
可以把它想象成在图书馆找资料。你手里有一个问题,这就是 Query;每本书的目录关键词像 Key;书中真正有用的段落像 Value。你先拿问题去和目录匹配,判断哪些书更值得翻,再把相关段落里的信息汇总起来。
数学上,Transformer 会计算 Q 和 K 的相似度,再经过 softmax 得到权重,最后用这些权重对 V 做加权求和。原论文把这个操作称为 scaled dot-product attention,可以写成:
这里的 dk 是 Key 向量的维度。除以 sqrt(dk) 是为了避免点积结果过大,让 softmax 后的分布不至于过早变得极端。这个公式背后的直觉很朴素:先算“我和谁最相关”,再按相关性把信息加权汇总回来。
如果只有一个注意力头,模型可能只能从一个角度理解关系。但语言里的关系很多:指代关系、时间关系、因果关系、语法关系、主题关系,往往同时存在。
还是用刚才那句话。一个注意力头可能关注“它”和“钥匙”的指代关系;另一个头可能关注“明天”和“上课”的时间关系;还有一个头可能关注“放进”和“书包”的动作关系。多头注意力的意义,就是让模型在不同子空间里并行观察不同类型的联系。
最后,这些头的结果会被拼接起来,再经过线性变换,形成更丰富的表示。用公式表示就是:
所以,多头注意力并不是把模型说得更玄,而是给它更多观察句子的角度。每个 head 都有自己的一组投影矩阵,因此可以学习不同类型的关系。
注意力机制也有一个麻烦:它本身并不知道词的顺序。对 self-attention 来说,“我把钥匙放进书包”和“书包放进钥匙把我”在集合意义上只是同一批 token,顺序信息必须额外告诉模型。
所以 Transformer 引入了位置编码(positional encoding)。论文中使用的是正弦和余弦函数构造的位置编码,把每个位置的信息加到词向量上:
这样模型不仅知道每个 token 是什么,也知道它大概处在句子的哪个位置。正弦和余弦的位置编码还有一个好处:不同位置之间的相对距离会以一种平滑的方式体现在向量里,方便模型学习顺序关系。
可以把 token embedding 理解成“这个词是什么意思”,把 positional encoding 理解成“这个词站在队伍里的哪里”。两者加在一起,模型才既有内容信息,也有顺序信息。
原始 Transformer 是一个 encoder-decoder 架构,主要面向机器翻译。
Encoder:读取输入句子,把它变成一组上下文表示。
Decoder:根据 encoder 的结果,一步步生成目标句子。
Encoder 由多个相同层堆叠而成。每一层主要包含两个部分:多头自注意力和前馈神经网络。自注意力负责让 token 之间交换信息,前馈网络负责对每个位置的表示做进一步非线性变换。为了让深层网络更稳定,每个子层外面还会配合残差连接和层归一化。
Decoder 也有类似结构,但多了两个关键设计。第一,它有 masked self-attention,也就是生成当前位置时不能偷看未来 token。第二,它还有 encoder-decoder attention,用来让 decoder 在生成时关注输入句子中的相关部分。
如果把翻译任务比作“读中文,写英文”,encoder 像是先把中文句子读懂并整理成笔记;decoder 像是边看笔记边写英文,而且写第 5 个词时不能提前偷看第 6 个词。
Transformer 的一个巨大优势是并行化。RNN 处理序列时天然有前后依赖,第 t 步要等第 t-1 步算完;Transformer 的 self-attention 可以一次性处理整个序列中所有 token 的关系,更适合 GPU 并行计算。
这件事在小模型时代也许只是“训练快一点”,但到了大模型时代就变得很关键。模型参数越来越多,数据越来越大,如果结构本身不适合并行,训练成本会迅速变得不可接受。Transformer 的成功,很大程度上来自它把建模能力和硬件效率结合得很好。
当然,Transformer 也不是没有代价。标准注意力的计算量会随序列长度平方增长,长上下文会带来显存和计算压力。这也是后来 Longformer、FlashAttention、Mamba 等一系列工作的出发点:保留 Transformer 的表达能力,同时降低长序列成本。
2017 年的《Attention Is All You Need》并不是一开始就以“大语言模型革命宣言”的面貌出现的。它的实验主要集中在机器翻译上,但它提出的结构后来被证明很能扩展,这才有了后面一连串变化。
BERT 使用 Transformer encoder 做语言理解,GPT 系列使用 Transformer decoder 做自回归生成,ViT 把图像切成 patch 后也交给 Transformer 处理。后来的大语言模型、代码模型、多模态模型,很多都可以看作是在 Transformer 思想上的继续放大。
我觉得它重要的地方,不只是某个任务上分数更高,而是提供了一种统一的建模方式:把文本、图像、音频甚至代码都表示成 token 序列,再用注意力机制建模 token 之间的关系。这个思路让不同任务之间的架构隔阂小了很多。
很多人会把 Transformer 简单理解成“注意力机制”,但这样说不太完整。注意力当然是核心,可 Transformer 的成功来自一整套组合:多头注意力、位置编码、前馈网络、残差连接、层归一化、mask 机制,以及适合并行训练的堆叠方式。
单独拿出 attention,它只是一个信息汇聚操作;放进 Transformer 架构里,它才变成了可以大规模堆叠、训练和迁移的基础模块。
在我看来,Transformer 最优雅的地方,是它把“理解一句话”变成了“计算这句话内部各部分之间的关系”。它不再强迫信息沿着时间一步步传递,而是允许每个位置直接和其他位置建立联系。这使得模型既能捕捉长距离依赖,又能高效并行训练。
如果说 RNN 像一个人按顺序读书并不断更新笔记,那么 Transformer 更像是在一张桌子上摊开整页内容,反复标注不同句子、词语和线索之间的关系。它不是像人一样理解语言,但它提供了一种很强的统计结构,让模型能从海量数据中学到复杂模式。
这也是为什么 Transformer 会成为今天 AI 爆发的起点之一。它没有解决所有问题,却给出了一个足够通用、足够可扩展、也足够适合硬件训练的答案。后来的大模型浪潮,很大程度上就是在这个答案上继续放大。
[1] Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Lukasz Kaiser, Illia Polosukhin. Attention Is All You Need. NeurIPS, 2017.
[2] Google Research. Attention Is All You Need.
[3] Jay Alammar. The Illustrated Transformer.