2017年,Vaswani等人在论文《Attention Is All You Need》中提出了Transformer架构。这篇论文的核心洞察可以用一句话概括:循环神经网络并非处理序列数据的唯一途径,注意力机制本身就足够了。
在Transformer的架构图中,注意力机制以两种不同的形态出现:编码器和解码器内部的自注意力(Self-Attention),以及连接编码器与解码器的交叉注意力(Cross-Attention)。这两种机制看似共享相同的数学公式,却在模型的信息流动中扮演着截然不同的角色。
理解这一区别,是掌握GPT为何选择Decoder-only架构、BERT为何选择Encoder-only架构、以及T5为何坚持Encoder-Decoder架构的关键。
从一个直观问题开始:注意力到底在「注意」什么?
在深入技术细节之前,让我们先建立一个直觉框架。
假设你正在翻译一句英文:“The cat sat on the mat”。当模型生成中文翻译"猫坐在垫子上"时,每生成一个中文字,它都需要决定应该关注英文句子中的哪些词。生成"猫"时,显然要关注"cat";生成"垫子"时,要关注"mat"。这种从目标序列"回头看"源序列的机制,就是交叉注意力的本质。
现在换一个场景:模型正在阅读并理解"The cat sat on the mat"这句话本身,准备对它进行分类或提取信息。当处理"sat"这个词时,模型需要理解"cat"是主语,“mat"是地点状语。这种在同一序列内部建立词与词之间的关系,就是自注意力的核心功能。
用一个类比来概括:
- 自注意力:像是在一场会议中,每个参会者都在倾听并回应其他所有人的发言——所有人都在同一个房间里,讨论的是同一个议题。
- 交叉注意力:像是一场翻译会议,译员需要同时倾听演讲者的发言(源语言)和组织自己即将说出的内容(目标语言)——两个"世界"通过译员的注意力桥接在一起。
注意力机制的统一公式
无论是自注意力还是交叉注意力,其计算都可以用一个统一的公式表达:
$$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$其中:
- $Q$(Query,查询):表示"我想要找什么信息”
- $K$(Key,键):表示"我有什么信息可以提供"
- $V$(Value,值):表示"实际的信息内容"
- $d_k$:键向量的维度,用于缩放防止梯度消失
这个公式源自信息检索系统的类比。想象你在图书馆找书:查询(Query)是你心中的需求,键(Key)是每本书的标题和标签,值(Value)是书的实际内容。注意力机制计算的是你的查询与每本书键值的匹配程度,然后用这个匹配度来加权汇总所有书的内容。
自注意力和交叉注意力的唯一区别,在于Q、K、V的来源不同。
自注意力:同一序列的「内部对话」
在自注意力中,Q、K、V全部来自同一个输入序列:
$$Q = XW_Q, \quad K = XW_K, \quad V = XW_V$$其中$X$是输入序列的嵌入矩阵,$W_Q$、$W_K$、$W_V$是可学习的投影矩阵。
一个具体例子
考虑句子"The cat sat":
graph LR
subgraph 输入序列
T1["The"]
T2["cat"]
T3["sat"]
end
subgraph Q投影
Q1["Q_The"]
Q2["Q_cat"]
Q3["Q_sat"]
end
subgraph K投影
K1["K_The"]
K2["K_cat"]
K3["K_sat"]
end
subgraph V投影
V1["V_The"]
V2["V_cat"]
V3["V_sat"]
end
T1 --> Q1
T1 --> K1
T1 --> V1
T2 --> Q2
T2 --> K2
T2 --> V2
T3 --> Q3
T3 --> K3
T3 --> V3
当计算"sat"这个词的注意力时:
- 用$Q_{\text{sat}}$与$K_{\text{The}}$、$K_{\text{cat}}$、$K_{\text{sat}}$分别计算点积
- 通过softmax得到注意力权重,例如可能是$[0.1, 0.6, 0.3]$
- 用这个权重对$V_{\text{The}}$、$V_{\text{cat}}$、$V_{\text{sat}}$进行加权求和
- 得到"sat"的上下文表示,其中融入了"cat"(主语)和"The"的信息
自注意力的核心特性
自注意力有两个关键特性:
全连接性:序列中的每个位置都可以直接与任意其他位置交互。这解决了循环神经网络的长期依赖问题——在RNN中,第1个词的信息要传递到第100个词,必须依次经过中间98个词;而在自注意力中,第1个词和第100个词之间的距离永远是1步。
位置无关性:注意力分数完全基于内容的语义相似性,而非位置信息。这既是优点(灵活性强),也是缺点(需要额外引入位置编码)。Transformer通过添加位置编码或相对位置偏置来解决这一问题。
掩码自注意力:Decoder的「约束版本」
在GPT等Decoder-only模型中,自注意力被加了一个重要的约束:因果掩码(Causal Mask)。
graph TD
subgraph 未掩码的自注意力矩阵
A1["✓ ✓ ✓ ✓"]
A2["✓ ✓ ✓ ✓"]
A3["✓ ✓ ✓ ✓"]
A4["✓ ✓ ✓ ✓"]
end
subgraph 因果掩码后的注意力矩阵
B1["✓ ✗ ✗ ✗"]
B2["✓ ✓ ✗ ✗"]
B3["✓ ✓ ✓ ✗"]
B4["✓ ✓ ✓ ✓"]
end
A1 --> B1
掩码的目的是防止"作弊"。在训练时,模型面对的是完整的句子,如果没有掩码,当模型预测第3个词时,它可以"偷看"第4、5、6个词。这样模型就会学到一种无用的策略:直接复制下一个词,而不是真正理解上下文。
因果掩码强制每个位置只能看到自己和之前的位置,确保模型的预测完全基于已经生成的内容。这正是自回归生成的核心约束。
交叉注意力:连接两个世界的「桥梁」
交叉注意力打破了"Q、K、V同源"的限制:
$$Q = YW_Q, \quad K = XW_K, \quad V = XW_V$$其中$Y$是目标序列(解码器的输入),$X$是源序列(编码器的输出)。Query来自目标序列,Key和Value来自源序列。
机器翻译中的交叉注意力
考虑将"The cat sat"翻译为法语"Le chat s’est assis":
sequenceDiagram
participant E as 编码器<br/>处理英文
participant D as 解码器<br/>生成法文
participant CA as 交叉注意力
E->>E: 自注意力处理<br/>"The cat sat"
E->>CA: 输出K, V<br/>(编码后的英文表示)
D->>D: 自注意力处理<br/>已生成的"Le chat"
D->>CA: 输出Q<br/>(解码器的查询)
CA->>CA: Q_attend_K<br/>计算注意力权重
CA->>D: 返回加权后的V<br/>(与当前生成相关的英文信息)
D->>D: 生成下一个词<br/>"s'est"
当解码器生成"s’est"(对应"sat")时:
- 解码器基于已生成的"Le chat"产生一个查询向量$Q$
- 这个$Q$与编码器输出的所有$K$(对应"The"、“cat”、“sat”)计算相似度
- 发现与"sat"的$K$最相似,因此对"sat"的$V$赋予最高权重
- 将加权后的信息融合到当前生成过程
这就是为什么翻译模型能够"对齐"源语言和目标语言的词——交叉注意力自动学习到了"sat"应该对应"s’est"。
交叉注意力的核心价值
交叉注意力的核心价值在于信息融合:
- 在机器翻译中,它融合源语言和目标语言
- 在图像描述生成中,它融合图像特征和文本
- 在多模态大模型中,它融合视觉和语言信息
这种融合是动态的、可学习的。模型不是简单地复制源信息,而是根据当前的生成状态,选择性地提取最相关的部分。
历史视角:注意力机制的三年演进
理解自注意力和交叉注意力的区别,需要回到注意力机制诞生的历史语境。
2014年:Bahdanau的加性注意力
在Transformer之前,神经机器翻译使用的是编码器-解码器架构,但编码器将整个输入句子压缩成一个固定长度的向量,解码器只能从这个"瓶颈"获取信息。句子越长,信息丢失越严重。
Dzmitry Bahdanau等人在论文《Neural Machine Translation by Jointly Learning to Align and Translate》中提出了一个解决方案:不再使用单一向量,而是让解码器在每一步都能"查看"编码器的所有隐藏状态。注意力分数通过一个前馈神经网络计算:
$$e_{ij} = v_a^T \tanh(W_a s_{i-1} + U_a h_j)$$其中$s_{i-1}$是解码器的前一个状态,$h_j$是编码器的第$j$个隐藏状态。这被称为加性注意力或Bahdanau注意力。
2015年:Luong的乘性注意力
Minh-Thang Luong等人简化了注意力计算,直接使用点积:
$$e_{ij} = s_i^T h_j$$这被称为乘性注意力或Luong注意力。相比加性注意力,乘性注意力计算更快,但性能相当。
2017年:Transformer的统一与突破
Vaswani等人的贡献在于:
- 统一:将注意力机制抽象为Query、Key、Value的框架,加性注意力和乘性注意力都成为特例
- 简化:选择了计算最高效的缩放点积注意力
- 创新:用自注意力完全替代了循环神经网络
timeline
title 注意力机制演进史
section 2014
Bahdanau注意力 : 解决编码瓶颈问题<br/>加性注意力
section 2015
Luong注意力 : 简化计算<br/>乘性注意力
section 2017
Transformer : 自注意力替代RNN<br/>统一Q/K/V框架
: 交叉注意力连接<br/>编码器与解码器
section 2018-2020
BERT : Encoder-only<br/>双向自注意力
GPT : Decoder-only<br/>因果自注意力
section 2020s
多模态模型 : 交叉注意力融合<br/>视觉与语言
架构分歧:三种Transformer变体如何选择注意力机制
基于对自注意力和交叉注意力的理解,我们可以分析现代大模型的三种主流架构。
BERT:Encoder-only,双向自注意力
BERT(Bidirectional Encoder Representations from Transformers)选择了Transformer的编码器部分。这意味着:
- 只使用自注意力:没有解码器,因此不需要交叉注意力
- 双向性:每个词可以看到整句话的所有词,包括未来的词
- 训练目标:掩码语言模型(MLM),随机遮住15%的词,让模型预测
BERT的自注意力没有因果掩码。当模型处理"猫坐在垫子上"时,处理"猫"这个词可以看到"垫子"(后面),处理"垫子"可以看到"猫"(前面)。这种双向性使BERT特别适合理解类任务:
- 文本分类
- 命名实体识别
- 问答系统(抽取答案)
- 情感分析
BERT的局限在于:它不擅长生成。因为训练时看到了完整句子,推理时无法处理"只有开头、没有结尾"的情况。
GPT:Decoder-only,因果自注意力
GPT(Generative Pre-trained Transformer)选择了Transformer的解码器部分,但做了一个重要的简化:移除了交叉注意力层。原始Transformer解码器的每个块包含:
- 带掩码的自注意力
- 交叉注意力(查询解码器,键值来自编码器)
- 前馈神经网络
GPT移除了第2项,因为GPT没有编码器。这意味着GPT只使用因果自注意力。
为什么这个选择能工作?因为GPT的训练目标是下一个词预测:给定"The cat sat on",预测"the"。这个任务不需要外部信息源,只需要在已生成的序列内部建模即可。
GPT的优势在于:
- 生成能力强:自回归训练完美匹配生成任务
- 架构简单:单一堆叠的Transformer块,易于扩展
- 零样本/少样本能力:大规模预训练后展现出泛化能力
GPT的局限在于:无法进行双向理解。当模型处理"猫坐在垫子上"的"猫"时,它看不到"垫子"。
T5/BART:Encoder-Decoder,自注意力 + 交叉注意力
T5和BERT等模型保留了原始Transformer的完整架构:
- 编码器:双向自注意力,完整理解输入
- 解码器:因果自注意力 + 交叉注意力,生成输出
- 连接:交叉注意力让解码器可以"查询"编码器的表示
这种架构在序列到序列任务中表现出色:
- 机器翻译:编码器理解源语言,解码器生成目标语言
- 文本摘要:编码器理解原文,解码器生成摘要
- 问答生成:编码器理解问题和文档,解码器生成答案
graph LR
subgraph Encoder-only BERT
E1[输入] --> E2[双向自注意力]
E2 --> E3[输出表示]
end
subgraph Decoder-only GPT
D1[输入] --> D2[因果自注意力]
D2 --> D3[下一个词]
end
subgraph Encoder-Decoder T5
ED1[源输入] --> ED2[编码器<br/>双向自注意力]
ED2 --> ED3[K, V]
ED4[目标输入] --> ED5[解码器<br/>因果自注意力]
ED5 --> ED6[Q]
ED3 --> ED7[交叉注意力]
ED6 --> ED7
ED7 --> ED8[输出]
end
一个决策框架
如何选择架构?
| 任务类型 | 推荐架构 | 原因 |
|---|---|---|
| 文本分类、情感分析 | Encoder-only | 需要完整理解,不涉及生成 |
| 文本生成、对话 | Decoder-only | 自回归生成是核心需求 |
| 机器翻译、摘要 | Encoder-Decoder | 需要先理解再生成 |
| 多模态理解 | Decoder-only + 图像token | 统一处理所有模态 |
| 多模态生成 | Encoder-Decoder + 交叉注意力 | 图像特征作为编码器输出 |
计算复杂度:注意力机制的代价
自注意力和交叉注意力都面临一个共同的挑战:计算复杂度。
O(n²)的根源
对于长度为$n$的序列,注意力计算需要:
- 计算$QK^T$:$(n \times d) \times (d \times n) = O(n^2 \cdot d)$
- 对$n \times n$矩阵做softmax:$O(n^2)$
- 与$V$相乘:$(n \times n) \times (n \times d) = O(n^2 \cdot d)$
总计为$O(n^2 \cdot d)$,其中$n^2$是主导项。
这意味着序列长度翻倍,计算量变为四倍。对于BERT-base处理512个token,这还可以接受;但当序列扩展到32K甚至100K token时,计算成本变得难以承受。
交叉注意力的"优势"
交叉注意力有时反而比自注意力更高效。原因在于:
- 自注意力:$n \times n$的注意力矩阵
- 交叉注意力:$m \times n$的注意力矩阵($m$是目标序列长度,$n$是源序列长度)
当$m \ll n$时,交叉注意力的计算量显著更小。例如,在图像描述生成中,图像特征可能有数千个token,而生成的文本只有几十个词——交叉注意力是$(30 \times 1000)$,而非$(1000 \times 1000)$。
效率优化方向
针对$O(n^2)$的瓶颈,研究者提出了多种优化方案:
稀疏注意力:只计算部分位置的注意力。Longformer使用滑动窗口+全局token,BigBird结合随机注意力。
线性注意力:用核函数近似softmax,将复杂度降至$O(n)$。Performer、Linear Transformer属于这一类。
分块注意力:将序列分成块,块内全注意力,块间聚合。LongT5、Block-Recurrent Transformer采用这种策略。
硬件优化:FlashAttention不改变理论复杂度,但通过重新安排计算顺序、减少内存读写,在GPU上实现数倍加速。
多模态时代:交叉注意力的新使命
交叉注意力在多模态大模型中获得了新的生命。
图像描述生成
当模型需要为一幅图像生成文字描述时:
- 编码器:Vision Transformer处理图像,输出图像token的表示
- 解码器:文本解码器生成描述
- 交叉注意力:文本解码器"查询"图像特征
生成"A cat sitting on a mat"中的"cat"时,交叉注意力会聚焦于图像中猫的区域;生成"mat"时,会聚焦于垫子的区域。
现代多模态架构的两种路径
根据Sebastian Raschka的分析,现代多模态大模型主要采用两种架构:
统一嵌入-解码器架构:将图像token和文本token拼接,统一输入到Decoder-only模型。LLaVA、Qwen-VL采用这种方案。这种方式不需要交叉注意力,但会增加输入长度。
跨模态注意力架构:保持图像编码器独立,通过交叉注意力将图像特征融入文本解码器。Flamingo、Llama 3.2采用这种方案。这种方式计算效率更高,且可以保持原始文本模型的能力。
graph TB
subgraph 方案A: 统一嵌入
A1[图像] --> A2[图像编码器]
A3[文本] --> A4[文本嵌入]
A2 --> A5[拼接]
A4 --> A5
A5 --> A6[Decoder-only LLM]
A6 --> A7[输出]
end
subgraph 方案B: 交叉注意力
B1[图像] --> B2[图像编码器]
B2 --> B3[K, V]
B4[文本] --> B5[文本嵌入]
B5 --> B6[解码器自注意力]
B6 --> B7[交叉注意力]
B3 --> B7
B7 --> B8[输出]
end
NVLM的实验发现
NVIDIA的NVLM论文同时实现了两种架构,并给出了有趣的结论:
- 跨注意力方案(NVLM-X):对高分辨率图像更高效,因为不需要将大量图像token放入上下文
- 统一嵌入方案(NVLM-D):在OCR相关任务上准确率更高
- 混合方案(NVLM-H):结合两者优势,缩略图用统一嵌入,细节区域用交叉注意力
这印证了一个重要观点:架构选择取决于具体任务和数据特性。
注意力的可解释性:我们真的理解模型在做什么吗?
注意力权重可视化是理解模型行为的重要工具。但一个有趣的问题是:注意力权重真的能解释模型的决策吗?
可视化揭示的洞察
通过可视化注意力矩阵,研究者发现:
- 语法依赖:自注意力头能够捕捉主谓一致、名词修饰等语法关系
- 共指消解:某些头专门关注代词的先行词
- 位置模式:部分头呈现对角线或局部模式,关注相邻词
在机器翻译中,交叉注意力的可视化清晰展示了源语言和目标语言的对齐关系——生成"s’est"时高亮"sat",生成"chat"时高亮"cat"。
注意力≠解释的争议
然而,越来越多的研究表明:注意力权重不等于模型决策的解释。
Jain和Wallace在2019年的论文中指出,可以构造反例:改变注意力权重分布但保持模型预测不变。这意味着模型可能通过其他路径做出决策,注意力只是众多信息流之一。
更准确的说法是:注意力权重揭示了模型在关注什么,但不一定揭示模型为什么做出某个决策。它是一个诊断工具,而非完整的解释框架。
实践指南:如何选择和调优注意力机制
基于前面的分析,这里提供一些实践建议。
任务匹配
| 任务 | 首选方案 | 注意力类型 |
|---|---|---|
| 短文本分类 | Encoder-only | 双向自注意力 |
| 长文档处理 | Encoder-only + 稀疏注意力 | 双向自注意力(优化版) |
| 开放式生成 | Decoder-only | 因果自注意力 |
| 机器翻译 | Encoder-Decoder | 自注意力 + 交叉注意力 |
| 图像理解 | Decoder-only | 因果自注意力 + 图像token |
| 图像描述 | Encoder-Decoder | 交叉注意力融合视觉 |
序列长度考量
- < 512 tokens:标准注意力足够
- 512-4096 tokens:考虑FlashAttention
- > 4096 tokens:需要稀疏注意力或分块策略
训练稳定性
自注意力在深层网络中容易出现梯度消失或爆炸。现代实践采用的解决方案:
- Pre-LN:在注意力之前做LayerNorm,而非之后
- 残差连接:保留梯度直通路径
- 注意力缩放:$\frac{1}{\sqrt{d_k}}$防止点积过大
总结:两种机制,一个核心思想
自注意力和交叉注意力看似不同,实则共享同一个核心思想:通过可学习的权重,动态聚合相关信息。
自注意力让序列中的每个元素都能与所有其他元素"对话",建立内部关系。这是理解一个序列的基础——无论是文本、图像还是音频。
交叉注意力让一个序列能够"查询"另一个序列的信息。这是融合不同信息源的关键——无论是源语言与目标语言、图像与文本、还是文档与问题。
从2014年Bahdanau的开创性工作到今天千亿参数的大模型,注意力机制的核心公式几乎没有改变。变的只是规模、应用场景和优化技巧。这恰恰说明:一个简洁而正确的设计,其生命力远超复杂的变体。
理解这两种注意力机制的区别,不仅是掌握Transformer架构的必要前提,也是理解整个大模型技术发展脉络的关键线索。当你在选择BERT、GPT还是T5作为你的模型基础时,本质上是在回答一个架构问题:你的任务是需要在同一序列内建立关系,还是需要连接两个不同的信息世界?
参考文献
- Vaswani, A., et al. (2017). Attention Is All You Need. NeurIPS.
- Bahdanau, D., Cho, K., & Bengio, Y. (2014). Neural Machine Translation by Jointly Learning to Align and Translate. ICLR.
- Luong, M. T., Pham, H., & Manning, C. D. (2015). Effective Approaches to Attention-based Neural Machine Translation. EMNLP.
- Devlin, J., et al. (2018). BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. NAACL.
- Radford, A., et al. (2019). Language Models are Unsupervised Multitask Learners. OpenAI.
- Raffel, C., et al. (2019). Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer. JMLR.
- Raschka, S. (2024). Understanding Multimodal LLMs. Ahead of AI.
- Jain, S., & Wallace, B. C. (2019). Attention is not Explanation. NAACL.
- Dosovitskiy, A., et al. (2020). An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale. ICLR.
- Alayrac, J. B., et al. (2022). Flamingo: a Visual Language Model for Few-Shot Learning. NeurIPS.