当然。Transformer 是当下几乎所有主流大语言模型(如 GPT、BERT、Llama 等)的核心架构,它由 Google 在 2017 年的论文《Attention Is All You Need》中首次提出。下面我会从它要解决的问题、核心思想、逐层结构到工作机制,为你做一次详细、透彻的讲解。
一、为什么需要 Transformer?
在 Transformer 出现之前,主流的序列模型(如机器翻译、文本生成)主要基于 RNN(循环神经网络)或 LSTM(长短期记忆网络)。
- RNN/LSTM 的问题:
- 串行计算:处理序列时,必须一个词一个词地按顺序进行,无法并行,导致训练很慢。
- 长距离依赖:当序列很长(如一个段落)时,模型容易忘记开头的词与结尾的词之间的关系(梯度消失/爆炸)。
- 固定记忆:隐藏状态的大小有限,难以容纳整个长序列的上下文。
CNN(卷积神经网络)可以并行,但感受野有限,需要堆叠很多层才能捕获长距离信息。
Transformer 的革命性在于:完全抛弃了 RNN 的循环结构,只依赖“自注意力(Self-Attention)”机制,同时解决了并行计算和长距离依赖两大难题。
二、Transformer 的整体架构(宏观视角)
Transformer 遵循经典的 Encoder-Decoder 结构,但两者都由相同的“模块”堆叠而成。
- 编码器(Encoder):负责理解输入序列(例如:一句英语)。由 N=6 个相同的层堆叠而成。
- 解码器(Decoder):负责生成输出序列(例如:对应的中文翻译)。也由 N=6 个相同的层堆叠而成。
下图是经典架构示意图(简化版):
输出 (概率)
↑
Softmax
↑
Linear
↑
Decoder (6x) ←─── 编码器输出
↑
Encoder (6x)
↑
输入 (例如: 我 爱 AI)
三、深入每一部分:从输入到输出
我们以“机器翻译”为例,输入“I love AI”,输出“我爱 AI”。
1. 输入处理:Token 化 + 位置编码
步骤 1:词嵌入(Word Embedding) 将每个词(或子词)映射为一个固定维度的向量(比如 512 维)。例如:“I” → [0.1, 0.3, …]。
步骤 2:位置编码(Positional Encoding) Transformer 自身不感知词的顺序(因为它不像 RNN 那样依次处理)。为了让模型知道“I”在“love”前面,需要注入位置信息。
- 方法:使用正弦/余弦函数生成与词嵌入同维度的位置向量,然后直接加到词嵌入上。
- 效果:最终的输入向量 = 词嵌入 + 位置编码。这样,同一个词在不同位置会获得不同的向量。
2. 编码器(Encoder)—— 理解输入
每个编码器层包含两个子层:
- 子层 1:多头自注意力(Multi-Head Self-Attention)
- 子层 2:前馈神经网络(Feed-Forward Network)
每个子层后面都跟着:
- 残差连接(Add):输入直接加到输出上,缓解梯度消失。
- 层归一化(Norm):稳定训练,加速收敛。
编码器层内部结构:
输入 x
│
├──> 多头自注意力 ──> Add (x + 注意力输出) ──> LayerNorm ──> (临时输出)
│
└──> 前馈网络 ──> Add (临时输出 + 前馈输出) ──> LayerNorm ──> 输出到下一层
关键机制:自注意力(Self-Attention)
这是 Transformer 的心脏。它的作用是:对于序列中的每个词,计算它与序列中所有词(包括自身)的相关性权重,然后根据这些权重重新聚合信息。
计算步骤(以“I love AI”为例,处理“love”这个词):
-
生成三个向量:对输入 X(每个词的向量)乘以三个不同的权重矩阵,得到:
- Q(Query,查询):我要去找谁?(我是“love”,我想问其他词与我有多相关)
- K(Key,键):我的标签是什么?(每个词都有一个标签供别人查询)
- V(Value,值):我的实际信息是什么?
-
计算注意力分数:用“love”的 Q 与序列中所有词(“I”、“love”、“AI”)的 K 做点积。得分越高,说明这两个词在当前位置越相关。
- 例如:Q_love · K_I = 0.8,Q_love · K_love = 1.0,Q_love · K_AI = 0.2。
-
归一化与 Softmax:将分数除以一个缩放因子(√d_k,防止梯度过小),然后经过 Softmax,得到概率分布(权重)。
- 例如:[0.35, 0.5, 0.15] —— “love” 最关注自己(0.5),其次是“I”(0.35)。
-
加权求和:用这个权重分布去加权 V(每个词的值向量),得到“love”的新表示。
- 新 love = 0.35 * V_I + 0.5 * V_love + 0.15 * V_AI。
- 结果:新的“love”向量不仅包含自己的信息,还融入了“I”和“AI”的相关信息。这就是上下文理解。
多头注意力(Multi-Head Attention)
- 为什么需要多“头”? 单次注意力可能只学习到一种关系(比如语法关系)。多个“头”允许模型在不同的子空间中并行学习多种关系:
- 头 1:关注相邻词(“I love”)
- 头 2:关注远距离指代(“AI”和“it”)
- 头 3:关注语义相似性
- 做法:将 Q、K、V 线性投影到不同的低维空间(例如 8 个头,每个头 64 维),分别计算注意力,然后将所有头的结果拼接起来,再线性变换回原维度。
多头注意力的输出公式:
MultiHead(Q,K,V) = Concat(head1,..., headh) W^O
其中 head_i = Attention(Q W_i^Q, K W_i^K, V W_i^V)
前馈神经网络(FFN)
- 一个简单的两层全连接网络(通常第一层扩展维度到 2048,第二层降回 512),激活函数为 ReLU 或 GELU。
- 作用:对每个位置独立地进行非线性变换,增强模型的表达能力。可以理解为:注意力负责“收集信息”,FFN 负责“加工信息”。
3. 解码器(Decoder)—— 生成输出
解码器结构与编码器类似,但多了一个子层,并增加了掩码机制。
每个解码器层包含三个子层(每个子层后都有 Add & Norm):
-
掩码多头自注意力(Masked Multi-Head Self-Attention)
- 为什么掩码? 生成文本时(比如“我爱”后面要预测“AI”),不能让当前词看到未来的词。训练时,“我”在生成时只能看到它自己,不能看到“爱”和“AI”。
- 做法:在计算注意力分数后,将未来位置的分数设为 -∞,这样 Softmax 后它们的权重就是 0。
-
编码器-解码器注意力(Cross-Attention)
- 这是连接编码器和解码器的桥梁。
- Q:来自解码器上一层的输出(即已经生成的序列)。
- K、V:来自编码器的最终输出(即整个输入序列的表示)。
- 作用:让解码器在生成每个词时,能“查阅”整个输入序列的哪一部分最相关。例如,生成“爱”时,应该重点关注输入中的“love”。
-
前馈神经网络(FFN)
- 与编码器中的完全相同。
解码器工作流程(推理时):
- 输入开始标记
[SOS],解码器生成第一个词“我”。 - 输入
[SOS] 我,解码器生成第二个词“爱”。 - 输入
[SOS] 我爱,解码器生成第三个词“AI”。 - 直到生成结束标记
[EOS]。
4. 输出层
- 解码器最后一层输出是一个向量序列(每个位置一个)。
- 经过一个线性层(Linear):将每个向量映射到词汇表大小的维度(例如 50000 维)。
- 经过 Softmax:转换为概率分布。概率最大的词就是预测的下一个词。
四、为什么 Transformer 这么强大?
| 特性 | 解释 |
|---|---|
| 并行计算 | 自注意力可以一次性计算所有词之间的关系,不像 RNN 必须逐步计算。极大提升了训练速度。 |
| 长距离依赖 | 无论两个词在序列中隔得多远,自注意力计算它们之间的路径长度都是 1(直接点积)。RNN 则需要走过中间所有词(路径长度 = 距离)。 |
| 可解释性 | 可以可视化注意力权重,看到模型在生成某个词时,具体关注了输入中的哪些词。 |
| 可扩展性 | 模型性能通常随数据量、参数量、计算量增加而提升(Scaling Law)。催生了 GPT-3、GPT-4、Llama 等超大模型。 |
五、常见变体(基于 Transformer)
- BERT:只使用 Transformer 的编码器,适合理解任务(分类、问答、命名实体识别)。双向上下文。
- GPT 系列:只使用 Transformer 的解码器(但移除了编码器-解码器注意力,保留掩码自注意力和 FFN),适合生成任务。单向上下文(从左到右)。
- T5:保留完整的 Encoder-Decoder,适合所有文本到文本的任务(翻译、摘要、问答)。
- Llama / Mistral:基于解码器,但引入了改进(如 RMSNorm、SwiGLU 激活函数、旋转位置编码 RoPE)。
六、关键参数速览(以原始 Transformer-base 为例)
- 层数:6(Encoder) + 6(Decoder)
- 词嵌入维度:512
- 前馈网络维度:2048
- 注意力头数:8
- 总参数量:约 6500 万(对比 GPT-3 有 1750 亿)
- 位置编码:正弦/余弦固定函数
七、一个形象的类比
想象你在一场会议中要写会议纪要(生成摘要)。
- RNN:你必须一个发言者一个发言者地听,听完当前人才能听下一个。而且如果要回忆第一个人的发言,你可能已经忘了(长距离依赖问题)。
- Transformer(自注意力):你手上有所有人的发言稿(输入序列)。当你写关于“预算”的要点时,你可以同时翻看所有人提到“预算”的地方(并行 + 直接跳转)。你还可以用不同的“头”——一个头关注谁说了“预算”,另一个头关注谁说了“明年”,从而综合理解。
总结
Transformer 的精髓可以用一句话概括:用全连接的自注意力替代循环,使模型能并行地、直接地建模序列中任意两个位置的关系。
- Encoder:全面理解输入,无掩码。
- Decoder:逐步生成输出,带掩码防止窥视未来。
- 核心算子:缩放点积注意力 + 多头 + 残差 + 前馈网络。