Skip to content

位置编码(Positional Encoding)

一句话 TL;DR:自注意力本身对输入顺序无感(置换等变),所以必须额外把"这是第几个 token"的信息注入进去。位置编码就是这层注入,主流方案经历了绝对位置编码(正弦/可学习)到相对位置编码(RoPE)的演化。


L1 · 一句话点破

位置编码的本质是:给序列中每个位置附上一个"位置向量",让模型能区分 token 的先后和距离。

它存在的唯一理由是 自注意力 的一个数学性质:置换等变(permutation equivariant)--打乱输入 token 的顺序,输出只是对应打乱,模型完全感知不到顺序变化。但语言、代码、时间序列都强依赖顺序,"狗咬人"和"人咬狗"词集相同、意思相反。所以必须额外补位置信息。

L2 · 通俗类比

想象一群人开会,每个人发言内容相同,但发言顺序决定含义(先说"同意"再说"但是"和反过来完全不同)。

  • 没有位置编码:会议记录员只记下了每个人说了什么,没记顺序。重读记录时无法还原"谁在反驳谁"。
  • 绝对位置编码:给每个人的发言标上"第 1 个发言""第 2 个发言"……记录员能知道顺序,但如果会议很长,第 1 个和第 500 个的关系只靠编号很难推断。
  • 相对位置编码:不记绝对编号,记"这个人是在那个人之后第 3 个发言的"。记录员能直接判断"这句是回应前 3 句的哪句",且这套逻辑能外推到没见过的长会议。

现代大模型(LLaMA、Qwen、Mistral 等)几乎都用相对位置编码,具体是 RoPE--下面 L4 会展开。

L3 · 正经定义

位置编码(Positional Encoding, PE) 是为弥补自注意力置换等变性而引入的位置信息注入机制。形式化地,给定 token embedding 序列 $E \in \mathbb{R}^{n \times d}$,位置编码 $P \in \mathbb{R}^{n \times d}$ 与之融合:

$$ X = E + P $$

或通过修改注意力分数的方式注入(相对位置编码)。主流方案分两类:

类型代表注入方式外推性
绝对位置编码正弦/余弦(原论文)、可学习(BERT/GPT-2)加到 embedding 上弱(超过训练长度难泛化)
相对位置编码T5 bias、ALiBi、RoPE修改注意力分数强(可外推到更长序列)

原论文 Vaswani et al., 2017 用正弦/余弦函数生成位置编码:

$$ PE_{(pos, 2i)} = \sin!\left(\frac{pos}{10000^{2i/d}}\right), \quad PE_{(pos, 2i+1)} = \cos!\left(\frac{pos}{10000^{2i/d}}\right) $$

其中 $pos$ 是位置,$i$ 是维度索引。选择正弦/余弦是为了让 $PE_{pos+k}$ 能表示为 $PE_{pos}$ 的线性函数,理论上让模型能学会"关注相对位置"。

参考资料

L4 · 原理深挖

4.1 为什么自注意力需要位置编码(数学证明)

自注意力的计算是 $\text{softmax}(QK^\top/\sqrt{d_k})V$,其中 $Q = XW_Q$、$K = XW_K$、$V = XW_V$。

如果把输入 $X$ 的行重排为 $\tilde{X} = \Pi X$($\Pi$ 是置换矩阵),则:

$$ \tilde{Q} = \Pi Q, \quad \tilde{K} = \Pi K, \quad \tilde{V} = \Pi V $$

$$ \tilde{Q}\tilde{K}^\top = \Pi Q K^\top \Pi^\top, \quad \text{softmax 沿行作用,置换不影响} $$

$$ \text{output}(\tilde{X}) = \Pi \cdot \text{output}(X) $$

也就是说,输入打乱,输出对应打乱,模型对顺序完全无感。这是置换等变性的严格证明。FFN 逐位置作用,也是置换等变的。残差和 LayerNorm 同样。所以整个 Transformer 编码器/解码器在不加位置编码时是置换等变的--必须从外部注入位置信号。

4.2 绝对位置编码:正弦 vs 可学习

