跳转至

位置编码(Positional Encoding)

面试高频考点

  • Transformer 为什么需要位置编码?
  • RoPE 的原理是什么?为什么比绝对位置编码更好?
  • ALiBi 如何实现长度外推?
  • 位置插值(PI)、NTK、YaRN 的差异?
  • 为什么 LLaMA 3 把 RoPE base 从 10000 改为 500000?

一、为什么需要位置编码?

Self-Attention 对输入是排列不变的(permutation invariant)

打乱 token 顺序:
  原始:"我 爱 北京 天安门"  → Attention 输出 O₁
  打乱:"天安门 北京 爱 我"  → Attention 输出仍然是 O₁(顺序不同)

因为 Attention(Q,K,V) = softmax(QK^T/√d) · V
矩阵乘法对行的顺序不敏感

但语言显然有顺序:
  "狗咬人" ≠ "人咬狗"

→ 必须显式注入位置信息

注入位置信息有三种主流方式:① 加在 Embedding 上(绝对位置编码);② 加在 Attention 分数上(相对位置编码);③ 通过旋转 Q/K 注入(RoPE)。


二、绝对位置编码

Sinusoidal(原始 Transformer)

PE(pos, 2i)   = sin(pos / 10000^(2i/d))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d))

将位置 pos 编码成一个 d 维向量,加到 token embedding 上

几何直觉:每个维度对应一个不同频率的正弦波。低维度变化快(捕获短距离位置差异),高维度变化慢(编码长距离位置)。

优点:可外推到训练时未见的长度(公式定义无界)。 缺点:位置和内容信息以加法耦合,模型需要"自己学"如何分离这两类信号;长距离外推效果差。

可学习的位置 Embedding(BERT/GPT-2)

为每个位置直接学习一个 Embedding 向量,与 token Embedding 相加。

P_0, P_1, ..., P_{max_len-1}  ← max_len 个可学习向量
input = TokenEmbedding(x) + P_position

优点:训练数据范围内效果好。 致命缺点:完全无法外推。如果训练时 max_len=512,推理时第 1000 个位置的 Embedding 从未被训练过 → 表现崩溃。


三、RoPE(旋转位置编码)

细化理解: RoPE 把位置信息注入到 Q/K 的旋转相位中,使 attention 分数天然包含相对位置信息。它不像绝对位置 embedding 那样只给每个位置加一个向量,而是让不同位置之间的相对距离影响点积结果。现代 LLM 喜欢 RoPE,是因为它和 decoder-only attention 兼容性好,也更方便做一定程度的长度扩展。

来源:苏剑林(苏神)2021 年提出,被 LLaMA、Qwen、ChatGLM、Mistral、DeepSeek 等几乎所有现代主流模型采用。

核心思想

不直接"加"位置向量,而是用旋转矩阵把位置信息"注入"到 Q 和 K 的方向上:

RoPE 原论文图:旋转位置编码实现方式

图源:RoFormer: Enhanced Transformer with Rotary Position Embedding 论文 HTML 图。

q_m = R(m·θ) · q    # 位置 m 处的 query 向量被旋转 m·θ 角度
k_n = R(n·θ) · k    # 位置 n 处的 key 向量被旋转 n·θ 角度

二者的内积:
  q_m · k_n = q^T · R(m·θ)^T · R(n·θ) · k
            = q^T · R((n-m)·θ) · k

→ 内积只依赖于【相对距离 (m-n)】,与绝对位置 m 和 n 无关
→ 这就是"相对位置编码"的核心特性

高维 RoPE:拆成 d/2 对 2D 旋转

将 d 维向量切成 d/2 对:
  q = [q₀, q₁, q₂, q₃, ..., q_{d-2}, q_{d-1}]
       └─对0─┘ └─对1─┘     └─对(d/2-1)─┘

每对 (q_{2i}, q_{2i+1}) 用不同的频率 θ_i 旋转:
  θ_i = base^(-2i/d),    base 通常 = 10000

低维度 (i 小):θ_i 接近 1,旋转快,捕获短距离信息
高维度 (i 大):θ_i 接近 0,旋转慢,捕获长距离信息

RoPE 实现(PyTorch 风格)

