2.2 Transformer 编码器架构 上一节我们推出了 Self-Attention 的核心公式。但仅有 Self-Attention 还不足以构成一个可用的网络层——还缺少多头机制、残差连接、归一化层、前馈网络、位置编码等关键组件。本节就把这些积木拼成完整的 Transformer 块。 一、单头到多头:CNN 通道思想的延续 为什么需要多头 单头 Self-Attention 只能学到一种关注模式。但语言里关系是多样的: 句法关系:「主语-谓语」「修饰-中心词」 共指关系:「it 指代 cat」 长距离依赖:句子开头的条件与结尾的结论 词法关系:动词与名词、形容词与名词 一种注意力模式不足以同时刻画这些。
上一节我们推出了 Self-Attention 的核心公式。但仅有 Self-Attention 还不足以构成一个可用的网络层——还缺少多头机制、残差连接、归一化层、前馈网络、位置编码等关键组件。本节就把这些积木拼成完整的 Transformer 块。
单头 Self-Attention 只能学到一种关注模式。但语言里关系是多样的:
一种注意力模式不足以同时刻画这些。多头注意力(Multi-Head Attention) 的思路是把隐藏维度切分成 h 组,每组独立做一次 Self-Attention,让不同头学到不同的关系。
给定隐藏维度 d 和头数 h(通常 d = 512, h = 8,每头 d_k = d/h = 64),把 Q, K, V 各自切成 h 份:
每个头独立计算:
把所有头的输出沿特征维度拼接,再用一个输出投影矩阵 W^O 融合:
直觉上,这非常像 CNN 的多通道卷积——每个通道学一种特征,最后融合。
注意:多头的总计算量与单头接近。因为每头的维度从 d 降到 d/h,乘起来约等于单头的开销。这意味着多头几乎是「免费午餐」——同样的 FLOPs 换来更强的表达能力。
只有多头注意力还不够。把它直接堆叠多层,会出现梯度消失/爆炸、训练不稳定的问题。Transformer 用两个经典技巧解决:
每层的输出 = 输入 + 子层输出:
这借鉴自 ResNet。它的物理意义是:让信息可以「绕过」子层直接传递,梯度也能沿捷径反传,从而支持很深的网络。
对每个样本的隐藏维度做归一化:
其中 \mu, \sigma 是 x 在特征维度的均值与方差,\gamma, \beta 是可学习参数。
LayerNorm 让每个 token 的表示保持数值稳定,避免某些维度爆炸、某些维度消失。它跟 BatchNorm 的区别在于不依赖 batch 内其他样本,因此对 batch 大小不敏感,适合序列建模。
原始 Transformer 用的是 Post-LN(先 SubLayer,再 Add & Norm):
后来发现 Pre-LN(先 Norm,再 SubLayer,再 Add)训练更稳定:
几乎所有当代大语言模型(GPT-3、LLaMA、Qwen)都用 Pre-LN。
Self-Attention 是跨位置的信息聚合,还需要一个逐位置的非线性变换来增强表达力。这就是 FFN(Feed-Forward Network):
它对每个位置独立作用(不同 token 之间不交互),通常中间维度扩展到 4d(例如 d=512 时 FFN 中间维度是 2048)。
FFN 是 Transformer 中参数量最大的部分——大约占总参数的 2/3。后续 LLaMA 引入 SwiGLU(用 GLU 门控替代 GELU)就是这个组件的演化。
把上面的积木拼起来,一个 Transformer Encoder 块的数据流是:
堆叠 L 个这样的块(如 BERT-base 是 12 层,BERT-large 是 24 层),就得到一个完整的 Transformer Encoder。
Decoder 块与 Encoder 块结构相似,但有两个关键差异:
Decoder 用于自回归生成,必须禁止位置 i 看见位置 >i 的内容——否则就是「偷看未来」,训练时会作弊。
实现方式是在注意力分数矩阵上加一个上三角为 -\infty 的掩码:
经过 softmax 后,未来位置的权重变成 0,模型只能从当前位置及之前的 token 获取信息。
完整的 Encoder-Decoder Transformer(如原始 Transformer 用于机器翻译)中,Decoder 每层还有一个 Cross-Attention 子层:
这就是跨模态融合的基础——第5章我们会看到,这个机制几乎原封不动地被 Flamingo 等模型用来融合视觉特征与文本。
Self-Attention 有一个隐含问题:它对输入顺序不敏感。把「猫追狗」和「狗追猫」输入 Self-Attention,如果不加额外信息,两者的输出会完全一样——因为公式里只有点积,没有任何「位置 i」「位置 j」的概念。这就是所谓的置换不变性(permutation invariance)。
要让模型感知顺序,必须额外注入位置信息。常见方案有三种:
原始 Transformer 用固定的正弦/余弦编码:
BERT 等改为可学习的位置嵌入——给每个位置分配一个可训练向量。简单直接,但外推性差:训练时只见过 512 位置,推理时给 1024 就用不了。
不直接编码「位置 i」,而是编码「位置 i 与 j 的相对距离 i - j」。代表工作如 T5、Transformer-XL。外推性比绝对位置编码好。
RoPE(Rotary Position Embedding)是 LLaMA 之后几乎所有主流大语言模型采用的方案。它的核心思想是:在复数空间里对 Q、K 做旋转,使得 Q_i \cdot K_j 只依赖于相对位置 i - j。
形式化地,对位置 i 的向量 q,按维度两两分组做旋转:
RoPE 的最大优点是外推性好——训练时见过 4K 上下文,可以稳定扩展到 32K、128K 甚至 1M(配合 YaRN、LongRoPE 等扩展技术)。这就是为什么 LLaMA 3、Qwen2.5 等都能轻松支持超长上下文。
| 方案 | 代表 | 外推性 | 计算开销 | 主要场景 |
|---|---|---|---|---|
| 绝对(学习式) | BERT、GPT-2 | 差 | 低 | 短上下文 |
| 相对 | T5、Transformer-XL | 中 | 中 | 中等上下文 |
| RoPE | LLaMA、Qwen、Mistral | 强 | 低 | 长上下文 |
第3章讲 ViT 时我们会看到,视觉 Transformer 通常用学习式或 sinusoidal 位置编码,因为图像 patch 的「位置」是二维网格,扩展方式与文本不同。
基于上面的积木,可以组装出三种典型结构:
| 结构 | 特点 | 代表 | 主要用途 |
|---|---|---|---|
| Encoder-Only | 全双向 Self-Attention | BERT、RoBERTa | 理解类任务(分类、检索) |
| Decoder-Only | 单向 + 因果掩码 | GPT、LLaMA、Qwen | 生成类任务 |
| Encoder-Decoder | 编码器 + 带 Cross-Attention 的解码器 | T5、BART、原始 Transformer | 序列到序列(翻译、摘要) |
当代大语言模型的主流是 Decoder-Only——GPT、LLaMA、Qwen、Mistral、GLM 都是 Decoder-Only。原因是:
后续章节我们讨论的多模态大模型,其中枢 LLM 几乎全是 Decoder-Only。
把上面所有组件画到一起,原始 Transformer 的完整架构如下:
虽然现代 Decoder-Only 模型去掉了 Encoder 与 Cross-Attention,但理解这个完整结构对后续学习 Flamingo、BLIP-2 至关重要——它们的多模态融合机制正是借用 Cross-Attention 这一组件。
一个完整的 Transformer 块由「多头 Self-Attention + FFN + 残差 + LayerNorm」四件套组成。Encoder 用双向,Decoder 用单向 + 因果掩码。位置编码负责注入顺序信息,RoPE 是当代长上下文大模型的事实标准。
下一节(2.3)我们把视角从「积木」拉到「房间」——讲清楚 Transformer 如何被用来做文本编码,演化出 BERT、GPT、LLaMA 这一系列大语言模型,它们正是多模态大模型的中枢底座。