跳到主要内容

位置编码

位置信息怎么注入、为何从 sinusoidal 演进到 RoPE,以及 RoPE 如何让 attention 内积只依赖相对距离

核心要点

  • Self-attention 排列不变,必须注入位置信号
  • Sinusoidal 与 learned 实测几乎等效 (Vaswani Table 3: BLEU 25.8 vs 25.7)
  • Learned PE 训练长度是硬上限,超出 IndexError
  • RoPE 把位置藏进 Q/K 旋转,attention 内积仅依赖相对距离
  • Llama / Qwen / DeepSeek / Mistral / Gemma / Phi 全部用 RoPE
  • NoPE:因果掩码本身已携带位置信号,但实证仍不如 RoPE

名词定义

本篇共享名词在 3.1 总览 已定义 (Position encoding / Sinusoidal PE / Learned absolute PE / RoPE)。本篇新引入:

名词定义
Permutation-invariant (排列不变)self-attention 对 token 顺序不敏感;把序列任意打乱,每个位置的输出不变
相对位置编码 (Relative PE)位置信息以 $b(i-j)$ 的形式注入 attention logit, Shaw 2018 / T5 风格
Position bias相对位置编码加在 QK 点积上的可学习项 (Shaw 2018) 或标量桶 (T5)
Base frequencyRoPE 与 sinusoidal PE 共用的基础频率参数,默认 10000,决定旋转角的最大波长
NoPE (No Position Encoding)完全不加位置编码,仅依靠因果掩码本身的不对称性提供位置信号 (Kazemnejad 2023)

@tbl-pe-glossary 本篇新引入名词

不加位置编码会怎样?

核心问题:Attention 看 Q/K 内积,不依赖 token 顺序。"猫追狗" 和"狗追猫" 在 attention 视角下是完全相同的 token 集合,模型如何区分?

Self-attention 数学上完全排列不变 (permutation-invariant),必须额外注入位置信号才能区分 "猫追狗" 与 "狗追猫"。

排列不变性的精确表述

给定 token 序列 $[t_1, t_2, \ldots, t_s]$ 和它的某个置换 $\pi$:把同样的 self-attention 算子应用到 $[t_{\pi(1)}, \ldots, t_{\pi(s)}]$,输出的每个位置 hidden state 仅按 $\pi$ 重新排列,数值不变。换句话说,attention 把序列看成一个集合,不是有序列表。

这是 self-attention 区别于 RNN/CNN 的关键特性:RNN 的递推 $h_t = f(h_{t-1}, x_t)$ 把顺序烤进数据依赖;CNN 的滑动窗口隐含相对位置。Self-attention 想全并行就得放弃这两条,代价是必须显式告诉它"我在第几个"。

位置编码的三种注入方式

按位置信号注入到模型的哪一步,分三大范式:

范式注入点代表位置信号形式
绝对加在 token embedding 上,进 block 前注入Vaswani 2017 sinusoidal / GPT-2 learned / BERT learned每个绝对位置 $pos$ 一个固定/可学习向量
相对加在 attention logit 上,进 softmax 前注入Shaw 2018 / T5 bias每对 $(i, j)$ 一个偏置 $b(i-j)$
RoPE在 Q/K 投影后旋转,进 attention 内积前注入Su 2021 / Llama / Qwen 全用Q/K 在 2D 子空间旋转,相对距离自然涌现

@tbl-pe-paradigms 三大位置编码范式 (按注入点分类)

下面依次展开。

绝对位置编码:sinusoidal 与 learned 哪个胜?

核心问题:Transformer 原论文 Vaswani 2017 用 sinusoidal PE, GPT-1/2 / BERT 改用 learned PE。两者机制完全不同,性能差距多大?为什么现代 LLM 都弃用了?

实测两者几乎无差异,现代弃用绝对位置的根本原因是长度上限与对相对距离的间接表达

Sinusoidal: Vaswani §3.5 的真实理由

Vaswani 原论文 §3.5 用一对 sin/cos 给每个位置编码:

$$\begin{equation} \text{PE}_{(pos, 2i)} = \sin(pos / 10000^{2i/d}), \quad \text{PE}_{(pos, 2i+1)} = \cos(pos / 10000^{2i/d}) \label{eq:pe-sinusoidal} \end{equation}$$

