# 2.1 查询-键-值：一种信息检索的直觉

Transformer 中的注意力机制基于三个核心概念：**查询**（Query）、**键**（Key）和**值**（Value），通常简写为 Q、K、V。这套术语来自信息检索领域，理解这个类比是掌握注意力机制的第一步。

## 2.1.1 搜索引擎的类比

想象在搜索引擎中查找信息的过程：

1. 输入一个**搜索词**（Query）——这是想要查找的内容
2. 搜索引擎将搜索词与数据库中每个网页的**关键词**（Key）进行匹配
3. 找到最匹配的结果后，返回对应网页的**内容**（Value）

注意力机制的工作方式与此惊人地相似：

1. 当前位置的表示被投影为一个**查询向量**（Query）——“我需要什么信息？”
2. 序列中每个位置的表示被投影为**键向量**（Key）——“我有什么信息？”
3. 查询与所有键进行匹配，计算相关性分数
4. 根据相关性分数，对每个位置的**值向量**（Value）进行加权求和——“提取相关信息”

但与搜索引擎不同的是，注意力机制做的是**软匹配**：它不是只返回最匹配的一个结果，而是根据匹配程度对所有结果进行加权混合。这种“软检索”使得梯度可以流过整个过程，从而允许端到端训练。

## 2.1.2 为什么需要三个独立的投影

一个自然的问题是：**为什么需要把输入分别投影为 Q、K、V 三个不同的向量？直接用输入本身做比较不行吗？**

答案涉及表示灵活性与角色分离的考量。

如果直接用输入向量 $$x\_i$$ 和 $$x\_j$$ 计算注意力，那么一个位置在“被查找”时和“提供信息”时使用的是完全相同的表示。但在语言中，一个词在不同语境下的“需求”（它需要关注什么）和“供给”（它能提供什么信息）往往是不同的。

以动词“跑”为例：作为查询时，它可能在寻找自己的主语和宾语；作为键时，它可能在向修饰词表明自己是一个动作。这两种角色需要不同的向量表示。

**Q、K、V 的三重投影正是为每个位置创建了三种独立的表示**，让模型能够灵活地区分“寻找什么”、“提供什么标识”和“提供什么内容”这三种不同的语义角色。数学上：

$$Q = XW^Q, \quad K = XW^K, \quad V = XW^V$$

其中 $$X \in \mathbb{R}^{n \times d\_{\text{model}}}$$ 是输入矩阵（$$n$$ 个位置，每个位置 $$d\_{\text{model}}$$ 维），$$W^Q, W^K \in \mathbb{R}^{d\_{\text{model}} \times d\_k}$$ 和 $$W^V \in \mathbb{R}^{d\_{\text{model}} \times d\_v}$$ 是可学习的投影矩阵。

## 2.1.3 值为什么和键分开

还有一个更微妙的问题：**键和值为什么要分开？能不能用同一个向量既做匹配又做信息提供？**

分离键和值的设计，源于对“索引”和“内容”的区分。在数据库中，索引（键）和存储的数据（值）是不同的东西——用 ISBN 号（键）查找一本书，返回的是书的内容（值），而不是 ISBN 号本身。

类似地，在注意力机制中，键决定了“哪些位置应该被关注”，而值决定了“被关注后提供什么信息”。分离这两者让模型有更大的灵活性：匹配标准和实际提供的信息可以存在于不同的表示空间中。

这种设计在交叉注意力中尤为重要：解码器的查询来自目标序列，而键和值来自源序列。此时，键帮助解码器定位源序列中的相关位置，值则提供这些位置的实际内容。

实验也支持了这种分离的有效性——当 K 和 V 使用相同的投影矩阵时，模型性能会有可测量的下降。

## 2.1.4 向量的维度设定

在理解了 Q、K、V 的作用和独立性之后，一个非常实际的问题是：这些向量具体应该被设置为多大？在 Transformer 和大语言模型中，Q、K、V 向量的维度设定主要有以下几个层面的考量：

**1. 理论上的约束与灵活性**

查询（Query）和键（Key）的维度必须完全相同，通常记为 $$d\_k$$，因为它们需要进行点积操作 $$Q K^T \in \mathbb{R}^{n \times n}$$ 来计算注意力分数。这要求 $$W^Q \in \mathbb{R}^{d\_{\text{model}} \times d\_k}$$ 和 $$W^K \in \mathbb{R}^{d\_{\text{model}} \times d\_k}$$ 的输出维度一致。

而值（Value）向量的维度（通常记为 $$d\_v$$）在数学上可以与 $$d\_k$$ 不同——输出 $$AV \in \mathbb{R}^{n \times d\_v}$$ 仅需要 $$A \in \mathbb{R}^{n \times n}$$ 和 $$V \in \mathbb{R}^{n \times d\_v}$$ 维度兼容。但在实际模型中，通常设定 $$d\_k = d\_v$$，以简化张量形状、便于多头拼接后通过输出投影回到 $$d\_{\text{model}}$$，并保持与全维单头相近的计算量。

**2.实际模型中的大小（多头机制）**

在实际的主流大语言模型中，由于普遍采用了多头注意力（Multi-Head Attention）机制，为了保持计算的高效性和一致性，不仅设定 $$d\_k = d\_v$$，而且它们通常是由模型的总隐藏层维度（$$d\_{\text{model}}$$）平均分配给各个注意力头（$$h$$ 个）。

在原始的 Transformer 论文《Attention Is All You Need》中，作者设定 $$d\_{\text{model}} = 512$$，$$h = 8$$，并且建议 $$d\_k = d\_v = d\_{\text{model}} / h = 64$$。这确保了在计算多头注意力时，总的计算成本与使用全维度的单头注意力相似。 这意味着，每个注意力头中单组 Q、K、V 向量的维度一般都是：

$$d\_k = d\_v = \frac{d\_{\text{model}}}{h}$$

**3. 业界的典型实践**

在当今的业界实践中，各大模型通常将单头的维度大小固定在 64 或 128：

* **128 维（当代大模型的主流）**：
  * **GPT-3 (175B)**：模型维度 $$d\_{\text{model}} = 12288$$，头数 $$h = 96$$。每个 Q、K、V 向量维度为 $$12288 \div 96 = 128$$。
  * **LLaMA (7B)**：模型维度 $$d\_{\text{model}} = 4096$$，头数 $$h = 32$$。每个 Q、K、V 向量维度为 $$4096 \div 32 = 128$$。
* **64 维（早期或较小模型）**：
  * **BERT-Base**：模型维度 $$d\_{\text{model}} = 768$$，头数 $$h = 12$$。每个 Q、K、V 向量维度为 $$768 \div 12 = 64$$。
  * **GPT-2 (Small)**：模型维度 $$d\_{\text{model}} = 768$$，头数 $$h = 12$$。每个 Q、K、V 向量维度同样为 64。

简而言之，如果是单个词在特定注意力头中的 Q、K、V 向量，它们在主流大模型中的大小通常是 128 维（较小模型多为 64 维）。这是一个由模型整体维度除以注意力头数所得到的经典工程经验值。


---

# 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/llm_internals/di-yi-bu-fen-ji-chu-pian/02_attention/2.1_qkv_intuition.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.
