# 3.3 位置编码：为什么顺序信息必须显式注入

自注意力机制有一个根本性的特征：**在没有位置编码时，它对输入顺序是置换等变的**（Permutation Equivariant）。这意味着，注意力权重的计算只依赖于向量的内容而与向量的位置标签无关。换句话说，如果打乱输入序列中元素的顺序但保持元素本身不变，输出序列会跟着同样重排；对于任意特定元素，它与其他元素的注意力交互方式完全相同——只要这些元素的内容不变。

## 3.3.1 为什么注意力看不到顺序

回顾注意力的计算：$$\text{Attention}(Q, K, V) = \text{softmax}(QK^T / \sqrt{d\_k})V$$。注意力权重 $$\alpha\_{ij}$$ 只取决于 $$q\_i$$ 和 $$k\_j$$ 的点积，**与** $$i$$ **和** $$j$$ **的绝对位置无关**。

换句话说，如果没有位置信息，对于注意力机制而言，“我爱你”和“你爱我”中每个词计算出的表示特征是一模一样的（只是由于输入顺序不同，它们在输出序列里的排列位置跟着变了）。词“我”在这两个短语中对“爱”和“你”的注意力权重分配完全相同，导致它输出的上下文向量也完全相同。但显然，自然语言中词的先后顺序决定了截然不同的语义。

这与 RNN 和 CNN 形成了鲜明对比：

* **RNN**：通过顺序处理天然编码了位置信息——先处理的是位置 1，后处理的是位置 2
* **CNN**：滤波器的位置是固定的，不同位置的卷积结果自然不同

Transformer 放弃了循环和卷积后，**必须通过其他方式将位置信息注入模型**。

位置编码（Positional Encoding）正是解决方案。

## 3.3.2 位置编码的基本思路

最直接的方式是为每个位置分配一个与位置相关的向量，然后与词嵌入**相加**：

$$\text{Input}\_i = \text{Embed}(x\_i) + \text{PE}(i)$$

为什么是相加而不是拼接（Concatenation）？相加的好处是**不增加模型维度**——输入维度始终是 $$d\_{\text{model}}$$，后续所有层的计算量不变。虽然相加会导致词义信息和位置信息的混合，但实践证明模型有足够的能力从混合表示中分离出这两种信息。

## 3.3.3 正弦位置编码初探

原始 Transformer 使用的是**正弦位置编码**（Sinusoidal Positional Encoding），通过不同频率的正弦和余弦函数为每个位置生成一个唯一向量：

$$\text{PE}(pos, 2i) = \sin\left(\frac{pos}{10000^{2i/d\_{\text{model}}}}\right)$$

$$\text{PE}(pos, 2i+1) = \cos\left(\frac{pos}{10000^{2i/d\_{\text{model}}}}\right)$$

其中 $$pos$$ 是位置索引，$$i$$ 是维度索引。直觉上，不同维度对应不同的“频率”——低维度变化快（编码细粒度的位置差异），高维度变化慢（编码粗粒度的位置模式）。这类似于二进制计数器中低位快速翻转、高位缓慢翻转的原理。

正弦编码的一个重要特性是：**任意两个位置之间的相对距离可以通过线性变换表示。** 即 $$\text{PE}(pos + k)$$ 可以表示为 $$\text{PE}(pos)$$ 的线性函数，这使得模型有可能学习到关注“相对位置”而非仅仅“绝对位置”。

关于正弦编码、可学习位置编码、旋转位置编码（RoPE）等不同方案的深入对比和设计哲学，将在[第四章](/llm_internals/di-yi-bu-fen-ji-chu-pian/04_position_encoding.md)中详细讨论。此处只需理解关键点：**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/llm_internals/di-yi-bu-fen-ji-chu-pian/03_components/3.3_position_encoding.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.
