# 6.3 Transformer 的注意力机制详解

> 注意力机制就是 AI 的“聚焦能力”。当你同时看一句话和一张图，你的眼睛不是均匀扫过每个像素，而是集中在重要的部分——AI 也是这样。

## 6.3.1 一个词的多重身份：歧义问题

在自然语言里，同一个词在不同上下文中可能有完全不同的含义。

**例子 1：苹果**

* “我吃苹果。”—— 苹果 = 水果。
* “苹果发布新品。”—— 苹果 = 公司名。

**例子 2：bank**

* “I went to the bank to withdraw money.” —— bank = 金融机构。
* “We sat on the river bank.” —— bank = 河岸。

相同的字/词，在不同句子里，角色完全改变。

**传统的方法有多笨？**

早期的 RNN 模型（如 LSTM）会这样处理：

1. 读第一个字 → 记住“苹”的某种特征。
2. 读第二个字“果”→ 根据之前的“苹”，逐步更新对整个词的理解。
3. 这种“逐个处理”的方式天生受限：当信息链条太长（比如 100 个字后才出现关键信息），之前的信息会被“遗忘”。

**Transformer 的聪慧方式：**

不是逐个处理，而是 **“一下子看遍全部”，然后根据上下文重新理解每个字**。

## 6.3.2 注意力的三重奏：Query、Key、Value

Transformer 的核心是 **自注意力机制（Self-Attention）**。

**最简化的解释：在图书馆里找书。**

```
场景：你是图书馆员，有 100 本书在面前。

Visitor 走进来说："我要找关于'猫'的书。"
这句话叫 Query（查询）。

你的大脑里有一份书单记忆（索引），上面记着：
  - 第 1 本：关于"狗"
  - 第 2 本：关于"猫咪的故事"
  - 第 3 本：关于"猫科动物进化"
  - 第 4 本：关于"家具设计"
这份记忆叫 Key（索引）。

现在你根据 Query（找"猫"的书）去扫描 Key（书单），找出匹配度：
  - 第 2 本：匹配度 95%（就是讲猫的）
  - 第 3 本：匹配度 92%（也讲猫，但角度不同）
  - 第 1 本：匹配度 5%（讲的是狗，不是猫）
  - 第 4 本：匹配度 2%（讲家具，完全无关）

最后，你根据这些"匹配度权重"，把对应的书内容（Value）加权组合起来，递给 Visitor。
```

**用数学表达：**

$$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d\_k}}\right)V$$

翻译成白话：

1. $QK^T$ ：Query 和 Key 的匹配度（点积）。
2. $\text{softmax}$ ：把匹配分数转成权重分布（同一行权重加起来 = 1，可理解为 100%）。
3. $\sqrt{d\_k}$ ：一个平衡因子（防止权重被冲击得太极端）。
4. $\times V$ ：用这些权重组合 Value（实际内容）。

**具体例子：处理“我吃苹果”**

```
原句：我 吃 苹 果
```

当处理“苹”字时：

| 词语 | Key（身份） | Query（“苹”看其他词） | 匹配分数（示意） | softmax 后权重（示意） |
| -- | ------- | -------------- | -------- | --------------- |
| 我  | 主语      | 我和苹有关吗？        | 低        | 5%              |
| 吃  | 动词      | 吃和苹有关吗？        | 高        | 35%             |
| 苹  | 当前字     | 苹和苹有关吗？        | 中        | 25%             |
| 果  | 水果的补充   | 果和苹有关吗？        | 高        | 35%             |

最后，模型根据这些权重的组合，理解“苹”在这个句子中特指“苹果（水果）”。

## 6.3.3 自注意力 vs 交叉注意力

**自注意力（Self-Attention）：** 一句话内部的各个字/词相互看对方。

```
句子：我 吃 了 一 个 红 苹 果

自注意力：
  "我" 看其他词 → "吃"很重要，"苹果"是宾语，与我有关
  "苹" 看其他词 → "红"是修饰我的，"吃"是动词，我是被吃的
```

**交叉注意力（Cross-Attention）：** 一句话的部分去看另一句话。

```
中文："我吃苹果"
英文："I eat an apple"

交叉注意力：
  中文的"我" 去看英文的每个词 → 最匹配"I"
  中文的"吃" 去看英文的每个词 → 最匹配"eat"
```

**Transformer 在不同任务中的用法：**

| 任务           | 自注意力            | 交叉注意力       |
| ------------ | --------------- | ----------- |
| 语言模型（GPT）    | 用。上下文理解         | 不用。只需要前文    |
| 机器翻译         | 用。理解原句结构        | 用。对齐原文和目标文  |
| 图像 + 文字（多模态） | 用。图像内部和文字内部各自理解 | 用。让文字去“看”图像 |

