---
title: "Transformer Attention 机制入门:从直觉到公式"
description: "一句话理解 Attention 让模型在处理一个 token 时, 按需\"查阅\"序列里所有其他 token ,并按相关性强弱分配注意力权重——这一步替代了 RNN 串行传递信息的方式,让远距离 token 之间可以一步直达。 --- 生活例子:在一间嘈杂的咖啡馆里听人说话 想象你在咖啡馆听朋友讲一段故事,背景有 6…"
canonical_url: "https://threadlab.pages.dev/d/gGZ6AJdtTuyJTS"
published_at: "2026-07-23T02:41:51.852Z"
updated_at: "2026-07-22T08:22:18.174Z"
word_count: 2033
source: "ALab public document"
---

# Transformer Attention 机制入门:从直觉到公式

## 一句话理解

Attention 让模型在处理一个 token 时,**按需"查阅"序列里所有其他 token**,并按相关性强弱分配注意力权重——这一步替代了 RNN 串行传递信息的方式,让远距离 token 之间可以一步直达。

---

## 生活例子:在一间嘈杂的咖啡馆里听人说话

想象你在咖啡馆听朋友讲一段故事,背景有 6 个人同时在聊天。朋友讲到"他"的时候,你需要知道"他"指的是谁。

- **Query(查询)**:你脑子里那个悬而未决的问题——"这里的'他'是谁?"
- **Key(键)**:故事里之前出现的每个人名,像图书馆书脊上的标签,告诉你"我能匹配哪类问题"。
- **Value(值)**:一旦匹配上,每个名字背后携带的实体信息(身份、关系、状态)。

你不会平等地听所有人说话——你把"注意力"集中在和"他"最相关的那个人名上,并按相关程度打分。这就是 attention。

---

## Query / Key / Value 的直观含义

| 角色 | 是什么 | 类比 | 维度 |
| --- | --- | --- | --- |
| **Q** | 当前 token 发出的"提问向量" | 我想找什么 | $(n, d_k)$ |
| **K** | 每个位置的"标签向量" | 我能提供什么 | $(n, d_k)$ |
| **V** | 每个位置携带的"信息向量" | 我实际提供的内容 | $(n, d_v)$ |

三者都由同一个输入 $X$ 经过三个不同的可学习权重矩阵 $W^Q, W^K, W^V$ 线性投影得到,这是 attention 拥有强大表达力的关键:**同一个语义空间被投影成三种角色**。

---

## Scaled Dot-Product Attention 公式

$$
\text{Attention}(Q, K, V) = \text{softmax}\!\left(\frac{QK^\top}{\sqrt{d_k}}\right)V
$$

逐步拆解:

1. $QK^\top$:用点积衡量每对 token 的相似度,得到 $n \times n$ 的相关性矩阵。
2. **除以 **$\sqrt{d_k}$**(scaling)**:维度越高,点积方差越大,softmax 容易把所有权重压到一个 token 上(梯度消失)。除以 $\sqrt{d_k}$ 把方差拉回 1,稳定训练。原论文给出的经验值就是 $\sqrt{d_k}$。
3. **softmax(按行)**:把每一行分数变成概率分布 $\alpha_{ij}$,所有权重和为 1,这就是"注意力分配"。
4. **乘以 $V$**:用权重对所有 value 做加权求和,得到每个位置的新表示。

> 这就是 scaled dot-product 的全部故事:**相似度打分 → 归一化 → 加权聚合**。

### 紧凑图解流程

```mermaid
flowchart LR
    X[输入 X] --> Qp[× W^Q]
    X --> Kp[× W^K]
    X --> Vp[× W^V]
    Qp --> S["打分<br/>QKᵀ / √d_k"]
    Kp --> S
    S --> M["Mask<br/>可选"]
    M --> Sm[Softmax 按行]
    Sm --> W[注意力权重 α]
    Vp --> O[加权求和 αV]
    W --> O
    O --> Out[每个位置的新表示]

```

---

## Self-Attention vs Cross-Attention

| 维度 | Self-Attention | Cross-Attention |
| --- | --- | --- |
| Q 来源 | 当前序列的某个位置 | **解码器**当前位置 |
| K, V 来源 | **同一个序列**的其他位置 | **编码器**输出 |
| 用途 | 让序列内每个位置看到全序列上下文 | 让解码器在生成时"查阅"输入序列 |
| 出现位置 | 编码器、解码器都有 | 只在解码器 |

直觉上:**self-attention 是"内部对话",cross-attention 是"和外部资料对话"**。Transformer 解码器在生成第 $t$ 个词时,通过 cross-attention 回头查编码器,把"我应该关注输入的哪一部分"这个决策交由学习得到的 $W^Q$、$W^K$、$W^V$ 自动完成。

---

## Multi-Head Attention:多角度观察

单头 attention 只能学到一种"相关性模式",但语言里有多种关系需要捕捉(主谓、指代、并列、修饰等)。Multi-Head 的做法是:

$$
\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h)W^O
$$

$$
\text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V)
$$

- 把 $d_{\text{model}}$ 拆成 $h$ 份,每份独立做 attention。
- 不同的 head 学会关注不同子空间——一个可能抓语法,一个可能抓共指,一个可能抓长距离依赖。
- 最后拼接回 $d_{\text{model}}$ 维,过一层线性投影 $W^O$ 融合。

> **直觉**:Multi-Head 不是"多个模型投票",而是"同一序列在多个语义频道上被同时观察"。

---

## Masked Attention:让模型"看不到未来"

