RoFormer: Rotary Position Embedding
Su et al.
用二维旋转矩阵编码位置——相对位置天然反映在 query 和 key 的点积里,支持长度外推。
arXiv:2104.09864核心贡献
- 01位置 m 的向量按角度 mθ 旋转
- 02关键性质:⟨R(m)q, R(n)k⟩ = ⟨q, R(n-m)k⟩ —— 点积仅依赖相对位置差
- 03天然支持**推理时外推到训练未见过的长度**
- 04被 LLaMA、PaLM、Qwen、DeepSeek 等主流模型广泛采用
核心思想
位置编码的两种主流方案:
- 绝对位置编码(Sinusoidal、Learned):把位置信息加到 token embedding 上,简单但外推差
- 相对位置编码(T5 bias、
ALiBi、RoPE):把位置信息直接注入 attention 计算
RoPE 的思路:把位置 m 编码为一个旋转变换。对每一对维度 (2i, 2i+1),按角度 mθ_i 做 2D 旋转:
关键等式
旋转矩阵的正交性带来:
即 query 和 key 的点积只与它们的相对位置差 (n-m) 有关,与绝对位置 m、n 无关。
外推能力
不同维度用不同频率——低维高频、高维低频。训练时见过 0~4K 位置,推理时理论上可以应用到任意长度(虽然实际效果仍会衰减)。
长上下文扩展
- Position Interpolation (PI):推理时把超长位置压缩到训练范围
- NTK-aware scaling:非线性调整 θ 的底数
- YaRN:结合 NTK 和 attention scaling
- 这些技巧把
RoPE模型推到 100K+ 上下文
面试考点
"RoPE 的 '相对位置编码' 体现在哪里?" 必答——写出 R_m q · R_n k = q · R_{n-m} k。点积形式中位置 m、n 具体值不重要,只有差值 n-m 进入结果。
"为什么不用 ALiBi?" ALiBi 直接给 attention score 加一个位置距离的偏置;优点是极简,缺点是表达能力受限。RoPE 可学习(隐式通过 token embedding 的交互),外推性也好。
"RoPE 怎么实现的?" 工程上不用真的做矩阵乘,用复数表示更高效:把 (q_2i, q_2i+1) 看作 q_2i + i·q_2i+1,乘以 e^(imθ_i) 即完成旋转。
"怎么扩长上下文?" PI/NTK/YaRN 的差异:
- PI 直接压缩位置索引——简单但破坏原始频率
- NTK 调整底数——在长距离保留更多信息
- YaRN 进一步结合 attention temperature 调整
易错点:RoPE 只对 Q 和 K 做旋转,不对 V 做——V 不参与位置比较。