§3.5 给的两条理由都不是"性能更好"

  • 相对位置线性可表达:对任意固定偏移 $k$, $\text{PE}_{pos+k}$ 可以表示为 $\text{PE}_{pos}$线性函数 (二维子空间里就是旋转矩阵 $M(k)$$pos$ 无关)。这条性质让模型理论上能从绝对位置推出相对位置。
  • 可能外推到训练外长度:原文用 "may allow the model to extrapolate to sequence lengths longer than those encountered during training"。注意是 "may",不是"will"——事后证明这只是假设,实测 sinusoidal PE 超出训练长度后 perplexity 仍显著上升[1]

base = 10000 的来源:原文直接给公式没解释。社区共识是经验值:波长跨度从 $2\pi$ (i=0) 到 $2\pi \cdot 10000$ (i=d/2-1),覆盖约 6-62832 位置单位,对当时几百到几千 token 的 NLP 任务足够。

Learned absolute PE: GPT 与 BERT 的选择

GPT-1/2、BERT 弃用 sinusoidal 改用 learned PE:把位置编码做成一个 nn.Embedding(max_seq_len, d_model) 查找表,跟其他权重一起训练。Karpathy nanoGPT 同样跟随 GPT-2:

self.wpe = nn.Embedding(config.block_size, config.n_embd)

Learned PE 致命限制:训练时 max_seq_len = N,推理超过 N 直接 IndexError,无任何降级路径。BERT max=512, GPT-1=512, GPT-2=1024。要支持更长上下文,只能重新训练。

Vaswani Table 3 Row E:两者几乎无差异

Vaswani 2017 自己做了消融实验[1]:

PE 类型BLEUPPL
Sinusoidal25.84.92
Learned25.74.92

@tbl-pe-vaswani-ablation Vaswani 2017 Table 3 Row E: sinusoidal vs learned 实测 (WMT En-De)

差 0.1 BLEU,原文结论 "nearly identical results"。最终选 sinusoidal 是零参数 + 理论可外推性质,不是因为性能更好。

为什么现代 LLM 弃用绝对位置

弃用绝对位置改 RoPE 的三个工程动机,都来自 2022 年后长上下文需求:

  • Learned PE 有硬长度上限:2K → 32K → 128K → 1M 的 context 扩展需求让"每次都重训"不可行
  • 绝对 PE 与任务不对齐:语言任务依赖相对距离 ("名词在动词前 3 个 token") 而非绝对位置 ("名词在第 17 个位置"),绝对信号要模型自己间接推
  • KV cache 拼接的语义性:RoPE 在 Q/K 上施加旋转,推理时新生成的 token 与已缓存的 KV 拼接,相对位置自动正确;绝对 PE 拼接时位置需要重新编号

Llama 1 (2023) 在论文里明确选择 RoPE,跟随 GPT-J / GPT-NeoX 系列的先例;此后所有主流模型沿用。

RoPE 怎么把位置藏进 Q/K 旋转里?

核心问题:RoPE 既不加在 embedding 上 (像绝对 PE),也不加在 attention logit 上 (像相对 PE),而是直接旋转 Q/K 向量。为什么这种操作能让 attention 内积只依赖相对距离?Llama 实际怎么实现?

RoPE 的核心是把 d 维 Q/K 拆成 d/2 对二维子空间,每对在复平面绕原点旋转一个角度 $m \cdot \theta_i$ ($m$ 是 token 位置,$\theta_i$ 是预设频率),旋转后做内积时位置项以"差" 的形式出现

2D 旋转直觉:复平面 e^{imθ}

把一个 d 维 Q/K 向量 $\mathbf{q}$ 看成 d/2 对 2D 向量 $(q_1, q_2), (q_3, q_4), \ldots$。对第 $i$ 对在位置 $m$ 施加旋转 $\theta_i$:

$$\begin{equation} \begin{pmatrix} q_{2i}' \\ q_{2i+1}' \end{pmatrix} = \begin{pmatrix} \cos(m\theta_i) & -\sin(m\theta_i) \\ \sin(m\theta_i) & \cos(m\theta_i) \end{pmatrix} \begin{pmatrix} q_{2i} \\ q_{2i+1} \end{pmatrix} \label{eq:pe-rope-rotation} \end{equation}$$