在解码器训练时,第 $t$ 个位置不能看到 $t+1$ 之后的 token,否则就是"作弊"。

实现方式很简洁——在 softmax 之前,把要屏蔽的位置加上一个极大的负数(通常是 $-\infty$):

$$
\text{masked}_{ij} =
\begin{cases}
\frac{QK^\top}{\sqrt{d_k}}, & j \le i \\
-\infty, & j > i
\end{cases}
$$

softmax 后,被屏蔽的位置权重严格为 0。这种 mask 叫 **causal mask** 或 **look-ahead mask**,保证自回归生成的合法性。

```mermaid
flowchart TD
    A[位置 i 的 query] --> B{位置 j ≤ i?}
    B -- 是 --> C[正常打分]
    B -- 否 --> D[填 -∞]
    C --> E[Softmax]
    D --> E
    E --> F[权重仅来自过去]

```

---

## Softmax 归一化的直觉

为什么要用 softmax,而不是直接用原始点积做加权?

- **可解释性**:权重变成概率,可以直接说"这个位置 70% 的注意力在主语上"。
- **梯度友好**:把无界分数压到 $(0,1)$,避免数值爆炸。
- **竞争机制**:softmax 让高分的更突出,低分的被压扁,实现"赢者通吃"——但因为有平滑性,梯度仍可流动。
- **可加性**:权重和为 1,加权平均是凸组合,数值稳定。

> 一个常见误区:softmax 不是"算概率",而是**把任意实数向量映射成单纯形上的概率分布**——在这里它顺带完成了"归一化 + 竞争 + 平滑"三件事。

---

## Transformer Attention vs RNN

| 维度 | RNN | Transformer Attention |
| --- | --- | --- |
| 信息传递路径 | 沿时间步串行,长度 $O(n)$ | 任意两位置一步直达,$O(1)$ |
| 长距离依赖 | 梯度易消失/爆炸 | 直接通过 $\alpha_{ij}$ 传递 |
| 并行性 | 必须按时间步顺序算 | 整序列可并行 |
| 计算复杂度 | $O(n \cdot d^2)$(逐时间步) | $O(n^2 \cdot d)$(自注意力的 $n^2$ 项) |
| 内存 | 隐藏状态,常驻显存 | 需存 $n \times n$ 注意力矩阵 |
| 位置信息 | 天然有序 | 需要额外 position encoding |

**核心取舍**:RNN 用"顺序归纳偏置"换长序列的线性复杂度;Transformer 用"全连接注意力"换远距离依赖和并行性。Attention 的 $O(n^2)$ 在长序列下成为瓶颈,这是后来 Longformer、Linformer、FlashAttention、线性 attention 等优化的出发点。

---

## 自测题(8 道)

### Q1. Q、K、V 一定来自不同输入吗?

**答**:不一定。Self-attention 中三者都来自同一序列;Cross-attention 中 Q 来自解码器,K/V 来自编码器。Q/K/V 的来源取决于 attention 的角色,不要求物理上不同。

### Q2. 为什么要除以 $\sqrt{d_k}$?

**答**:当 $d_k$ 较大时,$QK^\top$ 的方差会随 $d_k$ 线性增长,导致 softmax 输入过大,梯度接近 0。除以 $\sqrt{d_k}$ 把方差拉回 1,稳定训练。原论文(Vaswani et al., 2017)给出了这一推导。

### Q3. Multi-Head Attention 中,头数 $h$ 越多越好吗?

**答**:不是。$h$ 增大时,每头维度 $d_k = d_{\text{model}}/h$ 相应减小,单头表达能力下降;且增加显存与算力开销。需要在表达力和效率间权衡,实践中常取 $h=8$ 或 $16$。

### Q4. 训练时使用 mask,推理时还需要吗?

**答**:需要。推理是自回归生成,每一步仍然只能看到已生成的 token,否则会"预知未来"导致生成崩塌。Mask 不是训练专属技巧,而是自回归结构的内在约束。

### Q5. Softmax 的输出一定是稀疏的吗?

**答**:不一定。Softmax 天然给所有位置非零权重,只有当某个分数远大于其他时,才会出现"近似 one-hot"的近稀疏现象。这正是温度参数或 attention dropout 调控的对象。

### Q6. Attention 权重 $\alpha_{ij}$ 的大小说明什么?

**答**:它表示位置 $i$ 在形成新表示时,从位置 $j$ 提取了多少信息。数值大说明 $j$ 对 $i$ 的预测/编码"贡献大",但不直接等于因果关系——attention 不是解释性指标,需谨慎使用。

### Q7. Self-attention 是位置无关的,如何弥补?

**答**:在输入 embedding 上加 **位置编码**(Positional Encoding),正弦版本或可学习版本,把绝对/相对位置信息显式注入。否则打乱词序后模型输出不变,违背语言特性。

### Q8. 为什么 Attention 能替代 RNN 处理长序列?

**答**:RNN 中信息必须沿时间步串行压缩进隐藏态,长距离依赖在链式乘法中易衰减;Attention 让任意两位置直接计算相关性,路径长度为常数 $O(1)$,且整序列可并行,实际训练效率远高于 RNN。

---

## 进一步阅读

- Vaswani et al., *Attention Is All You Need*, NeurIPS 2017(原论文)
- Jay Alammar, *The Illustrated Transformer*(图解经典)
- 3Blue1Brown 的 Attention 视频(直观可视化)
- *Formal Algorithms for Transformers*(DeepMind, 推导严谨)
