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"这个词的注意力时:

  1. 用$Q_{\text{sat}}$与$K_{\text{The}}$、$K_{\text{cat}}$、$K_{\text{sat}}$分别计算点积
  2. 通过softmax得到注意力权重,例如可能是$[0.1, 0.6, 0.3]$
  3. 用这个权重对$V_{\text{The}}$、$V_{\text{cat}}$、$V_{\text{sat}}$进行加权求和
  4. 得到"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")时:

  1. 解码器基于已生成的"Le chat"产生一个查询向量$Q$
  2. 这个$Q$与编码器输出的所有$K$(对应"The"、“cat”、“sat”)计算相似度
  3. 发现与"sat"的$K$最相似,因此对"sat"的$V$赋予最高权重
  4. 将加权后的信息融合到当前生成过程

这就是为什么翻译模型能够"对齐"源语言和目标语言的词——交叉注意力自动学习到了"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等人的贡献在于:

  1. 统一:将注意力机制抽象为Query、Key、Value的框架,加性注意力和乘性注意力都成为特例
  2. 简化:选择了计算最高效的缩放点积注意力
  3. 创新:用自注意力完全替代了循环神经网络
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解码器的每个块包含:

  1. 带掩码的自注意力
  2. 交叉注意力(查询解码器,键值来自编码器)
  3. 前馈神经网络

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$的序列,注意力计算需要:

  1. 计算$QK^T$:$(n \times d) \times (d \times n) = O(n^2 \cdot d)$
  2. 对$n \times n$矩阵做softmax:$O(n^2)$
  3. 与$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作为你的模型基础时,本质上是在回答一个架构问题:你的任务是需要在同一序列内建立关系,还是需要连接两个不同的信息世界?


参考文献

  1. Vaswani, A., et al. (2017). Attention Is All You Need. NeurIPS.
  2. Bahdanau, D., Cho, K., & Bengio, Y. (2014). Neural Machine Translation by Jointly Learning to Align and Translate. ICLR.
  3. Luong, M. T., Pham, H., & Manning, C. D. (2015). Effective Approaches to Attention-based Neural Machine Translation. EMNLP.
  4. Devlin, J., et al. (2018). BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. NAACL.
  5. Radford, A., et al. (2019). Language Models are Unsupervised Multitask Learners. OpenAI.
  6. Raffel, C., et al. (2019). Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer. JMLR.
  7. Raschka, S. (2024). Understanding Multimodal LLMs. Ahead of AI.
  8. Jain, S., & Wallace, B. C. (2019). Attention is not Explanation. NAACL.
  9. Dosovitskiy, A., et al. (2020). An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale. ICLR.
  10. Alayrac, J. B., et al. (2022). Flamingo: a Visual Language Model for Few-Shot Learning. NeurIPS.