## 6.3.4 多头注意力：听不同的声音

一个 Query 对 Key 的关注，可能有多种角度。

**比如看一个人：**

* 头 1：从“长相”的角度看，这个人像我朋友 A。
* 头 2：从“气质”的角度看，这个人像我朋友 B。
* 头 3：从“身高”的角度看，这个人像我朋友 C。

**三个不同的“关注视角”，给了模型更丰富的信息。**

```mermaid
graph LR
    Q["Query<br>(需要理解的词)"]

    Q --> H1["头 1:<br>语法角度"]
    Q --> H2["头 2:<br>语义角度"]
    Q --> H3["头 3:<br>推理角度"]

    H1 --> K1["与其他词的<br>语法关系"]
    H2 --> K2["与其他词的<br>语义关系"]
    H3 --> K3["与其他词的<br>逻辑关系"]

    K1 --> CONCAT["拼接所有头的<br>输出结果"]
    K2 --> CONCAT
    K3 --> CONCAT

    CONCAT --> OUT["最终理解"]

    style Q fill:#fff3e0,stroke:#ff9800,stroke-width:2px
    style OUT fill:#e8f5e9,stroke:#4caf50,stroke-width:2px
```

在实践中，现代 LLM 用的多头注意力通常有 64、96 甚至 128 个“头”，每个头都从不同的特征空间去理解。

## 6.3.5 为什么 Transformer 击败了 RNN？

这是个扭转整个 AI 历史的问题。

**RNN（如 LSTM）的悲剧：**

* 必须从左到右逐个处理字。
* 第 1 个字处理时，还不知道第 100 个字是什么。
* 当要用第 100 个字的信息来修正第 1 个字的理解时，可能“来不及”或“信息衰减”。
* **结果：长距离依赖（Long-range Dependency）很难学。**

**Transformer 的优势：**

* 一次性看遍全部词。
* 每个词都能直接“看到”所有其他词。
* 注意力权重会自动学会“哪些词对这个词重要”。
* **结果：再远的距离依赖，也只要一步“注意力距离”。**

**性能对比：**

* RNN/LSTM：可以处理相对长的序列，但超过几百个词时，长距离依赖开始失效。
* Transformer：能处理数百万 token 的上下文（当然，显卡要很贵）。

**计算效率：**

* RNN：必须逐个处理，无法并行。
* Transformer：所有词可以并行处理。

所以，**Transformer 用“并行计算”换来了“全局感知”**，这笔生意太划算了。

## 6.3.6 位置编码：让 AI 知道“顺序”

有个细节很容易被忽视：**Transformer 没有“顺序”的概念。**

它一次性处理全部词，完全是平行的。那它怎么知道“第 1 个词在最前面，第 10 个词在中间”？

答案：**位置编码（Positional Encoding）**。

最简单的方法就是：给每个位置加一个“ID”。

```
词 1：[词向量] + [位置 ID: 1]
词 2：[词向量] + [位置 ID: 2]
词 3：[词向量] + [位置 ID: 3]
```

这样，模型就知道了“顺序”。

原始 Transformer 用的是三角函数编码（Sinusoidal Positional Encoding）：

$$PE\_{(pos, 2i)} = \sin(pos / 10000^{2i/d})$$ $$PE\_{(pos, 2i+1)} = \cos(pos / 10000^{2i/d})$$

（数学细节不重要，只需知道：每个位置都有独特的“编码指纹”）

> \[!TIP] **一个小秘密：** 现在很多 LLM 已经放弃了固定的位置编码，改用“相对位置”或“旋转位置编码（RoPE）”。原因是：如果你用了固定位置编码，模型就无法处理比训练时更长的序列（比如，你用长度 2K 的文本训练，突然来了 4K 的输入，模型就懵了）。

## 6.3.7 思考题

现在你理解了注意力机制的核心逻辑。

那么问题来了：

**1. 人类的“注意力”和 AI 的“注意力”有什么本质区别吗？**

你读这段文字时，你的视觉和理解，是不是也在“权衡”每个词的重要性？

**2. 如果 Transformer 能处理数百万 token，为什么不能处理“无限”的上下文？**

（提示：想想内存和计算成本。注意力矩阵的大小是 $O(n^2)$ 的——token 数量翻倍，计算量就翻四倍）

**3. 会不会有更高效的“注意力”替代品？**

（实际上，这是当前 AI 研究的热门方向。Mamba、Hyena Network 等新模型都在尝试挑战 Transformer）


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://yeasy.gitbook.io/ai_beginner_guide/di-er-bu-fen-he-xin-ji-shu-jie-xi/06_llm/6.3_transformer_attention.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