def apply_rope(q, k, position_ids):
    # q, k: shape [batch, n_heads, seq_len, d_head]
    # 计算每对维度的旋转角度
    inv_freq = 1.0 / (10000 ** (torch.arange(0, d_head, 2) / d_head))
    freqs = position_ids[:, None] * inv_freq[None, :]   # [seq_len, d_head/2]
    cos, sin = freqs.cos(), freqs.sin()

    # 将相邻两维 (q_{2i}, q_{2i+1}) 看作复数 (a+bi)
    # 旋转:(a+bi) * (cos+i·sin) = (a·cos - b·sin) + i(a·sin + b·cos)
    q_rotated = q * cos + rotate_half(q) * sin
    k_rotated = k * cos + rotate_half(k) * sin
    return q_rotated, k_rotated

为什么 RoPE 优于绝对位置编码?

  1. 天然编码相对位置:内积只依赖 (m-n),符合"位置关系"而非"绝对位置"的语言学直觉
  2. 平移等变性:整段文本平移不影响内部 token 的相对关系
  3. 数学优雅:旋转保持向量长度不变,不引入额外信息损失
  4. 外推友好:配合 PI/NTK/YaRN 等技巧可扩展到训练长度的 32 倍以上

四、RoPE 的长度外推方案

细化理解: 长度外推不是把上下文窗口数字改大就行。训练时没见过的超长位置会改变 RoPE 频率分布,导致注意力模式失真;PI、NTK-aware、YaRN、LongRoPE 等方法本质上是在调整位置尺度,让模型在更长位置上仍能保持相对距离可解释。实际生产还要配合长上下文继续训练和检索式上下文管理。

直接外推(推理时位置超出训练长度)会导致角度分布偏移,注意力计算异常。主流外推方案:

Position Interpolation (PI, Meta 2023)

原始:position_id = 0, 1, 2, ..., L_test-1
PI:  position_id = 0, L_train/L_test, 2·L_train/L_test, ..., L_train-1·(L_test-1)/L_test

把推理时的位置 ID 等比压缩到训练范围内
需要少量微调(~1000 步)才能稳定

NTK-aware Scaling

不改 position_id,而是修改 RoPE base:
  base_new = base × (L_test / L_train)^(d/(d-2))

直觉:低频维度(编码长距离)需要"看得更远"
NTK 通过差异化缩放高低频,让高频几乎不变、低频大幅延展
无需微调即可使用(zero-shot extrapolation)

YaRN(Yet Another RoPE extensioN, 2023)

NTK 的改进版:
1. 分频率段差异化处理(低频用 PI,高频不变,中频平滑过渡)
2. 增加 attention 温度(softmax 时缩放 logits 防止饱和)

效果:LLaMA 2 通过 YaRN 可扩展到 128K 上下文,性能损失极小
被 LLaMA 3、Qwen 等采用

LongRoPE (Microsoft 2024)

非均匀插值:用进化算法搜索每个频率维度的最优缩放因子
+ 短期/长期渐进式微调

可将上下文扩展到 2048K(200万 tokens),是目前最强的外推方案

对比表

方法 是否需要微调 最大扩展 实现复杂度 代表使用
直接外推 几乎无效 0 -
PI 4-8x LLaMA 2
NTK-aware 4-8x 通用方案
YaRN 16-32x LLaMA 3, Qwen
LongRoPE 256x+ Phi-3

五、ALiBi(Attention with Linear Biases)

细化理解: ALiBi 通过给 attention 分数加入随距离增大的线性惩罚,让模型天然偏向近邻上下文,同时保留访问远处 token 的能力。它不需要显式位置 embedding,因此外推更直接;但现代开源 LLM 更多采用 RoPE,因为 RoPE 在主流架构和训练实践中形成了更成熟的生态。

来源:MPT、BLOOM 模型使用。

核心思想

完全不修改 Q 和 K,直接在注意力分数上加一个与距离成正比的负偏置

score(i, j) = q_i · k_j / √d - m · |i - j|

其中 m 是每个头的斜率(slope),不同头有不同的 m

几何直觉

对于位置 i,它对其他位置的注意力分数:

位置:  i-3  i-2  i-1   i    i+1  i+2  i+3
原分数: s    s    s    s    s    s    s
ALiBi: s-3m s-2m s-m   s    s-m  s-2m s-3m  ← 距离越远惩罚越大

→ 自动衰减远距离 token 的影响,类似"衰减式注意力"
→ 因为衰减是线性的、确定性的,天然支持任意长度外推

优缺点

优点: - 完全无参数,零训练开销 - 天然外推(衰减规则不依赖训练长度) - 实现简单(只需在 attention score 上加一个矩阵)

缺点: - 远距离信息被强制衰减,对需要精确长距离匹配的任务(代码补全、跨段引用)表现不佳 - 不如 RoPE 灵活(无法精细区分位置 5 和位置 7 的关系,只看距离)


