本站内容由 AI 生成,可能存在错误。如发现问题,欢迎到 GitHub Issues 反馈。

Positional Encoding — 让 Transformer 理解顺序

Positional Encoding — 让 Transformer 理解顺序

更新于 2026-04-04

Transformer 的 Self-Attention 机制有一个常被忽视但极其关键的特性:置换不变性(Permutation Invariance)。打乱输入 token 的顺序,Attention 的输出不会改变 — 换句话说,原始的 Attention 完全不知道 token 的位置。这意味着没有位置编码的 Transformer 分不清 “狗咬人” 和 “人咬狗”。

Positional Encoding(位置编码)就是解决这个问题的方案。本文从 Sinusoidal 编码出发,经过 Learned Embedding 和相对位置编码,最终深入讲解当今主流 LLM 普遍采用的 RoPE(Rotary Position Embedding)

为什么需要位置编码

Attention 的置换不变性

Self-Attention 的计算过程是:Attn(Q,K,V)=softmax(QKTdk)V\text{Attn}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V

其中 Q=XWQQ = XW_Q, K=XWKK = XW_K, V=XWVV = XW_V。如果我们对输入序列做一个置换 π\pi(即打乱 token 顺序),设置换矩阵为 PP

Attn(PX)=PAttn(X)\text{Attn}(PX) = P \cdot \text{Attn}(X)

输出只是跟着置换了一下,每对 token 之间的 Attention 分数完全不变

原始序列的 Attention
Thecatsathere
ThecatsathereThecatsathere0.250.350.200.200.300.250.250.200.200.300.300.200.150.250.250.35

无位置编码时,Attention 分数只取决于 token 内容

这意味着:不加位置编码,“The cat sat here” 和 “sat here The cat” 对模型来说是等价的。对于语言理解,这显然不可接受 — 我们必须显式注入位置信息。

绝对位置编码

Sinusoidal 编码(Vaswani et al. 2017)

原始 Transformer 使用固定的正弦/余弦函数生成位置编码:

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

每个维度对应一个不同频率的波。低维度频率高(变化快),高维度频率低(变化慢)。每个位置因此获得一个唯一的”频率指纹”:

PositionDimension (i)015314763014304662
■ −1
+1 ■

低维度(左侧)变化频率高,高维度(右侧)变化频率低 — 每个位置有唯一的"频率指纹"

优点: 无训练参数,理论上可外推到训练时未见过的长度。

缺点: 实际外推效果有限,后续被其他方案逐渐取代。

Learned Embedding

另一种简单的方案是直接训练一个位置向量表 ERLmax×dE \in \mathbb{R}^{L_{max} \times d},让模型自己学出每个位置的表示。

  • 优点: 实现简单,效果通常优于 Sinusoidal
  • 缺点: 序列长度被训练时的 LmaxL_{max} 限死,无法处理更长的输入

BERT 和 GPT-2 都采用了这种方案。

相对位置编码

Shaw et al. 2018 — 从绝对到相对的转变

核心观察:自然语言中,token 之间的相对距离往往比绝对位置更重要。“the cat” 这两个词无论出现在句子开头还是结尾,它们之间的语法关系是一样的。

Shaw et al. 的方案在 Attention 分数中加入可学习的相对位置偏置 aijKa_{ij}^K

eij=xiWQ(xjWK+aijK)Tdke_{ij} = \frac{x_i W_Q (x_j W_K + a_{ij}^K)^T}{\sqrt{d_k}}

其中 aijKa_{ij}^K 只取决于 iji - j 的值(距离),且会被裁剪到 [K,K][-K, K] 范围内。

优点: 天然支持变长序列,参数量小(只需 2K+12K + 1 个偏置向量)。

ALiBi(Press et al. 2022)— 极致简化

ALiBi 走了一条更激进的路:完全不加位置 embedding,直接在 Attention 分数上减去线性距离惩罚

scoreij=qikjmij\text{score}_{ij} = q_i \cdot k_j - m \cdot |i - j|

其中 mm 是每个注意力头不同的固定斜率(按几何级数设定,如 m{21,22,,2H}m \in \{2^{-1}, 2^{-2}, \ldots, 2^{-H}\})。

  • 优点: 零训练参数、外推能力极强、实现极其简单
  • 缺点: 只有距离衰减一种模式,表达力有限

BLOOM 和 MPT 等模型采用了 ALiBi。

RoPE — Rotary Position Embedding

RoPE(Su et al. 2021)是当前最主流的位置编码方案,被 LLaMA、Qwen、GPT-NeoX 等模型广泛采用。

核心直觉

RoPE 的核心思想极其优雅:把每对相邻维度 (d2i,d2i+1)(d_{2i}, d_{2i+1}) 看作二维平面上的一个向量,然后根据 token 的位置对这个向量做旋转。

  • 位置 mm 对应旋转角度 mθim\theta_i
  • 不同维度对使用不同的基础角度 θi\theta_i(类似 Sinusoidal 的多频率思想)
  • 两个 token 的 Q 和 K 旋转后做内积 → 内积只依赖相对距离 mnm - n
Q 向量(position 0)
Q₀Position 0: 旋转角度 = 0

