Skip to content

位置编码演进RoPE

位置编码 讲过绝对编码(正弦/可学习)。但它们外推差、不擅长表达「相对距离」,撑不起现代长上下文。旋转位置编码 RoPE 用「把位置信息变成一次旋转」的巧妙方式,成为 LLaMA、Qwen、GLM 等主流大模型的事实标准。

1. 绝对 vs 相对:为什么相对更重要

绝对编码:  给每个位置一个"身份证"   → 只知道自己排第几
相对编码:  强调"两个 token 隔多远"   → 语言里更本质的信号

直觉:"猫 追 狗" 里,「追」和「猫」相距 1、和「狗」相距 1 这种相对关系,比「它们是全局第 3 个词」更有用。相对位置编码让注意力天然感知距离。

2. RoPE 的核心一句话:用「旋转」注入位置

RoPE 不「加」位置向量,而是把 q、k 向量的每一对分量按与位置成正比的角度旋转

把 d 维向量两两配对看成 d/2 个二维平面上的点
位置为 pos 时, 第 i 对分量旋转角度 pos·θ_i  (θ_i 是预设频率, 各对不同)

   [q₁]        旋转 m·θ₁         [cos -sin][q₁]
   [q₂]  ───────────────►  =      [sin  cos][q₂]     (每个二维块独立旋转)

[ \begin{pmatrix} q_1' \ q_2' \end

\begin{pmatrix} \cos m\theta & -\sin m\theta \ \sin m\theta & \cos m\theta \end{pmatrix} \begin{pmatrix} q_1 \ q_2 \end{pmatrix} ]

3. 妙在哪:点积自动只依赖相对位置

分别用位置 m、n 旋转 q 和 k 后再做点积,绝对位置相互抵消,只剩 (m−n)

[ \langle R_m q,; R_n k\rangle = \langle q,; R_{n-m} k\rangle ;\propto; f(q,k,,m-n) ]

注意力分数 = q·k 的旋转版 → 结果天然编码"两个词相隔多远"
这就是 RoPE 优雅之处: 在实现上是"绝对"旋转, 效果上却得到"相对"位置感知

4. 极简实现

python
import torch

def rotate_half(x):
    x1, x2 = x.chunk(2, dim=-1)
    return torch.cat((-x2, x1), dim=-1)

def apply_rope(q, k, cos, sin):
    # q,k: [B, head, T, d];  cos/sin: [T, d] 由位置与频率预计算
    q_rot = (q * cos) + (rotate_half(q) * sin)
    k_rot = (k * cos) + (rotate_half(k) * sin)
    return q_rot, k_rot   # V 不旋转, 只转 Q/K

# 频率与位置
d = q.size(-1)
inv_freq = 1.0 / (10000 ** (torch.arange(0, d, 2).float() / d))   # 多频率
pos = torch.arange(T).float()
freqs = torch.outer(pos, inv_freq)                                  # [T, d/2]
emb = torch.cat((freqs, freqs), dim=-1)
cos, sin = emb.cos()[None, None], emb.sin()[None, None]

只有 Q、K 参与旋转,V 不动——因为位置信息是用来「对齐谁该关注谁」的,不影响被取走的内容。

5. RoPE 好在哪,又带来什么新问题

维度绝对正弦/可学习RoPE
相对位置感知弱/需自己学天然具备
外推到更长序列差(尤其可学习)较好,但仍有限
长距离衰减无内在机制有理想的远距衰减
生态BERT/GPT-2 时代LLaMA/Qwen 等主流

新问题:上下文扩展。模型训练时只见过位置到 L,推理到更长位置质量骤降。于是有:

位置插值 (PI): 把新长度压缩回训练长度范围(缩小角度)          → 立即可用, 略糊
NTK / YaRN   : 按频率缩放基频/分段处理, 高频少动低频多动      → 更长上下文且质量更好
渐进式训练    : 逐步增大训练长度                              → 稳但贵

这正是 高效注意力 末尾提到的「RoPE + 插值/YaRN」组合拳的位置侧。

6. 顺带认识的其它方案

  • ALiBi:不编码位置进向量,而是给注意力分数按距离加一个线性偏置(惩罚远处),外推性强,BLOOM/MPT 用。
  • T5 相对 bias:把相对距离分桶,学一个可加的 bias 表。
  • NoPE:干脆不加位置编码,靠因果掩码本身让模型隐式学出顺序(某些场景意外可行)。

小结

  • 相对位置比绝对位置更贴近语言本质。
  • RoPE 通过对 Q/K 按位置「旋转」,让注意力分数天然只依赖相对距离,优雅且外推更好。
  • 想突破训练长度上限,配合位置插值 / NTK / YaRN
  • ALiBi、T5 bias、NoPE 是理解位置编码设计空间的好参照。

下一步

把视野拉到整个产业:现代主流大模型到底由哪些零件组成 → 主流模型家族