Paper Visual Reading

RoPE:用旋转矩阵编码位置

RoFormer 提出的旋转位置编码(Rotary Position Embedding),用「乘法旋转」取代「加法偏移」,让 Transformer 的注意力内积天然只依赖相对位置差。如今已成为 LLaMA、Qwen 等主流大模型的标配组件。

Jianlin Su 等 · Zhuiyi Technology arXiv: 2104.09864 4457 次引用 2021 年 4 月
30 秒速览

Transformer 需要位置信息,但传统做法是把位置向量加到词嵌入上。RoPE 的核心洞察是:把 query 和 key 向量按位置角度旋转,内积就自然只取决于相对位置差 $m - n$,无需显式构造相对位置编码。

为什么 Transformer 需要位置编码

与 RNN 的递归和 CNN 的局部窗口不同,Transformer 的自注意力机制对所有位置一视同仁——它是位置无关的(position-agnostic)。如果不注入位置信息,「我喜欢你」和「你喜欢我」对模型来说完全一样。

因此,我们需要某种方式告诉模型每个 token 在序列中的位置。过去五年,位置编码大致沿两条路线演化:

位置编码方法演进

2017
正弦绝对编码
Transformer 原始方案
$p_i = \sin / \cos$ 加到嵌入
2018-19
可训练绝对编码
BERT / GPT
学习 $p_i$ 向量
2018-20
相对位置编码
Shaw / Transformer-XL
改写注意力公式
2021
RoPE
旋转编码
乘法 × 旋转矩阵

三种方法如何编码位置

绝对编码
$x_m$ $p_m$ + $W_q$ $q_m$ $q_m = W_q(x_m + p_m)$ 位置与内容 先混合,再变换
相对编码
$q_m$ $k_n$ dot + $b_{m-n}$ $a_{mn}$ $q^\top k + b_{m-n}$ 先算内积 再加位置偏置
RoPE
$x_m$ $W_q$ $R_m$ 旋转 $q_m$ $q_m = R(m\theta) \cdot W_q x_m$ 先变换,再旋转 $q_m^\top k_n$ 自动只含 $m - n$ 不改注意力公式结构

前两种方法都是「加法」——把位置信息加到词嵌入或注意力分数上。RoPE 走了一条不同的路——用「乘法(旋转)」来编码位置,从而让位置信息自然地融入注意力计算。

核心思想:从加法到旋转

传统方法的做法是:先把位置向量 $p_m$ 加到词嵌入 $x_m$ 上,再做线性变换得到 query 和 key:

传统:$q_m = W_q(x_m + p_m)$,位置信息通过加法混入嵌入

RoPE 的做法完全不同——先做线性变换,然后把结果向量按位置角度旋转

RoPE:$q_m = R_m \cdot W_q x_m$,位置信息通过旋转矩阵乘法编码

这个看似简单的改动带来了一个关键优势:当你计算 $q_m^\top k_n$ 时,两个旋转矩阵相乘自动变成 $R_{n-m}$,内积天然只取决于相对位置差。

传统方法:加法编码 Additive

把位置向量加到嵌入上,然后在注意力公式中展开,手动提取相对位置项。

  • $q_m^\top k_n$ 展开后有 4 项,需逐项处理
  • 改动注意力计算公式
  • 不兼容线性注意力
$q_m^\top k_n = x_m^\top W_q^\top W_k x_n + x_m^\top W_q^\top W_k p_n + \cdots$

RoPE:旋转编码 Rotary

对 query/key 施加位置相关的旋转,内积自动只包含相对位置。

  • $q_m^\top k_n$ 天然只含 $m - n$
  • 不改注意力公式结构
  • 兼容线性注意力
$q_m^\top k_n = (R_m W_q x_m)^\top (R_n W_k x_n) = x_m^\top W_q^\top R_{n-m} W_k x_n$

从 2D 平面建立直觉

为了理解为什么旋转能编码位置,我们先看最简单的二维情况。在 2D 平面上,把一个向量旋转角度 $\theta$ 就是左乘旋转矩阵:

$R(\theta) = \begin{pmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{pmatrix}$

RoPE 的做法是:位置 $m$ 的 token,其 query/key 被旋转 $m\theta$。那么位置 $m$ 的 query 和位置 $n$ 的 key 做内积时:

$q_m^\top k_n = (R(m\theta) \cdot q)^\top (R(n\theta) \cdot k) = q^\top R((n-m)\theta) \cdot k$

结果只取决于 $n - m$,即相对位置差。这是因为旋转矩阵是正交矩阵,$R(a)^\top R(b) = R(b-a)$。

交互演示:2D 旋转位置编码

拖动滑块改变位置 $m$,观察 query 向量如何随位置旋转。右侧显示 $q$ 与固定的 $k$(位置 0)的夹角变化。

0 旋转角 =

论文通过复数域的推导严格证明了这个解的唯一性:设 $q = W_q x_m$ 在复数域表示为 $|q|e^{i\theta_q}$,要求内积 $\langle f_q(x_m, m), f_k(x_n, n)\rangle = g(x_m, x_n, m-n)$,则解必须是 $f_q(x_m, m) = (W_q x_m) e^{im\theta}$——即乘以一个纯旋转。

从 2D 到高维:通用旋转矩阵

实际模型的维度 $d$ 远大于 2。RoPE 的做法是把 $d$ 维空间拆成 $d/2$ 个独立的 2D 子空间,每个子空间用不同的旋转频率 $\theta_i$:

旋转矩阵 $R^d_{\Theta,m}$ 的完整形式 +
$$R^d_{\Theta,m} = \begin{pmatrix} \cos m\theta_1 & -\sin m\theta_1 & 0 & 0 & \cdots \\ \sin m\theta_1 & \cos m\theta_1 & 0 & 0 & \cdots \\ 0 & 0 & \cos m\theta_2 & -\sin m\theta_2 & \cdots \\ 0 & 0 & \sin m\theta_2 & \cos m\theta_2 & \cdots \\ \vdots & \vdots & \vdots & \vdots & \ddots \end{pmatrix}$$

这是一个分块对角矩阵,每个 $2 \times 2$ 块都是一个标准旋转矩阵。频率参数 $\theta_i = 10000^{-2(i-1)/d}$,与 Transformer 原始正弦编码的频率设置一致。

高效实现:避免矩阵乘法 +

直接做矩阵乘法太浪费(旋转矩阵大部分是 0)。论文给出了等价的逐元素实现:

$$R^d_{\Theta,m} x = x \otimes \cos(m\Theta) + \text{rotate\_half}(x) \otimes \sin(m\Theta)$$

其中 $\text{rotate\_half}$ 把相邻元素交换并取反:$(x_1, x_2, x_3, x_4, \ldots) \to (-x_2, x_1, -x_4, x_3, \ldots)$。这个操作只需要逐元素乘法和加法,计算开销几乎可以忽略。

自注意力中的应用 +

在自注意力计算中,RoPE 作用于 query 和 key,但不作用于 value:

$$q_m = R^d_{\Theta,m} W_q x_m, \quad k_n = R^d_{\Theta,n} W_k x_n, \quad v_n = W_v x_n$$

注意力分数变为:

$$q_m^\top k_n = x_m^\top W_q^\top R^d_{\Theta,n-m} W_k x_n$$

其中 $R^d_{\Theta,n-m} = (R^d_{\Theta,m})^\top R^d_{\Theta,n}$,只取决于相对位置 $n - m$。

每个 2D 子空间对应一个不同的旋转频率。低频维度捕获远程依赖,高频维度捕获近距离关系——就像傅里叶变换中不同频率分量各自负责不同尺度的信号。

多频率旋转:不同子空间的旋转速度

每个 2D 子空间按不同频率 $\theta_i$ 旋转。低维旋转快(捕获近距离),高维旋转慢(捕获远距离)。

0

RoPE 的三大性质

RoPE 不只是数学上优雅,它还具备三个实际优势,这些性质让它成为现代大模型的首选位置编码方案。

性质一:远程衰减(Long-term Decay) +

当 $\theta_i = 10000^{-2i/d}$ 时,注意力内积的上界随相对距离 $|m - n|$ 增大而衰减。论文通过 Abel 变换证明了:

$$\left|\sum_{i=0}^{d/2-1} q_{[2i:2i+1]} k_{[2i:2i+1]}^* e^{i(m-n)\theta_i}\right| \leq C \cdot \sum_{i=1}^{d/2} |S_i|$$

其中 $\frac{1}{d/2}\sum|S_i|$ 随 $|m-n|$ 单调递减。这意味着距离越远的 token 对,注意力权重的上界越低——符合自然语言中「近邻更相关」的直觉。

性质二:兼容线性注意力 +

线性注意力把 $\text{sim}(q, k) = \phi(q)^\top \phi(k)$ 替换 softmax,从而实现 $O(N)$ 复杂度。但此时注意力的计算顺序变了,传统的加法式相对位置编码无法嵌入。

RoPE 不修改 value,不改变注意力公式的结构——它只是在 query 和 key 上做旋转变换。因此可以直接用于 Performer 等线性注意力架构,这在其他相对位置编码方法中是做不到的。

性质三:序列长度灵活性 +

旋转矩阵 $R^d_{\Theta,m}$ 可以为任意位置 $m$ 即时计算(只需 sin/cos),不需要预先存储位置嵌入表。这意味着模型天然支持推理时遇到比训练时更长的序列——这也是为什么 RoPE 被广泛用于长上下文大模型中。

后续工作(如 NTK-aware RoPE、YaRN 等)进一步通过调整频率基数来增强 RoPE 的外推能力。

实验结果

论文在机器翻译、预训练语言模型、GLUE 微调和中文长文本任务上验证了 RoPE 的有效性。

机器翻译(WMT 2014 En-De)

27.5
BLEU
RoFormer
27.3
BLEU
Transformer 基线

GLUE 微调结果

预训练 100k 步后,在 GLUE 基准上微调对比 BERT:

模型MRPC (F1)SST-2QNLISTS-BQQP (F1)MNLI
BERT88.993.590.585.871.284.6
RoFormer89.590.788.087.086.480.2

RoFormer 在 MRPC、STS-B 和 QQP 上显著优于 BERT;在 SST-2、QNLI 和 MNLI 上 BERT 略胜——这可能与预训练步数有限(仅 100k 步)以及任务类型差异有关。

中文长文本:CAIL2019 相似案例匹配

这是论文最能体现 RoPE 长文本优势的实验——文档长度普遍超过 512 字符:

模型验证集 (Acc)测试集 (Acc)
BERT-51264.13%67.77%
WoBERT-51264.07%68.10%
RoFormer-51264.13%68.29%
RoFormer-102466.07%69.79%

当截断长度为 512 时,RoFormer 与 WoBERT 持平。但当长度扩展到 1024 时,RoFormer 获得了 +1.5% 的绝对提升——这正是 RoPE 序列长度灵活性的体现。

RoPE 的真正影响力远超这篇论文本身的实验。在 2023-2024 年间,几乎所有主流开源大模型——LLaMA、Mistral、Qwen、DeepSeek——都采用了 RoPE 作为位置编码。它成为了 Transformer 长上下文建模的事实标准。

总结与启示

RoPE 的成功揭示了一个深层道理:好的归纳偏置不需要复杂的机制。用旋转代替加法,这个简洁的改动同时解决了绝对/相对位置编码的统一、长序列外推、线性注意力兼容三个问题。

论文也坦诚地指出了两个未解之谜:为什么旋转编码比加法编码收敛更快,以及远程衰减为什么能带来如此显著的长文本优势——这些理论分析仍然是开放问题。

RoPE 之后的发展 +

RoPE 发表后,后续研究主要聚焦于增强其长度外推能力:

  • Position Interpolation (PI):线性缩放位置索引,使模型适应更长上下文
  • NTK-aware RoPE:调整频率基数而非位置索引,保留高频信息
  • YaRN:结合 NTK 缩放和注意力温度调整
  • Code LLaMA:通过长序列微调扩展到 100k+ 上下文

这些工作证明 RoPE 的旋转框架有足够的灵活性来适应不断增长的上下文需求。