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
2
3
位置 m 的 Q ──旋转 R(m)──► q̃_m  ─┐
├── 点积 → 只含 (m−n)
位置 n 的 K ──旋转 R(n)──► k̃_n ─┘

四、为什么只作用于 Q 和 K?

张量 是否 RoPE 原因
Q 参与 $Q^\top K$,需带「从哪发问」的位置
K 参与匹配,需带「我在哪」的位置
V 只被加权求和,承载内容;位置已在权重 $\alpha_{i,j}$ 里编码

对 V 再旋转会重复编码位置,且破坏「内容向量」的语义。标准实现:Q/K 投影后、Attention 前施加 RoPE。

数据流(单层、单头示意):

1
2
3
4
5
6
7
X → Q,K,V 投影

├─ Q ── RoPE(m) ──► Q̃
├─ K ── RoPE(n) ──► K̃ (每个 token 列用其位置 index)
└─ V ─────────────► V (不旋转)

Attention(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_basescaling 等超参配置

九、小结

概念 要点
问题 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