位置编码
位置信息怎么注入、为何从 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 frequency | RoPE 与 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 类型 | BLEU | PPL |
|---|---|---|
| Sinusoidal | 25.8 | 4.92 |
| Learned | 25.7 | 4.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 的所有工程坑,同时保留"位置信号是相对距离"的语义优势:
- 精确相对位置:数学上严格 $\langle R_m q, R_n k \rangle$ 只依赖 $(m-n)$,无绝对位置 OOD 问题
- 只操作 Q/K,不动 attention 矩阵:天然兼容 KV cache (新 token Q/K 旋转后写入缓存即可) / GQA / sparse / linear attention
- 零参数:$\theta_i$ 是预设,不引入额外可训练参数;调整 base ($10000 \to 500000$) 一个标量就能扩长上下文
- 实证收敛快: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 等技术,全部外链:
- 完整外推方案 → knowledge/03-长上下文/03-位置编码与外推
- ALiBi 等 attention bias 的相对位置思路 → knowledge/03-长上下文/04-注意力机制变体
本篇只点到 Llama 3 把 base 从 10000 改 500000 作为"RoPE 可调"的例子,不展开。
Takeaway
| 知识点 | 核心结论 |
|---|---|
| 排列不变性 | self-attention 看序列为集合,必须显式注入位置信号 |
| 三大范式 | 绝对 PE 加在 embedding / 相对 PE 加在 attention logit / RoPE 旋转 Q/K |
| Sinusoidal vs learned | Vaswani 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 自己学到了别的捷径
延伸阅读
- Tokenization 与 BPE → 3.2 Tokenization 与 BPE
- Token embedding → 3.3 Token Embedding
- 位置外推 (YaRN / NTK / LongRoPE) → knowledge/03-长上下文/03-位置编码与外推
- 注意力变体 (ALiBi / Sliding window / 等) → knowledge/03-长上下文/04-注意力机制变体
- EleutherAI RoPE 综合博客 → https://blog.eleuther.ai/rotary-embeddings/
参考资料
- Vaswani et al. Attention Is All You Need. NeurIPS 2017. https://arxiv.org/abs/1706.03762
- Su et al. RoFormer: Enhanced Transformer with Rotary Position Embedding. 2021. https://arxiv.org/abs/2104.09864
- Kuo et al. Round and Round We Go! What makes Rotary Positional Encodings useful?. 2024. https://arxiv.org/abs/2410.06205
- Base of RoPE Bounds Context Length. 2024. https://arxiv.org/abs/2405.14591
- EleutherAI. Rotary Embeddings: A Comprehensive Guide. https://blog.eleuther.ai/rotary-embeddings/
- Shaw, Uszkoreit, Vaswani. Self-Attention with Relative Position Representations. NAACL 2018. https://arxiv.org/abs/1803.02155
- 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
- Kazemnejad et al. The Impact of Positional Encoding on Length Generalization in Transformers. NeurIPS 2023. https://arxiv.org/abs/2305.19466