Appearance
位置编码演进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 是理解位置编码设计空间的好参照。
下一步
把视野拉到整个产业:现代主流大模型到底由哪些零件组成 → 主流模型家族。