大模型数学速成(07):RoPE——用旋转编码位置
Self-Attention 本身不包含位置信息——打乱 token 顺序,只要 Q/K/V 一起打乱,注意力分数不变。但语言有语序:「狗咬人」≠「人咬狗」。位置编码告诉模型每个 token 在序列中的位置;现代 LLM 广泛使用的 RoPE(Rotary Position Embedding,旋转位置编码) 通过「旋转」Q/K 向量来注入相对位置。
这一篇搞懂:为什么需要 RoPE、旋转在算什么、为何只改 Q/K、以及绝对位置与相对位置的关系。
这是「大模型数学速成」系列的第 7 篇。建议先读 第 06 篇:FFN。下一篇 ViT 层 vs LLM 层对照总表。
一、顺序问题:Attention 是「置换等变」的
第 05 篇 的注意力只看点积相似度。若把 token 列整体重排(Q、K、V 同步重排),每个 token 关注谁不变——模型不知道谁在前谁在后。
早期做法:
| 方法 | 思路 | 代表 |
|---|---|---|
| 绝对位置嵌入 | 给每个位置 $i$ 学一个向量 $p_i$,$x + p_i$ | 原始 Transformer |
| RoPE | 按位置旋转 Q/K 的特征对 | LLaMA、Qwen、GPT-NeoX 等 |
RoPE 的优势:注意力分数自然只依赖相对距离 $m - n$,外推长序列时表现更好,且无需额外可学习位置向量(相对角度由公式固定)。
二、二维旋转直觉
把特征维两两配对 $(x_{2i}, x_{2i+1})$,看作平面上的向量,按位置 $m$ 旋转角度 $\theta$:
$$
\begin{pmatrix} x’{2i} \ x’{2i+1} \end{pmatrix}
\begin{pmatrix} \cos m\theta_i & -\sin m\theta_i \ \sin m\theta_i & \cos m\theta_i \end{pmatrix}
\begin{pmatrix} x_{2i} \ x_{2i+1} \end{pmatrix}
$$
- 位置 $m=0$:不转($\cos 0=1, \sin 0=0$)
- 位置越大,转得越多
- 不同维度对 $(2i, 2i+1)$ 用不同频率 $\theta_i$——类似傅里叶,低维慢转、高维快转
频率常取($d$ 为 head 维或参与 RoPE 的维数):
$$
\theta_i = \text{base}^{-2i/d}, \quad \text{base 常见为 } 10000
$$
生活类比:每个特征对是一根时钟指针;token 在序列第 $m$ 位,就把指针拨到 $m \cdot \theta_i$ 角度——位置信息「写进」向量的方向里。
三、RoPE 与注意力:相对位置从何而来
设位置 $m$ 的 query 经 RoPE 得 $\tilde{q}_m$,位置 $n$ 的 key 经 RoPE 得 $\tilde{k}_n$。数学上可以证明(旋转矩阵的性质):
$$
\tilde{q}_m \cdot \tilde{k}_n = f(q_m, k_n, m - n)
$$
点积只依赖相对距离 $m - n$,不单独依赖 $m$ 或 $n$——这正是我们想要的:「相隔 3 个 token」的语义关系与绝对下标无关。
1 | 位置 m 的 Q ──旋转 R(m)──► q̃_m ─┐ |
四、为什么只作用于 Q 和 K?
| 张量 | 是否 RoPE | 原因 |
|---|---|---|
| Q | ✅ | 参与 $Q^\top K$,需带「从哪发问」的位置 |
| K | ✅ | 参与匹配,需带「我在哪」的位置 |
| V | ❌ | 只被加权求和,承载内容;位置已在权重 $\alpha_{i,j}$ 里编码 |
对 V 再旋转会重复编码位置,且破坏「内容向量」的语义。标准实现:Q/K 投影后、Attention 前施加 RoPE。
数据流(单层、单头示意):
1 | X → Q,K,V 投影 |
五、形状与实现要点(列 = token)
沿用 第 01 篇 约定,$Q$ 为 [d, S],第 $i$ 列对应序列位置 $i$(或 batch 内偏移后的绝对位置)。
- RoPE 逐列、逐对维度应用,不改变
[d, S]形状 - 推理 Decode 时:新 token 位置为当前
past_len,只算该列的 RoPE - 与 KV Cache(第 11 篇):历史 K 已含 RoPE,缓存的是旋转后的 K
多头时:每个 head 的 $d_\text{head}$ 维上独立做 RoPE(维度对数 = $d_\text{head}/2$)。
六、绝对 vs 相对位置
| 绝对位置嵌入 | RoPE | |
|---|---|---|
| 注入方式 | $x + p_i$ 加法 | Q/K 旋转 |
| 注意力中的位置 | 间接(嵌入已加在输入) | 显式进入 $Q \cdot K$ |
| 相对距离 | 需模型自己学 | 公式保证 $m-n$ 结构 |
| 外推更长序列 | 需插值 / 扩展 $p_i$ | 可调整 base / 缩放(NTK 等,进阶话题) |
RoPE 不是「没有绝对位置」——位置 $m$ 仍进入旋转角 $m \theta_i$;但匹配分数体现的是相对关系,这对建模局部语法、远距离依赖更自然。
七、极简二维手算
某 head 只取 2 维,位置 $m=1$,$\theta = \pi/4$,向量 $(1, 0)$:
$$
\cos\frac{\pi}{4} = \sin\frac{\pi}{4} \approx 0.707
\quad\Rightarrow\quad
(x’, y’) \approx (0.707, 0.707)
$$
位置 $m=2$ 时角度 $2\theta = \pi/2$,$(1,0) \to (0, 1)$。同一向量在不同位置方向不同,点积随 $(m-n)$ 变化。
完整 $d=768$ 时是 384 对二维旋转并行——实现上用复数乘法或预计算 $\cos/\sin$ 表优化。
八、与训练 / 推理的关系
| 阶段 | RoPE |
|---|---|
| 训练 | 每个 token 按其在序列中的 index 旋转 Q/K;无额外可学习 RoPE 权重(角度由公式定) |
| Prefill | 整段 prompt 各位置一次旋转 |
| Decode | 每步仅对新 token 的 Q/K 施加 position = cache_len 的旋转 |
| 权重文件 | 通常无单独 RoPE 矩阵;可能有 freq_base、scaling 等超参配置 |
九、小结
| 概念 | 要点 |
|---|---|
| 问题 | Attention 置换等变,需位置信息 |
| RoPE | 按位置旋转 Q/K 的维度对 |
| 相对性 | $\tilde{q}_m \cdot \tilde{k}_n$ 依赖 $m-n$ |
| V 不旋转 | 位置已在注意力权重中 |
| 形状 | [d,S] 不变,逐列应用 |
大模型数学速成系列第 7 篇完。下一篇 ViT 层 vs LLM 层——把 Norm、Attn、FFN、RoPE 放进一张对照总表。
系列导航
| 篇号 | 标题 | 状态 |
|---|---|---|
| 06 | FFN / GELU / SwiGLU | ✅ |
| 07 | RoPE:用旋转编码位置(本篇) | ✅ |
| 08 | ViT 层 vs LLM 层对照总表 | 下一篇 |
完整大纲见工作区 docs/MATH_SERIES_OUTLINE.md。










