Transformer架构解析:从自注意力机制到大语言模型核心原理
1. 先搞清楚 Transformer 到底解决了什么问题
如果你在 2017 年之前接触过自然语言处理,比如机器翻译或者文本生成,那你大概率用过 RNN(循环神经网络)或者 LSTM(长短期记忆网络)。这类模型有个天生的“短板”:它们必须按顺序处理输入序列。想象一下,你要翻译一个句子,RNN 得一个字一个字地“读”完,才能理解整个句子的意思。这个过程不仅慢,而且当句子很长时,模型很容易“忘记”开头的内容,这就是所谓的“长距离依赖”问题。
Transformer 的出现,就是为了彻底解决这个“顺序处理”的瓶颈。它的核心思想是 “注意力就是一切” 。它不再强迫模型按顺序处理数据,而是让模型能够同时看到输入序列的所有部分,并动态地决定在生成每个输出时,应该“关注”输入序列的哪些部分。
这带来了几个革命性的变化:
- 并行化训练 :因为不再有顺序依赖,模型的所有计算都可以并行进行,这极大地利用了 GPU 等硬件的计算能力,训练速度大幅提升。
- 更强的长距离建模能力 :自注意力机制让模型可以直接计算序列中任意两个位置之间的关系,无论它们相隔多远。
- 统一的架构 :Transformer 的编码器-解码器结构非常清晰和模块化,使其不仅适用于翻译,还能轻松适配到各种序列到序列的任务,甚至催生了纯编码器(如 BERT)和纯解码器(如 GPT)的变体,成为当今大语言模型的基石。
所以,Transformer 不是一个简单的模型改进,而是一种 架构范式 的转变。它让模型处理序列数据的方式,从“串行阅读”变成了“并行全局审视”。
2. 核心组件拆解:从词到向量的旅程
要理解 Transformer 如何工作,我们需要把它拆开,看看数据是如何流经这个“黑箱”的。整个过程可以看作是将离散的文本符号,转化为连续的向量表示,再经过多层信息混合,最终变回我们想要的符号(比如另一种语言的词)的过程。
2.1 第一步:文本的“数字化”——分词与嵌入
模型不能直接理解文字。第一步是 分词 ,把句子拆成模型能认识的基本单位(Token)。例如,“我爱北京天安门”可能被分词为 [“我”, “爱”, “北京”, “天安门”] 。每个 Token 会被映射成一个唯一的整数 ID。
接下来是 嵌入 。每个整数 ID 会通过一个可学习的查找表,被转换成一个固定长度的稠密向量。这个向量就是该 Token 的初始表示。你可以把它想象成给每个词分配了一个在高维空间中的“坐标”,语义相近的词,其坐标在空间中也应该比较接近。
但这里有个问题:嵌入向量本身不包含这个词在句子中的 位置信息 。“苹果”在句首和句尾,意思可能完全不同。因此,我们需要引入 位置编码 。
2.2 第二步:告诉模型“顺序”——位置编码
Transformer 没有 RNN 那样的循环结构,所以必须显式地告诉模型每个 Token 在序列中的位置。原始论文使用了一种巧妙的 正弦和余弦函数 来生成位置编码向量,然后把它加到对应的词嵌入向量上。
这种编码方式有一个很好的数学性质:对于任意一个固定偏移量 k,位置 pos + k 的编码可以由位置 pos 的编码通过一个线性变换得到。这使得模型能够轻松地学习到相对位置关系。
注意:现在很多模型(如 GPT、LLaMA)使用更先进的 RoPE(旋转位置编码) ,它在注意力计算中直接融入相对位置信息,效果更好,且能更好地外推到更长的序列。
至此,我们得到了一个序列的矩阵表示,其中每一行是一个 Token 的“词嵌入+位置编码”向量。这个矩阵将被送入 Transformer 的核心——注意力层。
3. 自注意力机制:模型如何“聚焦”
这是 Transformer 最核心、也最需要理解的部分。自注意力机制让模型能够为序列中的每个位置计算一个“上下文感知”的表示。
3.1 查询、键、值的类比
可以把自注意力想象成一个信息检索系统:
- 查询 :当前 Token 提出的问题:“我应该关注谁?”
- 键 :序列中每个 Token 的“标签”,用于匹配查询。
- 值 :序列中每个 Token 携带的“信息内容”。
对于输入序列中的每个 Token,我们通过三个不同的可学习权重矩阵,将其向量分别投影成查询向量、键向量和值向量。
3.2 计算注意力分数和加权和
接下来,对于位置 i 的查询向量,我们会计算它与序列中所有位置(包括它自己)的键向量的点积。这个点积分数,经过缩放(除以键向量维度的平方根,为了稳定梯度)和 Softmax 归一化后,就得到了一个 注意力权重分布 。
这个权重分布决定了在计算位置 i 的新表示时,应该从每个位置的“值”向量中汲取多少信息。最后,位置 i 的新输出就是所有值向量的加权和。
用公式表示单头注意力就是: Attention(Q, K, V) = softmax(QK^T / sqrt(d_k)) V
其中, Q , K , V 分别是查询、键、值矩阵, d_k 是键向量的维度。
为什么有效? 通过这种方式,模型可以动态地、灵活地为每个 Token 构建一个表示,这个表示融合了全局信息。例如,在翻译“The animal didn’t cross the street because it was too tired”时,模型在生成“it”时,会赋予“animal”很高的注意力权重,从而知道“it”指代的是“animal”。
3.3 多头注意力:多视角观察
只做一次上述的注意力计算,模型可能只学到一种类型的依赖关系(比如指代关系)。为了让模型同时关注来自不同表示子空间的信息,Transformer 采用了 多头注意力 。
具体做法是:将查询、键、值向量在特征维度上切分成 h 个头,每个头独立进行上述的注意力计算。最后,将 h 个头的输出拼接起来,再通过一个线性投影层,得到最终的多头注意力输出。
这相当于让模型拥有了 h 套并行的“检索系统”,每套系统可能专注于捕捉不同方面的关系(如语法结构、语义关联、指代关系等)。在 GPT-3 中, h 可以达到 96 甚至更多。
4. 前馈网络与残差连接:信息的加工与流通
注意力层的输出并不是直接传递给下一层。每个注意力子层(或解码器中的交叉注意力子层)后面,都跟着一个 前馈神经网络 。
4.1 前馈网络的作用
这个 FFN 是一个简单的两层全连接网络,通常中间层的维度是嵌入维度的 4 倍(例如,嵌入维度 768,中间层就是 3072),并使用 ReLU(或 GELU、SwiGLU 等)激活函数。
它的作用是对注意力层提取的、经过混合的信息进行进一步的 非线性变换和加工 。你可以把它看作每个位置的“私人处理器”,独立地处理该位置整合后的信息。
4.2 残差连接与层归一化:训练稳定的关键
Transformer 的另一个关键设计是 残差连接 和 层归一化 。
- 残差连接 :将子层(如注意力层或 FFN 层)的输入直接加到其输出上。即
输出 = LayerNorm(输入 + 子层(输入))。这解决了深度网络中的梯度消失问题,让信息可以跨层直接流动,使得训练非常深的网络成为可能。 - 层归一化 :对每个样本的所有特征进行归一化,使其均值为0,方差为1。这有助于稳定训练过程,加速收敛。
这里有一个重要的演进:原始 Transformer 使用的是 Post-LN ,即 LayerNorm(x + Sublayer(x)) 。但后来大家发现 Pre-LN ,即 x + Sublayer(LayerNorm(x)) 更容易训练,不需要复杂的学习率预热策略,成为了现在的主流。在 Pre-LN 中,归一化在子层计算之前进行,使得子层的输入更加稳定。
5. 编码器与解码器:分工与协作
标准的 Transformer 遵循编码器-解码器架构,但如今纯解码器模型(如 GPT)更为流行。理解两者的区别至关重要。
5.1 编码器:理解输入
编码器由 N 个(原论文是 6 个)相同的层堆叠而成。每一层都包含一个 多头自注意力子层 和一个 前馈网络子层 ,每个子层周围都有残差连接和层归一化。
编码器的任务是 双向地理解整个输入序列 。在自注意力中,每个 Token 都可以关注到输入序列中的所有其他 Token(包括前后的 Token),因此编码器输出的每个位置向量,都包含了整个输入序列的上下文信息。
BERT 就是典型的纯编码器模型,它通过“完形填空”(掩码语言模型)任务进行预训练,擅长做理解类任务,如文本分类、命名实体识别、阅读理解等。
5.2 解码器:生成输出
解码器也由 N 个相同的层堆叠而成。但每一层包含 三个子层 :
- 掩码多头自注意力层 :这是关键区别。为了防止在训练时“偷看”未来的答案,解码器在计算自注意力时使用了 因果掩码 。这意味着在生成第
t个 Token 时,它只能关注到第1到t-1个已经生成的 Token。这保证了生成过程的 自回归 特性。 - 多头交叉注意力层 :这一层连接编码器和解码器。它的查询来自解码器上一层的输出,而键和值来自 编码器的最终输出 。这样,解码器在生成每一个 Token 时,都能有选择地“参考”输入序列的信息。
- 前馈网络层 :与编码器中的相同。
解码器的最终输出会通过一个 线性层 和一个 Softmax 层,映射回词汇表,得到下一个 Token 的概率分布。我们根据这个分布(通常使用采样或贪婪搜索)选择下一个 Token,并将其作为输入反馈给解码器,循环此过程直至生成结束。
GPT 系列是纯解码器模型,它没有编码器,因此也没有交叉注意力层。它的每一层只有掩码自注意力和前馈网络。它通过预测下一个词的任务进行训练,非常擅长文本生成。
6. 从原理到实践:关键训练与推理技巧
理解了架构,我们来看看在实际训练和使用 Transformer 时,有哪些至关重要的工程细节。
6.1 训练稳定性:学习率预热与梯度裁剪
原始 Transformer 论文提到,训练初期使用一个较小的学习率,然后线性增加到预设值,之后再衰减,这个过程叫 学习率预热 。这是因为模型参数初始随机,直接使用大学习率可能导致训练不稳定。预热让模型先“摸索”到一个相对平滑的损失曲面区域。
此外, 梯度裁剪 也是常用技巧,防止梯度爆炸。
6.2 预训练与微调范式
如今,大规模 Transformer 模型几乎都遵循 “预训练-微调” 范式:
- 预训练 :在海量无标注文本数据上,通过自监督任务(如掩码语言模型、下一句预测、下一个词预测)训练模型,让模型学会语言的通用规律和世界知识。这一步消耗巨量算力。
- 微调 :在特定的、标注数据相对较少的下游任务(如情感分析、问答)上,用较小的学习率继续训练模型,使其适应具体任务。
6.3 推理加速:KV 缓存与投机采样
在自回归生成时(如 GPT 生成文本),模型需要一遍又一遍地处理已经生成的历史 Token,计算它们的键和值向量,这是巨大的浪费。
- KV 缓存 :在生成第
t个 Token 时,将前t-1个 Token 计算好的键和值向量缓存起来。生成第t+1个 Token 时,只需为新 Token 计算其查询向量,并与缓存中的所有历史键值向量计算注意力即可。这能极大减少计算量。 - 投机采样 :用一个更小、更快的“草稿模型”一次性生成多个候选 Token,然后用原始大模型快速验证这些候选 Token。如果验证通过,就一次性接受多个 Token;如果某个 Token 被拒绝,则丢弃后面的,由大模型重新生成。这相当于用大模型的计算量换取了更快的生成速度。
6.4 高效注意力:FlashAttention
标准的注意力计算需要将 QK^T 的中间矩阵(大小为序列长度 × 序列长度)存储到 GPU 显存中,这对于长序列(如 32K、128K)是巨大的负担。
FlashAttention 是一种 IO 感知的精确注意力算法。它通过巧妙的切块和重计算技术,在 GPU 的各级存储(HBM、SRAM)间高效调度数据,避免了中间矩阵的显式存储,从而实现了更快的速度和更低的内存占用,是支持长上下文模型的关键技术之一。
7. 超越文本:Transformer 的多模态演进
Transformer 的威力不止于文本。其核心——注意力机制——是一种通用的关系建模工具。只要能将数据转化为序列形式,就能用 Transformer 处理。
- Vision Transformer :将图像分割成固定大小的图像块,每个图像块线性投影为一个向量,加上位置编码后,就变成了一个“视觉词”序列。然后就可以像处理文本一样,用 Transformer 编码器进行处理。ViT 证明了在足够多的数据上,纯 Transformer 在图像分类上可以超越传统的 CNN。
- 音频处理 :将音频信号转换为频谱图(一种时间-频率图像),然后像 ViT 一样切块、嵌入,送入 Transformer。Whisper 等模型就采用此架构。
- 多模态模型 :如 LLaVA、GPT-4V,通常有一个视觉编码器(如 ViT)将图像编码为向量序列,一个文本编码器处理文本,然后将两者的表示进行对齐和融合,最后由一个文本解码器生成回答。
8. 总结与核心要点回顾
Transformer 的成功并非偶然,它通过几个简洁而强大的设计,解决了序列建模的根本问题:
- 自注意力机制 :实现了全局、动态的信息交互,打破了序列的顺序依赖,为并行计算铺平道路。
- 位置编码 :以可学习或固定的方式为模型注入顺序信息,弥补了注意力机制本身的无序性。
- 残差连接与层归一化 :保证了超深网络的稳定训练,是模型能够堆叠数十甚至数百层的基础。
- 模块化架构 :编码器-解码器的清晰划分,以及纯编码器、纯解码器的变体,使其能够灵活适配各种任务范式。
当你去读代码(比如 Hugging Face 的 Transformers 库)或自己实现一个简易 Transformer 时,把握住这条主线: 文本 -> 分词 -> 嵌入+位置编码 -> (多头自/交叉)注意力 -> 加残差&归一化 -> 前馈网络 -> 循环N层 -> 线性投影 -> 输出概率 。每个模块都有明确的分工,组合起来便构成了这个驱动现代 AI 发展的强大引擎。
理解 Transformer,不仅是理解一个模型,更是理解当前这一波 AI 浪潮背后的核心计算范式。从 BERT 到 GPT,从 ViT 到 Whisper,其内核都闪烁着 2017 年那篇论文中“Attention is All You Need”的思想光芒。
更多推荐

所有评论(0)