用复数视角更紧凑——把这对实数看成复数 $z_i = q_{2i} + j \cdot q_{2i+1}$,旋转就是乘 $e^{j m \theta_i}$:

$$\begin{equation} \tilde{q}_i^{(m)} = q_i \cdot e^{j m \theta_i} \label{eq:pe-rope-complex} \end{equation}$$

旋转保模长不变,只改方向。Attention 点积本质上看"两个向量的方向夹角",所以位置信号自然进入夹角而不污染向量本身的 magnitude。

旋转角公式:多尺度频率覆盖

$i$ 个 2D 子空间的旋转频率沿用 Vaswani sinusoidal 的几何级数[2]:

$$\begin{equation} \theta_i = 10000^{-2i/d}, \quad i = 0, 1, \ldots, d/2 - 1 \label{eq:pe-rope-freq} \end{equation}$$
  • $i = 0$:高频,$\theta_0 = 1$ rad,周期 $2\pi$ ≈ 6 个 token
  • $i = d/2 - 1$:低频,$\theta_{d/2-1} ≈ 10^{-4}$ rad,周期 $\sim 6 \times 10^4$ 个 token

高频维度对局部依赖敏感,低频维度承载长程依赖。Kuo et al. 2024 后续研究发现,高频维度形成"位置性 attention head" (token 距离编码),低频维度承载"语义匹配 head"[3]——这是 RoPE 多尺度设计的功能性解释。

Base = 10000 直接沿用 Vaswani。Su et al. 2021 实验观察到这些 $\theta_i$ 参数训练后未显著更新,说明 10000 是合理先验。Llama 3 为扩展到 128K 上下文,把 base 改为 500,000[4]——这是 RoPE 优于 learned 绝对 PE 的一个工程优势:一个标量参数就能调整位置编码的尺度。

内积只依赖相对距离:一个等式说完

RoPE 的核心定理是:旋转后 Q/K 内积精确只依赖于位置差 $(m - n)$,与 $m$$n$ 单独无关。

矩阵视角:旋转矩阵 $R_m$ 满足 $R_m^\top \cdot R_n = R_{n-m}$ (旋转矩阵性质),所以

$$\begin{equation} \langle R_m \mathbf{q}, R_n \mathbf{k} \rangle = \mathbf{q}^\top R_m^\top R_n \mathbf{k} = \mathbf{q}^\top R_{n-m} \mathbf{k} \label{eq:pe-rope-relative} \end{equation}$$

复数视角更紧凑:第 $i$ 个 2D 子空间里

$$\begin{equation} \tilde{q}_i^{(m)} \cdot \overline{\tilde{k}_i^{(n)}} = q_i \cdot \bar{k}_i \cdot e^{j(m-n)\theta_i} \label{eq:pe-rope-complex-relative} \end{equation}$$

绝对位置 $m$$n$ 在指数上以 $(m - n)$ 出现,单独消去。这就是 RoPE 设计的精髓:通过对称的旋转操作,绝对位置自动抵消。

(本篇不展开 d 维完整证明,见 Su 2021 原论文公式 14-15 或 EleutherAI RoPE 博客[5]。)

Llama 3 工程实现:precompute_freqs_cis

Llama 3 源码里 RoPE 是预计算 + 索引复用 模式:

# 预计算阶段 (一次)
freqs = 1.0 / (10000 ** (torch.arange(0, dim, 2) / dim))
t = torch.arange(max_seq_len)
freqs_cis = torch.polar(torch.ones_like(outer(t, freqs)), outer(t, freqs))
# 形状 [max_seq_len, dim // 2], 复数类型

# 推理时 (每步前向)
def apply_rotary_emb(xq, xk, freqs_cis):
xq_complex = view_as_complex(xq) # [batch, seq, head, dim//2]
xk_complex = view_as_complex(xk)
xq_rotated = view_as_real(xq_complex * freqs_cis)
xk_rotated = view_as_real(xk_complex * freqs_cis)
return xq_rotated, xk_rotated

