第5章 Transformer模型

2017 年 6 月,谷歌团队发表论文《Attention Is All You Need》(《注意力就是你所需要的一切》),提出了一种全新的网络结构 - Transformer。它彻底抛弃了循环神经网络的串行递归与卷积神经网络的局部窗口,仅凭”注意力”机制,就让序列中任意两个位置的词直接建立联系。此后的短短几年里,GPT、BERT、ChatGPT、多模态大模型几乎全部建立在这个结构之上。Transformer 因此被称为”大模型的引擎”,是理解现代人工智能绕不开的必修课。本章将逐块拆解它的积木:从输入编码与位置信息,到自注意力与多头注意力,再到编码器与解码器的完整结构,为后续理解 GPT 与强化学习的结合铺平道路。

5.1 总体思想与框架结构

第 4 章我们看到了循环神经网络(RNN)的优雅之处:它用一个”记忆单元”(隐状态)沿时间轴滚动处理序列,结构天然适合文本、语音等时序数据。但 RNN 有两个难以克服的先天缺陷。其一是串行计算:第 \(t\) 个时刻必须等第 \(t\)−1 个时刻算完才能开始,因为每个隐状态都依赖前一个隐状态,GPU 的大规模并行能力无从发挥,训练长文本的效率极低。其二是长距离依赖有限:信息从序列头部传到尾部,要经过许多时间步的连乘与非线性压缩,梯度要么消失、要么爆炸,即使 LSTM/GRU 用门控加以缓解,当两个相关词相隔很远时(比如句首的主语与句尾的动词),网络依然常常”忘记”前文。

注意力机制给出了完全不同的思路:与其让信息沿时间轴”接力传递”,不如让序列中的任意两个位置一步直达。想象一句话:“那个在公园里追着蝴蝶跑了整整一下午的孩子,终于回家了。” - “孩子”和”回家”相距很远,但读者一眼就能建立联系。注意力做的正是这件事:每个词都”询问”(Query)其他所有词”你和我有多大关系”(用键 Key 度量),再按关系强弱把其他词的”值”(Value)加权汇总到自己身上。这样一来,无论距离多远,两个位置之间都只需要一次计算即可建立联系,整个序列被当作一张”全连接图”来处理。

2017 年,谷歌的 Vaswani 等人在《Attention Is All You Need》中把这一思想推到极致:整个网络只由注意力层和简单的前馈网络组成,完全抛弃循环与卷积。论文提出的 Transformer 采用经典的编码器—解码器(Encoder–Decoder)框架:左边是 N 层编码器,逐层把源序列”读懂”,提炼成一组上下文表示;右边是 N 层解码器,逐词生成目标序列,并在每一层都通过”交叉注意力”回看编码器的输出 - 相当于”翻译时随时对照原文”。编码器、解码器内部的所有位置都可以同时并行计算,这正是它能在海量数据上高效训练的根本原因。完整框架如图 5-1 所示。

图 5-1 Transformer 总框架:编码器把源序列编码为表示,解码器自回归生成目标序列

注记

“注意力就是你所需要的一切”
注意力并非 Transformer 首创:2014 年 Bahdanau 等人在机器翻译的序列到序列模型中首次引入注意力,让解码器生成每个词时”聚焦”原文的不同部分;2015 年 Luong 等人又提出多种注意力变体。Transformer 的真正贡献,是证明了“只靠注意力、不要任何循环或卷积”也能达到甚至超过当时最好的翻译质量 - 从”锦上添花”到”全部所需”,这正是论文标题的深意。

与第 3、4 章的模型相比,Transformer 在”并行性”与”长依赖”两个维度上实现了质的飞跃,可用下表概括:

特性 RNN(第4章 CNN(第3章 Transformer(本章)
位置关系 沿时间轴递推,逐步传递 局部窗口,感受野有限 任意两位置一步直达
并行性 差(时序串行) 好(完全并行)
长距离依赖 弱(梯度消失,LSTM 缓解) 需堆很深或膨胀卷积 强(O(1) 步可达)
核心操作 隐状态递推 ht=f(ht−1,xt) 卷积核滑动 自注意力 softmax(QK/√dk)V
计算复杂度 O(n·d²) O(n·d²·k) O(n²·d)(可优化)
代表作 LSTM(1997) ResNet(2015) Transformer(2017)

本章后面将依次回答三个问题:输入如何变成向量并携带位置信息(5.2 节)、注意力如何工作(5.3 节)、编码器与解码器如何搭建(5.4、5.5 节)。

5.2 输入信息编码方式

要让神经网络处理文本,第一步是把文本切成”词”,再把每个”词”变成向量。中文按字切分、英文按空格切分,都会遇到一个麻烦:真实世界的词汇量极大 - 英文词形变化、专有名词、网络新词层出不穷 - 字典太小则大量词”查不到”(OOV,out-of-vocabulary),字典太大则嵌入矩阵的参数爆炸。Transformer 采用字节对编码(BPE,Byte Pair Encoding)的子词(subword)方案:先以单个字符为最小单位,反复把出现频率最高的相邻字符对合并成新”词片”,最终得到一个几千到十万规模的词片表。“机器学习”可能被切成”机器”“学习”两个常用词片,而生僻的”机器学习导论”则可能切为”机器”“学习”“导论”。这样既控制了词表规模,又能拼出任意新词 - 这也是今天几乎所有大模型的标准做法。

得到词片序列后,每个词片对应一个编号(如”机器”→ 128),再通过一张可学习的词嵌入矩阵 WE 查表,得到该词的稠密向量。例如 d=512 维时,“机器”变成 512 个浮点数组成的向量,含义相近的词(“汽车”“轿车”)在向量空间中距离更近。查表本质上就是一次矩阵乘法,完全可并行。于是句子”我爱中国”变成一个形状为 4×512 的矩阵 X,每一行是一个词的嵌入向量 - 这就是 Transformer 眼中的”输入”。

然而这里藏着一个致命问题:自注意力对位置”无感”。如果把 X 的行顺序任意打乱,注意力计算的结果(除行序外)完全不变 - 因为它只是两两之间做运算,并不关心谁先谁后。“我爱中国”和”中国爱我”会被编码成几乎一样的矩阵,这对语言是灾难性的,因为语序承载着关键信息(“猫追老鼠”≠“老鼠追猫”)。因此必须把”位置”信息显式地注入输入。Transformer 采用正弦位置编码(Positional Encoding):对每个位置 pos 和每个维度 i,按如下公式计算一个位置向量,直接叠加到词向量上:

\[ \begin{aligned} PE(pos,2i)&=\sin\!\left(\frac{pos}{10000^{2i/d}}\right),\\ PE(pos,2i+1)&=\cos\!\left(\frac{pos}{10000^{2i/d}}\right). \end{aligned} \]

这个公式的精妙之处有三。其一,不同维度对应不同频率:i 越小,100002i/d 越接近 1,正弦波震荡越快,负责刻画”相邻位置的细微差别”;i 越大,频率越低,负责刻画”全局的大致方位”,如图 5-2 所示。其二,相对位置可由线性变换表示:利用三角恒等式 sin(a+b)=sin a·cos b + cos a·sin b,位置 pos+k 的编码可以由位置 pos 的编码通过一个只与 k 有关的旋转矩阵线性表出 - 模型可以由此”学会”相对距离,而相对距离比绝对位置对语言更重要。其三,可外推到任意长度:公式对任何 pos 都有定义,不需要为超出训练长度的位置准备参数,因此模型能处理比训练时更长的序列。

图 5-2 位置编码曲线:不同维度 i 对应不同频率的正弦/余弦波

注记

两种位置编码流派
如今的 GPT 系列改用可学习位置编码(把位置当作可学习的参数),因为在大规模数据上它同样有效;BERT 与最初的 Transformer 用正弦公式。无论哪种,核心思想一致:必须显式告诉模型”每个词在第几个位置”。更进阶的旋转位置编码(RoPE) - 利用上述”线性变换表示相对位置”的思想 - 是 2023 年后主流大模型(Llama、Qwen、DeepSeek)的标配,详见本章延伸阅读。

5.3 自注意力机制

自注意力(Self-Attention)是整个 Transformer 的心脏。理解它的最快方式,是把它想象成一次”带权检索”:你在图书馆找资料,心中有一个问题(Query,查询),图书管理员根据索引(Key,键)找出相关书籍,再取出书里的内容(Value,值)给你。“相关程度”就是注意力权重 - 相关度高的书多读几遍,相关度低的扫一眼即可。对序列而言,每个词同时扮演三种角色:它作为”查询者”去打量全句,作为”键”被别的词打量,作为”值”把自己的内容贡献给别人。

提示

类比:读书时目光扫过全文
读”它”这个代词时,你的目光会快速扫过前文,在”小猫”处停留最久(权重最高),把”小猫”的信息代入对”它”的理解中。自注意力正是如此:每个词都在同时”扫视”全句,并把目光停留之处(高权重位置)的信息吸收进来 - 而且所有词是同时、并行地做这件事。

具体地,设输入矩阵 X(形状 n×d,n 个词,每个 d 维),我们引入三组可学习的投影矩阵 WQ、WK、WV,把 X 线性变换为三个新矩阵:Q = XWQ 是每个词的”查询向量”,K = XWK 是每个词的”键向量”,V = XWV 是每个词的”值向量”。直观地说,Q 代表”我想找什么”,K 代表”我能提供什么索引”,V 代表”我实际贡献什么内容”。三组矩阵就是网络学到的三副”眼镜”,从不同角度观察同一个 X。注意力分数按如下公式计算:

\[ \operatorname{Attention}(Q,K,V)=\operatorname{softmax}\!\left(\frac{QK^\top}{\sqrt{d_k}}\right)V \]

可以拆成四步来读:① 相似度 - Q(n×dk)与 K(dk×n)相乘,得到 n×n 的相似度矩阵,第 i 行第 j 列元素 qi·kj 表示”第 i 个词对第 j 个词的兴趣程度”;② 缩放 - 除以 √dk。当维度 dk 较大时,点积的数值会很大,把 softmax 推入梯度极小的饱和区;除以 √dk 相当于把方差拉回 1 左右,让梯度保持健康;③ 归一化 - 对每一行做 softmax,把相似度变成一组和为 1 的非负权重,回答”这个查询应把注意力按什么比例分给全句”;④ 加权求和 - 用这些权重对 V 的各行加权求和,得到每个位置的新表示。整个流程如图 5-3

图 5-3 自注意力计算流程:输入 X → Q/K/V → 相似度 → 缩放 → softmax → 加权求和 → 输出 Z

这样,第 i 个位置的输出就是”全句所有位置按相关度加权后的信息” - 它同时看到了所有词,且权重由网络自行学习:训练初期权重几乎均匀,训练充分后,它会学会把高权重放在句法相关词(动词与修饰语)、指代对象(代词与先行词)、同位语、反义词等各类关系上。但一组 Q/K/V 只能捕捉一种”关系视角”。为此 Transformer 使用多头注意力(Multi-Head Attention):把 Q、K、V 各自切分成 h 份(原文 h=8),每一份用不同的投影矩阵独立计算注意力,得到 h 个”头”的输出,再拼接起来,经过一个线性投影 WO 融合,如图 5-4 所示:

\[ \begin{aligned} \operatorname{MultiHead}(Q,K,V)&=\operatorname{Concat}(head_1,\ldots,head_h)W^O,\\ head_i&=\operatorname{Attention}(QW_i^Q,KW_i^K,VW_i^V). \end{aligned} \]

图 5-4 多头注意力:h 个头并行计算,拼接后线性投影融合

多头的好处是”分工”:实验表明,不同的头会自发地各司其职 - 有的头关注局部语法(相邻词),有的头关注长程指代,有的头关注位置模式。代价也显而易见:自注意力的相似度矩阵是 n×n 的,计算量为 O(n²·d)。当序列长度 n 达到几万甚至几十万(长文档、长视频)时,平方复杂度成为瓶颈。缓解之道包括:稀疏注意力(每个词只关注局部窗口加少数全局锚点)、线性注意力(用核技巧近似),以及 FlashAttention 这样的显存优化算法 - 后文延伸阅读将介绍。对比而言,RNN 是 O(n·d²),线性于长度但必须串行;Transformer 是 O(n²·d),完全并行但平方于长度。如何在”长”与”快”之间权衡,正是 2023 年后大模型架构演进的主线。

5.4 编码器信息编码机制与整体结构

编码器由 N 个完全相同的编码器块(Encoder Block)堆叠而成,原文取 N=6,现代大模型动辄几十层。每个块内部由两个子层组成:第一子层是多头自注意力,让每个位置融合全句信息;第二子层是前馈网络(FFN),对每个位置的表示独立做两次线性变换加 ReLU 激活,相当于对每个词做一次”深度思考”,把注意力收集来的信息加工成更丰富的特征。两个子层各自后面都跟着一个“Add & Norm”:Add 是残差连接,Norm 是层归一化(LayerNorm)。整体结构如图 5-5

图 5-5 编码器块结构:MHSA → Add & Norm → FFN → Add & Norm;N 个块依次堆叠

为什么需要”Add & Norm”这两样东西?先说残差连接:注意力与 FFN 都包含非线性变换,层数加深后,梯度需要穿越很多层才能到达浅层参数。残差连接在子层输入与输出之间架了一条”加法的捷径”,让梯度可以绕过非线性直接回传,从根本上缓解深层网络的梯度消失问题 - 这一思想源自第 3 章的 ResNet,Transformer 把它原样继承。再说层归一化:它把每个词向量的各维重新标准化为均值 0、方差 1,再乘可学习的缩放参数 γ 与平移参数 β:

\[ \operatorname{LayerNorm}(x)=\gamma\odot\frac{x-\mu}{\sqrt{\sigma^2+\varepsilon}}+\beta \]

与 BatchNorm 按”一批样本的同一位置”统计不同,LayerNorm 只对单个样本内部做统计,因此不受 batch 大小影响、不依赖样本间的统计量,训练时也无需维护全局统计 - 这使它特别适合 Transformer:大模型常因显存限制只能用很小的 batch,且序列长度多变,LayerNorm 在这种情况下依然稳定。

注意子层的执行顺序:原文采用”先 Add 后 Norm”(Post-Norm);后来的 GPT-2 等模型把顺序调成”先 Norm 后 Add”(Pre-Norm),训练更加稳定,成为现代大模型的主流。每个编码器块输出形状不变的矩阵(n×d),所以可以随意堆叠 N 层。与 RNN 层层递推不同,编码器各层之间虽然是串行依赖(后一层的输入是前一层的输出),但每一层内部的所有词可以完全并行计算 - 把整层运算写成矩阵乘法交给 GPU,训练效率比 RNN 高出几个数量级,这正是”深”得以成立的前提。若把多层编码器的行为摊开看:浅层关注词本身的形态与局部搭配,中层组合出短语与短句语义,深层捕捉长程结构与全局主题 - 恰似人的阅读理解由浅入深。

注记

为什么用 LayerNorm 而不是 BatchNorm?
BatchNorm 按”一批里所有样本同一位置的特征”归一化,在卷积图像任务里很有效;但 NLP 的序列长度不一、batch 又小,批统计噪声大。LayerNorm 按”每个样本、每个位置的全部特征”归一化,计算只依赖当前样本,batch size = 1 也能训练 - 这对需要加载巨大模型、batch 只能很小的预训练至关重要。

5.5 解码器信息编码机制与整体结构

解码器的任务,是根据编码器给出的源语言表示,逐词生成目标序列。它的整体结构与编码器类似 - 同样是 N 个块堆叠、每个块里也有 Add & Norm 与残差连接 - 但有三处关键不同:掩码自注意力、交叉注意力,以及自回归式的生成方式,其中前两处都体现在注意力层里,如图 5-6

图 5-6 解码器层结构:掩码自注意力 + 交叉注意力 + FFN,K、V 来自编码器输出

第一处不同:因果掩码(Causal Mask)。编码器可以”看整句” - “猫追老鼠”四个字同时处理,互相都能看到;但解码器要逐词预测输出,若允许第 t 个位置”偷看”未来的词,预测就失去了意义 - 那等于作弊。因此我们在相似度矩阵 QK 上叠加一个掩码矩阵 M:对 j > i 的位置(未来词)令 Mij = −∞,其余位置为 0:

\[ \begin{aligned} \operatorname{Attention}(Q,K,V)&=\operatorname{softmax}\!\left(\frac{QK^\top+M}{\sqrt{d_k}}\right)V,\\ M_{ij}&=\begin{cases}0,&j\le i,\\-\infty,&j>i.\end{cases} \end{aligned} \]

经 softmax 后,−∞ 对应的权重变为 0,即”预测第 t 个词时,只能看到第 1 到第 t−1 个词(连同自身)“,如图 5-7。这一机制保证解码器在训练阶段就能模拟推理阶段的”只见过去、不见未来”。

图 5-7 因果掩码矩阵:上三角(未来)被 −∞ 遮住

第二处不同:交叉注意力(Cross-Attention)。解码器中间子层的查询 Q 来自解码器自身(当前正在生成的词),而键 K 与值 V 来自编码器的输出。这样,解码器每生成一个词,都会先”对照原文”:生成英文 “the” 时,它会向编码器询问”原文里哪个词最对应我现在要翻译的位置”,再把原文对应位置的信息融合进来。可以这样理解:自注意力让解码器内部”理清自己要说什么”,交叉注意力让解码器”对齐原文该怎么翻译”。二者的计算方式完全相同(同一个公式),区别仅仅在于 Q、K、V 的来源不同。

提示

类比:边写边回看原文
做英译中时,你每写一个中文词,都要抬头看看英文原文对应的那一处,把它的意思搬过来 - 这就是交叉注意力;而掩码自注意力则像回顾自己已经写好的前半句,保证行文通顺、不重复、不矛盾。翻译、摘要、对话生成,本质上都是这个模式。

第三处不同:自回归生成与教师强制。解码器是自回归(Autoregressive)的:先给定起始符 <sos>,预测第一个词的概率分布,取最可能的词作为输出;再把”<sos> + 第一个词”作为输入预测第二个词……如此循环,每步的输出接在上一步的输入之后,直到生成结束符 <eos>。注意,训练时我们已知目标句子的每个词,因此可以采用教师强制(Teacher Forcing):不等待模型自己生成,直接把真实目标序列(右移一位:第 t 步的输入是真实的 yt−1)一次性全部喂入解码器,配合因果掩码并行计算出所有位置上的预测 - 训练既快又稳,且掩码保证每个位置依然只”看见”过去。推理时没有标准答案,才退化为逐词生成。这套”训练时并行、推理时串行”的机制,是几乎所有生成式大模型(GPT 系列、Llama、Qwen)的标准范式。

编码器与解码器并非必须成对出现。现代大模型对它们做了”拆开复用”:GPT 只保留解码器(去掉交叉注意力,只留掩码自注意力 + FFN),在”预测下一个词”的自监督任务上预训练,擅长生成;BERT 只保留编码器,在”随机挖掉一个词、让它填空”(掩码语言模型)的任务上预训练,擅长理解与表征。两者的关系可用下表概括:

对比项 GPT(生成式预训练) BERT(理解式预训练)
结构 仅解码器(掩码自注意力 + FFN) 仅编码器(双向自注意力 + FFN)
预训练任务 预测下一个词(自回归) 预测被挖掉的词(填空)
能看哪些上下文 只能看左侧(因果) 左右两侧都能看(双向)
擅长的任务 文本生成、对话、代码、翻译 分类、问答、句对匹配、命名实体识别
后辈代表 GPT-3/4、Llama、Qwen、DeepSeek RoBERTa、DeBERTa 等
注记

为什么会分化?
生成是”一个词一个词往外吐”,天然是自回归的,所以生成模型必须用因果掩码;理解任务(判断情感、抽取实体)需要同时参考上下文两侧的信息,所以理解模型用双向。这也解释了为什么 GPT 之后的大模型(包括多模态模型)几乎都走”仅解码器”路线:生成是最终目标,而理解能力可以通过海量文本上的”预测下一个词”隐式习得

重要

本章要点

  • Transformer 用注意力替代循环与卷积:任意两位置一步直达、完全并行、长距离依赖强,是大模型时代的引擎。
  • 输入 = 词片(BPE)嵌入 + 位置编码;正弦位置编码可线性表达相对位置,并可外推到更长序列。
  • 自注意力 = softmax(QK/√dk)V:Q 查询、K 键、V 值;多头注意力并行分工、各学各的关系;复杂度 O(n²·d)。
  • 编码器块 = 多头自注意力 + FFN,各接 Add & Norm;残差与 LayerNorm 让深层网络稳定可训,N 层块内完全并行。
  • 解码器块 = 掩码自注意力 + 交叉注意力 + FFN;因果掩码防止”偷看未来”,交叉注意力让生成时”对照原文”。
  • 自回归生成:训练时教师强制并行、推理时逐词生成;GPT 仅解码器(预测下一个词),BERT 仅编码器(填空)。
警告

延伸阅读 · 从 Transformer 到大模型

GPT 预训练与缩放定律:GPT-2(2019)证明”预测下一个词”能学到语言与常识;GPT-3(2020)以 1750 亿参数展示涌现能力;缩放定律(Scaling Laws)指出模型参数量、数据量、算力与损失的幂律关系 - 这是”大模型越大越好”的工程依据。

BERT 与双向理解:BERT(2018)用掩码语言模型 + 下一句预测刷新 11 项 NLP 纪录;RoBERTa、DeBERTa 等改进模型沿用双向编码思路,是问答与检索系统的常用基座。

位置编码的进化:从正弦公式、可学习位置编码,到旋转位置编码(RoPE) - 当前主流大模型(Llama、Qwen、DeepSeek)用它同时编码绝对与相对位置,并支撑超长上下文。

多模态大模型:把图像切成 patch、把音频切成帧,与文本 token 一起送入同一个 Transformer(如 GPT-4o、Gemini);视觉编码常用 ViT(视觉 Transformer),即”把第 3 章的卷积替换为注意力”。

FlashAttention 与推理成本:FlashAttention 通过分块计算与 IO 感知优化,把注意力从”显存瓶颈”变成”计算瓶颈”,是大模型训练提速的关键;推理侧用 KV 缓存、推测解码、量化(INT8/FP8)降低成本 - 这正是”为什么调用一次大模型那么贵”的工程答案。