正弦/余弦编码(原论文):

优点:无需训练,理论上可外推到任意长度(正弦函数对所有 $pos$ 有定义)。 缺点:实际外推效果差。训练时见过的长度范围内表现好,超出后注意力模式被破坏。"理论上能外推"和"实际能外推"是两回事。

可学习位置编码(BERT、GPT-2):

直接初始化一个 $[max_len, d]$ 的可学习矩阵,训练时和模型一起优化。

优点:表达力强,模型自己学最合适的位置表示。 缺点:$max_len$ 是硬上限。BERT 训练时 $max_len=512$,超过 512 的输入无法处理,必须截断或重训。这是可学习位置编码的最大痛点。

4.3 相对位置编码:为什么不关心"第几个",关心"隔多远"

绝对位置编码有个直觉上的问题:句首的"the"和句尾的"the",在绝对位置上差很远,但语义上是同一个词。 真正影响注意力的往往不是"第几个位置",而是"两个 token 相距多远"。

相对位置编码把注意力分数从"位置 $i$ 和位置 $j$ 的绝对位置向量点积"改成"位置 $i$ 和位置 $j$ 的相对距离 $i-j$ 对应的偏置":

$$ \text{score}{ij} = \frac{q_i \cdot k_j}{\sqrt{d_k}} + b $$

其中 $b_{i-j}$ 是相对距离的可学习偏置(T5 的做法)。这样模型只关心"相距多远",天然支持外推--训练时见过的相对距离模式在新长度下仍然适用。

ALiBiPress et al., 2022)更简洁:直接用一个与距离成正比的负斜率作为偏置,$b_{i-j} = -m \cdot (i - j)$($i > j$ 时),完全无可学习参数,外推性极强。

4.4 RoPE:当前主流的优雅方案

旋转位置编码(Rotary Position Embedding, RoPE)Su et al., 2021 提出,是 LLaMA、Qwen、Mistral、ChatGLM 等主流大模型的事实标准。

核心思想:用旋转矩阵同时编码绝对位置和相对位置。 把 $d$ 维向量看成 $d/2$ 个二维平面,在每个平面上对 Q/K 向量按位置旋转:

$$ q \to R_\theta , q, \quad k \to R_\phi , k $$

其中 $R_\theta$ 是位置 $\theta$ 对应的二维旋转矩阵。关键性质:

$$ (R_\theta q) \cdot (R_\phi k) = q \cdot (R_{\phi - \theta} k) $$

点积只依赖相对位置 $\phi - \theta$,但旋转本身是在绝对位置上施加的。这就是 RoPE 的优雅之处:用绝对位置的旋转,实现了相对位置的效果。既保留了绝对位置信息(每个位置旋转角不同),又让注意力分数只依赖相对距离。

RoPE 的优势:

  1. 外推性好:配合 NTK-aware scaling、YaRN 等技巧,可外推到训练长度的 4-8 倍。
  2. 不增加参数:旋转矩阵是固定的,无可学习参数。
  3. 与线性注意力兼容:不破坏注意力的矩阵形式,实现简洁。

LLaMA-2 的 4096 上下文,配合 YaRN 可外推到 32K+,这就是 RoPE 的功劳。

4.5 长上下文的关键:位置编码的外推

大模型从 4K -> 32K -> 128K -> 1M 上下文的演进,瓶颈不在注意力计算(FlashAttention 等已解决),而在位置编码的外推

  • 直接外推:RoPE 在训练长度内表现好,超出后注意力分数分布偏移,效果崩。
  • 位置插值(PI):把推理时的位置 $pos$ 缩放到训练范围内,$pos' = pos \cdot L_{train}/L_{infer}$。简单有效,但短距离信息被压缩。
  • NTK-aware scaling:调整 RoPE 的基频 $10000$,让低频分量外推、高频分量保持。比 PI 更保留局部信息。
  • YaRN:分段处理不同频率分量,当前外推效果最好的方案之一。

这条线是目前长上下文研究的核心战场。

4.6 最小可运行 Demo