六、LLaMA 3 的 base=500000 改动

LLaMA 2 的 RoPE base = 10000(沿用原始 Transformer),LLaMA 3 改为 base=500000

为什么?

RoPE 频率公式:θ_i = base^(-2i/d)

base 越大 → 低频维度旋转越慢 → 编码"长距离位置"的容量越大

例子(d=128):
  base=10000:   最低频维度 θ_63 ≈ 10^-4,每旋转 1 弧度需走 ~10000 个位置
  base=500000:  最低频维度 θ_63 ≈ 10^-5.4,每旋转 1 弧度需走 ~398000 个位置

→ base 越大,越能区分极远距离的位置
→ LLaMA 3 配合 YaRN 把上下文从 8K 扩展到 128K,需要更大的 base 才能不"绕圈"

直觉:把"位置编码的钟"做得更大,让秒针走得更慢,避免在长序列中重复指向同一角度。


七、对比总结

方法 类型 实现 外推 代表模型
Sinusoidal 绝对 加在 Embedding 一般 原始 Transformer
Learned 绝对 加在 Embedding 不可 BERT, GPT-2
RoPE 相对 旋转 Q,K (配合 YaRN) LLaMA, Qwen, DeepSeek(主流)
ALiBi 相对偏置 加在 Attention 分数 MPT, BLOOM
T5 Relative Bias 相对 学习的相对位置偏置 一般 T5

八、面试延伸

Q:RoPE 为什么比加法位置编码更适合外推?

加法编码的位置向量(无论是 Sinusoidal 还是 Learned)训练时见过的范围有限,外推时位置向量会进入分布外区域。RoPE 编码的是"旋转角度"——只要相对距离 (m-n) 接近训练时见过的距离,模型就能正确处理。配合 YaRN 等插值技巧,RoPE 可以把训练时见过的角度"压缩"到更长的距离上重用。

Q:为什么不同注意力头的 RoPE 频率不同?

RoPE 把 d 维向量切成 d/2 对,每对用不同的频率旋转。低频维度旋转慢,捕获长距离依赖;高频维度旋转快,捕获短距离依赖。不同维度之间的差异化频率让模型能同时处理多种尺度的位置关系。这与 Sinusoidal 的设计动机一致——多尺度位置感知。

Q:YaRN 比 NTK 强在哪里?

NTK 是均匀缩放(所有频率同比例修改 base),YaRN 在此基础上做了三点改进:① 分段策略(高频维度几乎不变、低频维度大幅插值,中频平滑过渡);② 加入 attention 温度(防止 softmax 在长上下文下饱和);③ 推荐配合短时微调以稳定。综合效果上 YaRN 在 32K-128K 区间显著优于 NTK 和 PI。

Q:MRoPE(Multimodal RoPE)是什么?

Qwen-VL 等多模态模型使用的扩展。给图像 token 一个 2D 的位置编码(行 + 列),给文本 token 1D 编码(位置)。这样模型在处理图文混合输入时,能正确区分"图像内的空间关系"和"文本中的时间关系"。


原始论文

论文 链接
RoFormer: Enhanced Transformer with Rotary Position Embedding (Su et al., 2021) arxiv.org/abs/2104.09864
ALiBi: Train Short, Test Long (Press et al., ICLR 2022) arxiv.org/abs/2108.12409
Position Interpolation for LLaMA (Meta, 2023) arxiv.org/abs/2306.15595
YaRN: Efficient Context Window Extension of LLMs (Peng et al., 2023) arxiv.org/abs/2309.00071
LongRoPE: Extending LLM Context Window Beyond 2 Million Tokens (Microsoft, 2024) arxiv.org/abs/2402.13753
LaMPE: Length-aware Multi-grained Positional Encoding (2025) arxiv.org/abs/2508.02308
Layer-Specific Scaling of Positional Encodings for Long-Context (2025) arxiv.org/abs/2503.04355

延伸阅读与视频

平台 标题 说明
📺 B站 【零基础10分钟学透RoPE】旋转位置编码及外推方法 10分钟覆盖RoPE本体及NTK/YaRN/LongRoPE等外推方法
📺 B站 手撕RoPE旋转位置编码推导,通俗易懂 从数学原理出发完整推导RoPE,适合深入理解公式
📺 B站 旋转位置编码-详细解析RoPE和MRoPE 同时讲解标准RoPE与多模态扩展版MRoPE
📺 B站 终于知道Transformer为啥离不开RoPE了 从动机角度讲清RoPE替代绝对/相对位置编码的原因