把 Q 向量的一对维度 (d₂ᵢ, d₂ᵢ₊₁) 看作二维平面上的向量

维度对频率分解

每对维度 (d2i,d2i+1)(d_{2i}, d_{2i+1}) 对应基础角度 θi=100002i/d\theta_i = 10000^{-2i/d}。这个公式的含义是:

  • 低维度(小 ii)= 高频旋转:位置变化一点,角度就大幅变化 → 捕捉局部关系
  • 高维度(大 ii)= 低频旋转:位置变化很多,角度才明显变化 → 捕捉远距离关系

这和 Sinusoidal 编码的多频率思想一脉相承,只是用旋转来实现。

RoPE 各维度对的旋转角度热力图 (d_model=64)维度对 index i →位置 pos →高频 (变化快)低频 (变化慢)pos=10 时各维度对的角度 mθᵢ (mod 2π)i=0: 角度变化大i=31: 角度变化小

热力图中左侧(低维度)颜色变化剧烈 — 高频信号;右侧(高维度)颜色变化缓慢 — 低频信号。这种多频率编码让模型同时感知近距离和远距离的位置关系。

数学推导

对每对维度 (2i,2i+1)(2i, 2i+1),定义旋转矩阵:

Rθi(m)=(cosmθisinmθisinmθicosmθi)R_{\theta_i}(m) = \begin{pmatrix} \cos m\theta_i & -\sin m\theta_i \\ \sin m\theta_i & \cos m\theta_i \end{pmatrix}

其中 θi=100002i/d\theta_i = 10000^{-2i/d}。对 Q 和 K 分别施加旋转:

q~m=Rθ(m)qm,k~n=Rθ(n)kn\tilde{q}_m = R_{\theta}(m) \, q_m, \quad \tilde{k}_n = R_{\theta}(n) \, k_n

关键性质 — 旋转后的内积只依赖相对位置:

q~mTk~n=qmTRθ(m)TRθ(n)kn=qmTRθ(nm)kn\tilde{q}_m^T \tilde{k}_n = q_m^T R_{\theta}(m)^T R_{\theta}(n) \, k_n = q_m^T R_{\theta}(n - m) \, k_n

这是因为旋转矩阵的性质 R(α)TR(β)=R(βα)R(\alpha)^T R(\beta) = R(\beta - \alpha)

复数视角

RoPE 有一个等价的复数表示,更直观也更高效:把每对维度 (q2i,q2i+1)(q_{2i}, q_{2i+1}) 看作复数 q2i+q2i+1jq_{2i} + q_{2i+1} \cdot j

旋转就是复数乘法:

q~=qeimθ\tilde{q} = q \cdot e^{im\theta}

关键推导 — 旋转后的内积只依赖相对位置:

q~mk~n=qkˉei(mn)θ\tilde{q}_m \cdot \overline{\tilde{k}_n} = q \cdot \bar{k} \cdot e^{i(m-n)\theta}

实现层面,这意味着不需要矩阵乘法,只需 element-wise 的 cos/sin 操作 — 非常高效。

复数表示
Step 1: Q 向量的一对维度在复平面上表示ReImq = (q₂ᵢ, q₂ᵢ₊₁)把相邻两个维度 (q₂ᵢ, q₂ᵢ₊₁) 看作复数 q₂ᵢ + q₂ᵢ₊₁·j

长度外推问题

RoPE 训练时的位置角度范围是有限的。当推理序列超过训练长度时,高频分量的角度值超出训练时见过的范围,导致 attention score 异常,模型性能下降。

目前主流的解决方案:

  • NTK-aware scaling: 修改频率基数 b=bsd/(d2)b' = b \cdot s^{d/(d-2)}ss 为缩放比),把高频分量”压缩”到训练范围内
  • YaRN(Yet another RoPE extensioN): 混合策略 — 对不同频率分量使用不同的缩放因子。高频保持不变(局部关系不需要外推),低频做缩放(远距离关系需要适配更长上下文)

下面的可视化展示了不同缩放方法如何把超出范围的角度压回训练区间:

各维度对的最大角度覆盖 (训练长度=4096, 当前=4,096)无缩放 — 超出训练范围的角度(红色区域)可能导致性能下降dim pairi=0i=1i=2i=3i=4i=5i=6i=7i=8i=9i=10i=11i=12i=13i=14i=15训练范围 (0 ~ 4096)角度在范围内角度超出范围

这些方法能将 RoPE 的有效长度从训练长度扩展数倍甚至数十倍,使得 LLaMA 等模型可以处理 100K+ token 的长文本。

对比总结

方案类型训练参数外推能力计算开销代表模型
Sinusoidal
绝对
有限
极低
Transformer (原始)
Learned
绝对
L_max × d
极低
BERT, GPT-2
Shaw (Relative)
相对
2K+1 个偏置
中等
中等
Transformer-XL
ALiBi
相对
极低
BLOOM, MPT
RoPE
相对
中→强
LLaMA, GPT-NeoX, Qwen

选型建议:

  • 从头训练新模型 → RoPE(当前主流首选)
  • 需要极致简单 + 强外推 → ALiBi
  • 历史模型兼容 → 按原有方案(Learned / Sinusoidal)