核心特征

  • $\cos / \sin$ 表预计算一次,推理时按 position 切片索引
  • 复数视角 torch.polar 直接构造 $e^{j m \theta_i}$,旋转就是复数乘法
  • HuggingFace 实现改用实数 cos/sin 表 + rotate_half 函数,数学等价,避免 complex view 的量化兼容性问题

三大范式对比:为什么 RoPE 赢?

核心问题:绝对 PE / 相对 PE / RoPE 三条路线 2017-2021 同台竞争,为什么 2022 年后所有主流 LLM 都收敛到 RoPE?是性能压倒还是工程友好?

RoPE 赢在"数学上精确 + 工程上零摩擦"——是少有的两边都好的设计

相对位置编码:Shaw 2018 → T5 的中间一步

在 RoPE 之前,相对位置编码 (Relative PE) 是绝对 PE 的第一次升级

  • Shaw, Uszkoreit, Vaswani 2018[6]:在 attention logit 上加可学习偏置 $b(i-j)$ (距离 clipping 到 $k=16$), WMT En-De 提升 +1.3 BLEU——首次证明相对位置信号优于绝对
  • T5 (Raffel 2020)[7]:改成 32 桶对数 binning 标量 bias,各层共享参数,降低参数量同时保留"近处精细 / 远处粗略"的感知能力。T5 桶状偏置成为相对 PE 的工业模板

相对 PE 的致命缺陷:需要 $O(N^2)$ 的 bias 矩阵 (每对位置 $(i, j)$ 一个值),与 KV cache 自回归生成不兼容 (新 token 加入时整个 bias 矩阵要扩);与 linear / sparse attention 也不兼容 (它们都假设 attention 不需要显式 $O(N^2)$ 项)。

RoPE 主流化的四个工程原因

RoPE 一上线就解掉相对 PE 的所有工程坑,同时保留"位置信号是相对距离"的语义优势:

  1. 精确相对位置:数学上严格 $\langle R_m q, R_n k \rangle$ 只依赖 $(m-n)$,无绝对位置 OOD 问题
  2. 只操作 Q/K,不动 attention 矩阵:天然兼容 KV cache (新 token Q/K 旋转后写入缓存即可) / GQA / sparse / linear attention
  3. 零参数$\theta_i$ 是预设,不引入额外可训练参数;调整 base ($10000 \to 500000$) 一个标量就能扩长上下文
  4. 实证收敛快:RoFormer 实测收敛比 learned 绝对 PE 快约 30%,大模型上比 T5 相对 PE 好 10-20%

结果是惊人的一致:Llama 1-3、Qwen 1-3、DeepSeek V1-V3、Mistral、Gemma、Phi——所有 2023 年后开源的主流大模型全部用 RoPE。这种范式一致性在 LLM 领域非常少见,通常一条架构选择都有竞争者。

NoPE:不加位置编码反而更好?

Kazemnejad et al. NeurIPS 2023[8] 提出反直觉的发现:

  • Decoder-only causal attention 本身已经隐含位置信号:因果掩码让位置 $t$ 只看 $\leq t$ 的 token,不同位置看到的 token 数量不同,这种不对称性已经携带"我在第几个"的信息
  • NoPE (No Position Encoding) 在长度外推 (extrapolation) 基准上超过 ALiBi / RoPE / 绝对 PE
  • 理论分析:NoPE 经 SGD 训练后,attention pattern 自发收敛到类似 T5 Relative PE 的形态——位置信号被模型自己"学出来"了

为什么 NoPE 没取代 RoPE:真实长上下文 benchmark (NIAH / RULER 等) 上 NoPE 仍弱于 RoPE 变体,工程上不敢赌"模型自发学出位置编码"的稳定性。Kuo et al. 2024[3] 给出几何解释:RoPE 高频维度构造的"位置性 attention head"是 NoPE 理论上无法复现的——causal mask 提供的是"我在哪"的整体信号,不是"我跟另一个 token 距离多远"的精确信号。

最新趋势:RoPE + NoPE 混合层

2024 年底起出现 RoPE 与 NoPE 混合层的新设计

  • DeepSeek V3 在 MLA (Multi-head Latent Attention) 层混用 RoPE + NoPE
  • SmolLM3 在不同层间交替 RoPE / NoPE

