位置编码:从 Sinusoidal 到 RoPE
自注意力让 Transformer 得到了并行训练的能力,但也带来了一个结构性的盲区:它对 token 的位置完全不敏感。 打乱整个输入序列,注意力的计算结果不变——因为 Q·K 的点积只取决于 token 的内容表示,与它们在序列中的先后顺序无关。
但语言有严格的顺序。「我打你」和「你打我」包含完全相同的三个 token,含义却截然相反。RNN 通过串行计算自然地保留了位置信息——Transformer 用并行换来了训练速度,却丢掉了这个隐含的序列结构。位置编码要做的事就是把这个丢掉的序列结构补回来。
从 2017 年的固定正弦函数,到 2021 年苏剑林提出的 RoPE,再到今天配合 NTK/YaRN 外推到 128K 上下文——位置编码的演进是 Transformer 架构演化中最具工程智慧的线索之一。本文按时间线梳理这条路径,目标是让读者理解 RoPE 的数学直觉和它为什么能打破训练长度的限制。
一、第一代:绝对位置编码——告诉模型「你在第几个」
位置编码最朴素的想法是给每个位置分配一个唯一的向量,加到 token embedding 上,让模型知道这个 token 在序列中的绝对位置。
1.1 固定正弦编码(原始 Transformer,2017)
原始 Transformer 用固定的正弦和余弦函数为位置 pos 的第 i 个维度生成编码值:
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))
每个维度对应不同频率的正弦波。低频维度(i 小)波长长,编码全局位置;高频维度(i 大)波长短,编码局部偏移。这套方案不需要任何训练——位置编码完全由数学公式决定。
但这种固定编码有两个隐藏问题。第一,外推效果差:虽然数学上 pos 可以任意大,但模型只在训练时见过的位置范围(如 0-2047)内学会了如何利用这些编码,超出训练范围后表现会显著退化。第二,它编码的是绝对位置而非相对关系——模型学到的是「第 5 个 token 有什么编码模式」,而不是「两个 token 相距 5 步意味着什么」。
1.2 可学习位置编码(BERT / GPT-2 / GPT-3)
将固定函数替换为一个可学习的 Embedding 表:
pos_embeddings = nn.Embedding(max_position_embeddings, hidden_size)
# 输入是位置索引 [0, 1, 2, ..., seq_len-1]
模型在训练中自行学习最优的位置表示。这解决了「固定函数不够灵活」的问题,但付出了更大的代价:彻底丧失了外推能力——位置表只有 max_seq_len 行,超出即越界。GPT-3 训练长度 2048 意味着推理长度也被锁死在 2048。
二、第二代:相对位置编码——从「绝对位置」到「位置关系」
绝对位置编码的根本问题在于:注意力的本质是 token 之间的交互,而非 token 的独立属性。模型真正需要知道的不是「A 在第 5 位」,而是「A 和 B 之间相距多远」。
这个洞察催生了第二代方案:不修改 token 的表示,而是修改注意力计算本身。
2.1 T5 的相对偏置
T5 在注意力分数上直接加一个可学习的偏置项,其值只取决于两个 token 之间的相对距离:
Attention(Q, K, V) = softmax((Q · K^T) / √d_k + bias_rel(i, j)) · V
| 其中 bias_rel(i, j) 只与 | i - j | 有关。相同距离的 token 对共享同一个偏置值,参数量从 O(max_len²) 降至 O(max_len)。 |
核心理念的变化:位置信息不再注入 token 的表示,而注入注意力计算本身。 影响的是「谁该关注谁」,不是「token 长什么样」。
2.2 ALiBi:连偏置表都不需要
ALiBi(Attention with Linear Biases)更激进——把可学习的偏置表替换为一个固定的线性惩罚项:
Attention(Q, K, V) = softmax((Q · K^T) / √d_k - m · |i - j|) · V
其中 m 是每个 head 预定义的斜率(head_0: m=1/2, head_1: m=1/2², …)。距离越远,惩罚越大——这是一个极简的「就近原则」。
关键发现:只用这个固定惩罚项,不加任何可训练的位置编码,模型就能外推到训练时 2-3 倍的上下文长度。Bloom 使用了 ALiBi,实测推理长度可以达到训练的 3 倍以上。但 ALiBi 也有局限——线性惩罚过于简单,对复杂的长距离依赖模式表达能力不足。
三、RoPE:旋转位置编码——将位置信息「旋入」注意力
RoPE 由苏剑林等人在 2021 年提出,目前是 LLaMA、Qwen、DeepSeek、Mistral、Gemma 等几乎所有当代 LLM 的位置编码方案。它的核心思路独树一帜:不改变向量的大小,只旋转向量的方向,且将旋转角度与 token 位置绑定。
3.1 直觉:用旋转编码位置
想象两个 token 的 Q 和 K 向量在空间中各有一个方向。如果这两个向量的旋转角度差正好等于它们的相对位置差,那么它们的点积(cos 值)就自然携带了相对位置信息——位置近则角度差小、cos 大,位置远则角度差大、cos 小。
RoPE 正是利用了这个几何直觉:对 Q 的第 g 对维度施加角度 pos_i × θ_g 的旋转,对 K 施加 pos_j × θ_g 的旋转。那么 Q 和 K 的点积中,旋转角之差 (pos_i - pos_j) × θ_g 会自然出现。
3.2 数学定义
将 d 维的 Q 或 K 向量按相邻维度两两分组 ((x₀, x₁), (x₂, x₃), …),对每一组施加一个二维旋转矩阵:
对于第 g 组 (x_2g, x_2g+1):
旋转角 θ_g = 1 / (base^(2g/d)) 其中 base = 10000
[f(x_2g, pos)] [cos(pos·θ_g) -sin(pos·θ_g)] [x_2g]
[ ] = [ ] × [ ]
[f(x_2g+1, pos)] [sin(pos·θ_g) cos(pos·θ_g)] [x_2g+1]
用复数形式表达更简洁——将每组视为一个复数,乘以 e^(i·pos·θ_g):
(x_2g + i·x_2g+1) · e^(i·pos·θ_g)
不同维度组的旋转频率不同(θ_g 随 g 增大而减小),低频组感知远程位置关系,高频组感知近程局部变化。
3.3 为什么 RoPE 编码的是相对位置
RoPE 的数学优雅之处在于,旋转后 Q 和 K 的点积只包含相对位置项:
RoPE(Q_pos_i, pos_i) · RoPE(K_pos_j, pos_j)^T
= (Q_i · e^(i·pos_i·θ)) · (K_j · e^(i·pos_j·θ))^T
= (Q_i · K_j^T) · e^(i·(pos_i - pos_j)·θ) ← 只与相对位置有关!
绝对位置在旋转过程中自动消去,剩余项 e^(i·(pos_i-pos_j)·θ) 纯编码相对距离。这意味着 RoPE 兼具了绝对位置编码的简洁(直接对 Q/K 做变换,无需修改注意力公式)和相对位置编码的表达力(自然编码 token 间距离)。
3.4 外推:RoPE 的真正杀手锏
RoPE 能支持比训练时长得多的上下文,关键在于旋转频率是可调的。通过调整 base 值或对不同频率组做差异化缩放,可以在不重新训练的前提下将上下文窗口从 4K 扩展到 32K-128K。
| 方法 | 原理 | 效果 |
|---|---|---|
| 直接外推 | 不做任何处理 | 训练 4K → 推理 8K,perplexity 急剧上升 |
| Linear NTK | 等比缩放所有 θ_g,让高频衰减更慢 | 4K → 32K,perplexity 基本持平 |
| YaRN | 高频保持、低频压缩,分频段差异化处理 | 4K → 128K,多数开源模型的首选 |
| Dynamic NTK | 根据当前实际序列长度动态调整缩放因子 | 灵活,无需预设目标长度 |
# NTK-aware 缩放的简化实现
def apply_ntk_scaling(base, scale, dim):
"""对 RoPE 的 base 做缩放,使高频维度衰减更缓慢"""
return base * (scale ** (dim / (dim - 2)))
3.5 各方案权衡对比
| 方案 | 编码方式 | 相对位置 | 外推能力 | 代表模型 |
|---|---|---|---|---|
| Sinusoidal | 加到输入端 | 间接(通过三角函数性质) | 弱 | Transformer (2017) |
| Learned | 加到输入端 | 无 | 无(硬上限) | BERT, GPT-2/3 |
| Relative Bias | 加偏置到注意力分数 | 直接 | 中等 | T5 |
| ALiBi | 固定线性惩罚 | 直接 | 强,但表达力有限 | Bloom |
| RoPE | 旋转 Q/K 向量 | 直接且精确 | 最强(配合 NTK/YaRN) | LLaMA, Qwen, DeepSeek, Mistral |
RoPE 的成功不在于它比之前的方案更复杂——恰恰相反,它用最少的改动(只修改 Q 和 K 的计算,不需要改注意力公式、不需要额外参数)做到了最好的效果。这种「用数学优雅替代工程复杂度」的思路,是 RoPE 成为行业标配的根本原因。
四、相关资源
- Transformer 架构详解 — 本文的前置阅读,自注意力机制的完整拆解。
- LLM 架构演进史 — 上下文窗口如何从 512 扩展到 1M 的军备竞赛。
- 苏剑林,Transformer 升级之路:RoPE — RoPE 的原始中文推导,包含完整的数学细节。
- YaRN: Efficient Context Window Extension — 将 RoPE 外推到 128K+ 的系统方法。