RoPE 推导详解:从向量旋转到复数表示
Rotary Positional Embedding(RoPE)是目前大语言模型中最常用的位置编码方式之一,被 GPT、LLaMA、ChatGLM 等模型广泛使用。
相比传统 绝对位置编码(Absolute Position Encoding),RoPE 的核心特点是:
在 Attention 中自然引入相对位置(Relative Position)。
本文将从 两个角度推导 RoPE:
- 二维向量旋转(几何视角)
- 复数乘法(数学视角)
同时明确写出推导过程中使用的关键公式。
1 Transformer 中的位置问题
Transformer 的 Attention 计算为:
问题是:
Attention 本身不包含位置信息。
如果输入序列顺序改变,模型无法感知。
因此需要 Positional Encoding。
2 RoPE 的核心思想
RoPE 的思想非常简单:
将 embedding 的每两个维度视为一个二维向量,并根据 token 位置对其进行旋转。
假设 embedding 向量:
RoPE 会把它拆成二维对:
每一对进行 二维旋转变换。
3 二维向量旋转推导
3.1 二维旋转矩阵
在二维空间中,向量旋转角度 $\theta$ 的公式为:
展开可得:
这就是 RoPE 的基本变换公式。
3.2 位置依赖的旋转角度
RoPE 的旋转角度依赖于 token 位置 $p$ 和 维度频率 $\theta_k$:
其中:
参数说明:
| 符号 | 含义 |
|---|---|
| $p$ | token 位置 |
| $k$ | 维度 index |
| $d$ | embedding 维度 |
因此旋转角为:
4 RoPE 在 Attention 中的效果
Attention 计算核心是:
如果对 Query 和 Key 同时进行旋转:
其中:
则内积为:
利用旋转矩阵性质:
可得:
关键结论:
Attention 只依赖于位置差 $(i-j)$
因此 RoPE 天然编码相对位置。
5 复数视角推导
上面的推导基于 二维向量。
但 RoPE 论文使用 复数形式,因为表达更简洁。
5.1 向量与复数的对应
定义:
则二维向量:
可以表示为复数:
5.2 欧拉公式
复数旋转使用 欧拉公式:
5.3 复数旋转
二维旋转等价于:
展开:
计算得到:
因此:
实部:
虚部:
这 完全等价于二维旋转矩阵。
6 RoPE 的复数形式(完整推导)
上一节说明了:
二维旋转可以表示为复数乘法:
RoPE 论文就是利用这个性质,将二维向量旋转写成复数形式。
6.1 向量与复数表示
对于 embedding 的一对维度:
定义复数表示:
因此 Query 与 Key 可以写成:
6.2 RoPE 的旋转
对于位置 (i) 的 Query:
对于位置 (j) 的 Key:
其中:
6.3 Attention 内积
Attention 的核心是:
在复数形式中,对应 复数内积。
为了得到实数结果,需要使用 共轭复数:
其中:
- (\overline{k}) 为复数共轭
- (\text{Re}(\cdot)) 表示取实部
6.4 代入 RoPE
首先计算:
代入旋转:
则:
因此:
整理得到:
6.5 取实部
Attention score 为:
因此:
关键点在于:
旋转只依赖于 ( \theta_i-\theta_j )
6.6 相对位置出现
由于:
因此:
所以最终 Attention 为:
6.7 关键结论
Attention score 只依赖:
即:
相对位置
而不是绝对位置。
因此 RoPE 天然实现 relative position encoding。
6.8 总结
复数形式下 RoPE 的推导可以总结为:
1️⃣ 二维旋转
2️⃣ Query / Key 旋转
3️⃣ Attention 内积
4️⃣ 位置关系
最终得到:
Attention 只依赖 token 的相对位置。
7 为什么不同维度使用不同频率
RoPE 中:
这与 Transformer 原始位置编码一致。
原因是:
不同维度代表不同频率。
类似 傅里叶基底(Fourier Basis):
- 低维 → 低频
- 高维 → 高频
这样模型能够同时表示:
- 长距离关系
- 短距离关系
8 RoPE 总结
RoPE 的核心可以总结为一句话:
将 embedding 每两个维度看作二维向量,根据 token 位置进行旋转。
关键数学工具包括:
使用到的公式
1️⃣ 二维旋转矩阵
2️⃣ 欧拉公式
3️⃣ 复数旋转
4️⃣ RoPE 频率公式
9 直观理解
RoPE 可以用一句非常直观的话理解:
Token 的表示在 embedding 空间中随着位置不断旋转。
当两个 token 计算 attention 时:
它们的相对旋转角度决定注意力强度。
因此模型可以自然建模:
- 相对距离
- 顺序关系
pytorch实现
1 | def apply_rotary_pos_emb(x: torch.Tensor, pos: torch.Tensor) -> torch.Tensor: |