动机:取 RoPE 的位置精度 + NoPE 在某些 head 上的长度外推优势。还非工业主流,但已是 RoPE 一统江湖之后第一个有竞争力的方向。

关于长度外推

核心问题:RoPE 解掉了 learned PE 的硬长度上限,但"训练 8K,推理 128K"实际能不能 work?这个问题不属于本篇。

长度外推 / 位置外推是单独专题,涉及 RoPE base 调整 / NTK / YaRN / LongRoPE / Position Interpolation 等技术,全部外链:

本篇只点到 Llama 3 把 base 从 10000 改 500000 作为"RoPE 可调"的例子,不展开。

Takeaway

知识点核心结论
排列不变性self-attention 看序列为集合,必须显式注入位置信号
三大范式绝对 PE 加在 embedding / 相对 PE 加在 attention logit / RoPE 旋转 Q/K
Sinusoidal vs learnedVaswani Table 3 实测几乎无差异 (BLEU 25.8 vs 25.7);选 sin/cos 是零参数 + 理论外推,不是性能
Sinusoidal 外推神话Vaswani 原文 "may allow" 是假设,实测超训练长度 perplexity 同样上升
Learned PE 致命限制训练 max_seq 是硬上限,超出 IndexError
RoPE 注入点Q/K 投影后,attention 内积前,不动 embedding 不动 attention 矩阵
RoPE 旋转角$\theta_i = 10000^{-2i/d}$,高频近端依赖,低频长程依赖
RoPE 内积性质$\langle R_m q, R_n k \rangle = q^\top R_{n-m} k$,严格只依赖 $(m-n)$
Llama 实现precompute_freqs_cis 一次,推理按 position 切片索引复数乘
RoPE 主流化 4 原因精确相对 / 兼容 KV cache GQA sparse / 零参数 / 收敛快 30%
主流采用Llama 1-3, Qwen 1-3, DeepSeek V1-V3, Mistral, Gemma, Phi 全用 RoPE
NoPE 反例causal mask 已隐含位置信号,长度外推上超 RoPE;但真实 benchmark 仍弱
新趋势RoPE+NoPE 混合层 (DeepSeek V3 MLA / SmolLM3)

开放问题

  • NoPE 在某些场景的优势是否被低估:长度外推 benchmark 超过 RoPE 但真实下游任务弱,这个 gap 来自哪里?是否有 NoPE 友好的下游任务?
  • 混合范式是否会成为新标准:DeepSeek V3 / SmolLM3 的混合层效果如何泛化?是否所有大模型最终都会向"分层混合"演化?
  • Base = 10000 / 500000 之外:Llama 3 把 base 改 500k 扩 128K context,但更长的 1M / 10M context 下 base 该多大?有定量关系[4] 但工业未广泛验证
  • RoPE 高频维度的"位置头" 解释:Kuo et al. 2024 给出几何解释,但训练动态上这些 head 怎么自发形成仍开放
  • 对长程依赖的真实表达:RoPE 低频维度理论上承载长程,但模型是否真的利用了,还是 attention 自己学到了别的捷径

延伸阅读

参考资料

  1. Vaswani et al. Attention Is All You Need. NeurIPS 2017. https://arxiv.org/abs/1706.03762
  2. Su et al. RoFormer: Enhanced Transformer with Rotary Position Embedding. 2021. https://arxiv.org/abs/2104.09864
  3. Kuo et al. Round and Round We Go! What makes Rotary Positional Encodings useful?. 2024. https://arxiv.org/abs/2410.06205
  4. Base of RoPE Bounds Context Length. 2024. https://arxiv.org/abs/2405.14591
  5. EleutherAI. Rotary Embeddings: A Comprehensive Guide. https://blog.eleuther.ai/rotary-embeddings/
  6. Shaw, Uszkoreit, Vaswani. Self-Attention with Relative Position Representations. NAACL 2018. https://arxiv.org/abs/1803.02155
  7. Raffel et al. Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer (T5). JMLR 2020. https://arxiv.org/abs/1910.10683
  8. Kazemnejad et al. The Impact of Positional Encoding on Length Generalization in Transformers. NeurIPS 2023. https://arxiv.org/abs/2305.19466