注意力机制 (Attention Mechanism)
核心直觉
[!tip] 一句话理解 注意力机制让模型在处理每个词时,能”看向”序列中其他所有词,并根据相关性动态分配权重。
传统 RNN 把整个序列压缩成一个固定向量,信息瓶颈严重。注意力机制打破了这个限制——不压缩,而是查询。
Q / K / V 三元组
注意力的核心是一个软查询系统:
| 角色 | 含义 | 类比 |
|---|---|---|
| Q (Query) | 当前位置”想要什么” | 搜索关键词 |
| K (Key) | 每个位置”能提供什么标签” | 文档标签 |
| V (Value) | 每个位置”实际携带的内容” | 文档正文 |
计算步骤
$$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$
- 相似度打分:$QK^T$ — Q 与每个 K 做点积,得到相关性分数
- 缩放:除以 $\sqrt{d_k}$ 防止梯度消失(维度越大点积越大)
- 归一化:softmax 将分数转为概率分布(权重之和为 1)
- 加权求和:用权重对 V 加权,得到当前位置的输出
Self-Attention(自注意力)
Q、K、V 全部来自同一序列,让序列内部的每个位置互相”关注”。
graph LR
X["输入序列 X"] --> Q["Q = X·W_Q"]
X --> K["K = X·W_K"]
X --> V["V = X·W_V"]
Q & K --> Score["相似度打分 QKᵀ/√d_k"]
Score --> Softmax["Softmax → 权重"]
Softmax & V --> Out["输出 Z"]
关键能力:捕捉长距离依赖。例如 “The animal didn’t cross the street because it was too tired” 中,it 能直接关注到 animal,无需逐步传递。
Multi-Head Attention(多头注意力)
[!note] 为什么需要多头? 单头注意力只能关注一种关系模式。多头让模型并行学习多种关系(语法、语义、指代…)。
$$\text{MultiHead}(Q,K,V) = \text{Concat}(\text{head}_1, \ldots, \text{head}_h), W^O$$
$$\text{head}_i = \text{Attention}(QW_i^Q,\ KW_i^K,\ VW_i^V)$$
- 每个 head 有独立的投影矩阵 $W^Q, W^K, W^V$
- 各 head 并行计算,结果拼接后再线性投影
- 典型配置:GPT-2 small = 12 heads,d_model = 768,每头 d_k = 64
在 Transformer 中的位置
graph TD
A["输入 Embedding + 位置编码"] --> B["Multi-Head Self-Attention"]
B --> C["Add & Norm(残差连接)"]
C --> D["Feed-Forward Network"]
D --> E["Add & Norm"]
E --> F["下一层 / 输出"]
- Encoder:只有 Self-Attention,每个位置可关注所有位置
- Decoder:有 Masked Self-Attention(只看左侧)+ Cross-Attention(Q 来自 Decoder,K/V 来自 Encoder 输出)
复杂度与局限
| 项目 | 值 |
|---|---|
| 时间复杂度 | $O(n^2 \cdot d)$,n 为序列长度 |
| 空间复杂度 | $O(n^2)$(注意力矩阵) |
| 主要瓶颈 | 长序列时二次方增长,催生了 FlashAttention、线性注意力等变体 |
相关概念
- Transformer — 注意力机制的主要应用架构
- 位置编码 — 注意力本身无序列顺序感知,需要额外注入
- FlashAttention — IO 感知的高效注意力实现
- KV Cache — 推理时缓存 K/V 加速生成
- Cross-Attention — Encoder-Decoder 架构中的跨序列注意力