参见 demos/positional-encoding/ -- 实现正弦位置编码和 RoPE,可视化不同位置的编码向量,直观看到"相邻位置编码相似、相远位置编码差异大"以及 RoPE 旋转的几何意义。

L5 · 沿革与坑

沿革

  • 2017 年,Vaswani 等人在原论文中提出正弦/余弦位置编码,选择正弦是因为"理论上能外推",但作者也承认这只是初步尝试。
  • 2018-2019 年,BERT 和 GPT-2 改用可学习位置编码,效果更好但牺牲了外推性。当时上下文长度普遍 512-1024,外推不是主要矛盾。
  • 2018 年,Shaw 等人提出相对位置表示,开启了"关注相对距离而非绝对位置"的路线。
  • 2020 年,T5 用相对位置 bias,效果稳定且支持一定外推。
  • 2021 年,Su 等人(追一科技)提出 RoPE,用旋转同时实现绝对+相对位置编码,数学上极其优雅。
  • 2022 年,ALiBi 提出更简洁的线性偏置方案,外推性极强但最终未成主流。
  • 2023 年,LLaMA 系列采用 RoPE 后,RoPE 成为事实标准。位置插值、NTK-aware、YaRN 等外推技巧随之成熟,支撑了 100K+ 上下文模型的爆发。
  • 2024 年,主流方向转向"无位置编码"探索--有研究(NoPE, Kazemnejad et al. 2023)表明,因果注意力本身在 softmax 归一化下隐式编码了位置,某些场景不需要显式 PE。这是当前前沿讨论。

常见误解

  • 误解:位置编码是给 token 加"序号标签"。 ✅ 真相:位置编码是 $d$ 维向量,和 token embedding 维度相同,加在一起后共同参与注意力计算。它编码的不是"第 5 个"这种标量,而是一组能让模型推断位置关系的连续特征。

  • 误解:用了位置编码,Transformer 就完全理解顺序了。 ✅ 真相:位置编码只是"注入信号",模型能不能用好这个信号取决于训练。可学习 PE 在外推时几乎失效,RoPE 不配合 scaling 技巧也会崩。"加了 PE"和"位置信息被正确建模"是两回事。

  • 误解:RoPE 是"相对位置编码",所以不关心绝对位置。 ✅ 真相:RoPE 用绝对位置的旋转实现相对位置的效果,两者都保留了。它不是"放弃绝对位置",而是"用绝对位置的差表达相对位置"。这是它的数学优雅之处(见 4.4)。

  • 误解:可学习位置编码更好,因为它能自适应。 ✅ 真相:在固定长度内确实更好,但 $max_len$ 是硬上限。一旦要扩展上下文(如 BERT 512 -> 1024),可学习 PE 无法外推,必须重训。这正是它被 RoPE 淘汰的核心原因。

面试怎么考

  1. "Transformer 为什么需要位置编码?" --必考。答出自注意力的置换等变性(见 4.1),最好能写出或口述证明。
  2. "正弦位置编码和可学习位置编码各有什么优劣?" --正弦无需训练理论可外推(实际差),可学习效果好但有 $max_len$ 上限。
  3. "什么是 RoPE?它解决了什么问题?" --用旋转矩阵同时编码绝对和相对位置,外推性好,是当前主流(见 4.4)。
  4. "绝对位置编码和相对位置编码的区别?" --绝对编码"第几个位置",相对编码"隔多远"。相对编码外推性更强。
  5. "如何让模型支持比训练时更长的上下文?" --位置插值、NTK-aware、YaRN(见 4.5)。能答出这条说明跟得上长上下文前沿。
  6. "ALiBi 和 RoPE 相比如何?" --两者都主打外推,ALiBi 更简洁无参数,RoPE 数学更优雅且与线性注意力兼容,最终 RoPE 胜出成为主流。

延伸阅读


上一篇:多头注意力 -- 注意力机制的最后一块拼图。下一篇:编码器-解码器 -- Transformer 的三种架构变体怎么选。

内容采用 CC BY-SA 4.0,代码采用 MIT。