LLM & Agent 每日论文阅读计划-D2

2026-04-11 10:501阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐
问题描述:

LLM & Agent 每日论文阅读计划-D2


碎碎念

今天来补昨天看DeepSeekV2论文留下的其中之一个坑:旋转位置编码(Rotary Position Embedding,RoPE),话说这个不应该叫旋转位置嵌入吗?由于原文涉及到致死量的数学公式,今天花了大量时间拷打claude进行公式理解。(╯-_-)╯╧╧ 方便起见我只阅读了博客。细节阅读部分还是有很多数学公式,因此如果不想看公式的话就看TL;DR,细节阅读的开头结尾和我的感悟就行´͈ ᵕ `͈


今日阅读论文

  • 标题:ROFORMER: ENHANCED TRANSFORMER WITH ROTARY POSITION EMBEDDING
  • 作者单位:苏剑林,追一科技
  • 链接:arxiv | 博客
  • 发表venue:arxiv
  • 年份:2021.4

ps:苏剑林苏神是月之暗面(KIMI AI)的研究员和知名中文 NLP 技术博主,最广为人知的贡献是提出了旋转位置编码 RoPE——目前几乎所有主流大模型(LLaMA、Qwen、DeepSeek、Kimi 等)都采用的位置编码方法。苏神本人也是我的学习目标之一,可惜我的数学实在是太拉了,但凡我有苏神一半的数学水平。。他有个非常知名的博客网页:科学空间


TL;DR

旋转位置编码就是用绝对位置编码的方式实现相对位置编码的效果。从而同时获得绝对位置编码的简单实现和对线性注意力的适配性,以及相对位置编码的更好的性能。


细节阅读:

下面内容企图以一个数学小白的视角猜测和理解苏神当年是怎么想到思路、推导和最终发明旋转位置编码的过程,这不是严格推导的,而是一次基于猜测的"逆向工程"——把 RoPE 论文里那些"为简单起见"和"显然可以"背后藏着的研究思路还原出来。通过猜测和还原苏剑林的真实思考过程,你会发现 RoPE 不是凭空蹦出来的天才之作,而是数学和技术积累+直觉+工程实践的精心组合。

一、问题的起点:一个工程上的痛点

1.1 当时的位置编码格局(2020-2021)

由于Transformers的计算特性,它不像RNN这些架构一次处理一个token,而是并行处理,因此必须显式注入位置信息,让模型分清楚token的先后位置顺序。

*一个不恰当的比喻,就像现在工业化养殖肉猪,一次出栏很多猪,因此养猪场猪出栏的时候要给猪盖章证明检疫合格和出栏时间,从而分清楚哪头猪是哪头,免得出问题了找不到对应的厂家,但是盖这个印章的墨水又不能影响到食用:

绝对位置编码:把位置向量加到输入 token 上

x_k + p_k
  • 代表:BERT 的可训练式、Vaswani 的 Sinusoidal 三角式(来源于transformer经典老番 Attention is all your need)
  • 优点:实现简单,直接加在输入上
  • 缺点:泛化能力弱,长度外推差

相对位置编码:在 attention 计算里直接注入相对距离

i - j
  • 代表:T5、DeBERTa、XLNet
  • 优点:效果普遍更好,因为语言关系本质上是相对的
  • 缺点:必须修改 attention 的计算结构,不适用于线性注意力

1.2 苏剑林真正在意的痛点

苏剑林当时在研究线性 Attention(Performer、Linear Transformer 等)。这类方法依赖可分解形式:

\text{softmax}(QK^\top) \approx \phi(Q)\phi(K)^\top

从而把 attention 复杂度从 O(n²) 降到 O(n)。

问题来了:所有相对位置编码方案都修改了 attention 的内部结构,因此都和线性 Attention 不兼容。而苏剑林想的是

有没有一种位置编码,既能像绝对位置编码那样直接加在 q、k 上(保持线性 Attention 兼容,又能在后续注意力矩阵的内积计算中自动产生相对位置效果(保持效果)

也就是"将绝对位置编码与相对位置编码融于一体"。

二、灵感的火花:复数旋转的天然性质

2.1 关键观察

苏剑林由于是数学出身,同时作为博客作者写过大量复数与几何的科普,因此具有对数学性质的专业性的敏感,对通过"两个绝对位置经过相乘转换成相对位置"这个要求,他马上联想到了复数旋转的性质。具体讲,他注意到一个等式:

e^{im\theta} \cdot (e^{in\theta})^* = e^{i(m-n)\theta} \tag{1}

这个等式在数学上极其平凡,但用到位置编码上简直是天作之合:两个绝对位置 m、n 经过复数乘共轭后,自然地"折叠"成了相对位置 m−n,不需要任何额外操作,完全是复数代数本身的性质。

2.2 复数与实向量内积的桥梁

由于注意力矩阵计算本质上其实就是多个向量内积,而苏剑林想要引入复数的性质,于是开始推导:

\langle \boldsymbol{q}, \boldsymbol{k} \rangle = \text{Re}[\boldsymbol{q}\,\boldsymbol{k}^*] \tag{2}

这就是连接实向量内积和复数的桥梁。二维实向量的内积等于把它们看作复数后,一个乘以另一个共轭再取实部。

这两个等式一拼接,灵魂时刻就到了:

只要把位置信息编码成"乘以一个单位复数"的形式(注入是绝对的),那么 q 和 k 做内积时,相位会自动相减(效果是相对的)

这就是 RoPE 的全部直觉。剩下的所有数学推导,都是在严格化这个直觉、把它从二维推广到高维、并验证它的工程可行性。

2.3 复数乘法的几何本质(理解相位相减的关键)

为了把相位相减这件事看清楚,需要理解复数乘法的几何意义:

复数乘法 = 旋转 + 缩放

设两个复数:

z_1 = r_1 e^{i\theta_1}, \quad z_2 = r_2 e^{i\theta_2}

它们相乘:

z_1 \cdot z_2 = r_1 r_2 \cdot e^{i(\theta_1 + \theta_2)}

模长相乘、相位相加。这是因为欧拉公式加上三角函数和角公式自然得到的:

e^{i\theta} = \cos\theta + i\sin\theta

乘以共轭就是反向旋转:

w^* = re^{-i\theta}

所以:

z_1 \cdot z_2^* = r_1 r_2 \cdot e^{i(\theta_1 - \theta_2)}

相位变成了

直觉版本:乘以一个复数 = 按它的角度逆时针转;乘以它的共轭 = 按它的角度顺时针转。所以 z₁·z₂* 的相位就是 z₁ 和 z₂ 的"夹角"——这正是我们想要的"相对位置"。

三、严格化:把直觉变成数学推导

3.1 问题建模

到这一步,苏剑林手里已经有了一个清晰的直觉——位置信息应该通过"乘一个单位复数"的形式注入,也就是它应该是一种乘性位置编码。但直觉不是推导,要把这个想法落实成一个严格的 RoPE 方案,必须先把问题形式化。

先定义未知函数

我们想要的是一个"位置编码函数",它能把一个 token 向量和它所在的位置合成一个新的、带位置信息的向量。记这个函数为 f。对于位于位置 m 的 query 向量 q,位置编码后的结果是:

f(\boldsymbol{q}, m)

对于位于位置 n 的 key 向量 k,位置编码后的结果是:

f(\boldsymbol{k}, n)

这里要强调一下 f 的输入含义:第一个参数是原始 token 向量本身(q 或 k),第二个参数是它在序列中的位置索引(m 或 n)。函数的输出是"注入了位置信息之后的新向量"。这就是 RoPE 要设计的对象——一旦解出 f 的具体形式,整套方案就成了。

预期的答案形态

虽然 f 还是未知的,但苏剑林心里已经有目标了。根据第二节的直觉——位置信息应该表现为"单位复数相乘"——他预期 f 最终会长成类似下面这种形式:

f(\boldsymbol{q}, m) \sim \boldsymbol{q} \cdot e^{im\theta}

也就是"原始向量乘上一个随位置 m 旋转的复数"。这种位置信息编码最好还是单位复数,这样两个绝对位置相乘共轭后会自动留下相对位置,还不会改变q和k的平均值——这正是我们要的性质。

但目前这只是一个有待验证的猜测,不是严格结论。接下来几节要做的事情就是:从 f 满足的方程出发,通过一系列代数操作和约束强化,严格地推导出 f 必须长成上面这种形式。换句话说,我们要让f的形式从方程里自己"长"出来,而不是假设它。

写下核心约束
我们希望这个 f 有什么性质?回忆 RoPE 的设计目标:形式上是绝对位置编码(f 只依赖绝对位置 m),效果上是相对位置编码(做 attention 内积时只依赖 m−n)
翻译成数学语言:我们希望 f(q, m) 和 f(k, n) 做内积后的结果,只依赖 m−n 而不依赖 m 和 n 各自的具体值。把这个"结果"记作 g,它是一个以 q、k 和相对位置 m−n 为参数的函数。结合前面讲过的桥梁等式 (2),可以写出:

\text{Re}[f(\boldsymbol{q},m)\,f^*(\boldsymbol{k},n)] = g(\boldsymbol{q},\boldsymbol{k},m-n) \tag{3}

左边是"把位置编码后的 q、k 当成复数做乘共轭取实部"——也就是它们作为位置编码后向量的内积。右边是一个抽象函数 g,它的第三个参数是相对位置 m−n,代表"不管 m、n 各是多少,只要 m−n 相同,这个值就相同"。

这是个函数方程

注意这里的未知量是函数 f 本身,不是某个数。我们要解出的是"f 应该长什么样,才能让上面的等式对任意 q、k、m、n 都成立"。这类以函数为未知量的方程叫作函数方程,在数学上有一套专门的求解技巧(特殊值代入、递推、寻找不变量等),后面会反复用到。

分析:在建模和推导前,苏剑林其实通过直觉已经知道答案的轮廓,建模和推导只是为了用方程的代数结构把直觉严格化,同时验证它是方程的合理解。

3.2 解方程

步骤1:加强约束,从实数到复数

直接解式 (3) 行不通: f 外面的 Re 把复数压成实数,会破坏掉相位结构。具体说:

e^{im\theta} = \cos(m\theta) + i\sin(m\theta)

如果取实部,就只剩 cos(mθ)。但 cos 是偶函数,无法区分 m 和 −m,方向感丢失,更重要的是再也没有"复数乘法 = 相位相加"那个漂亮的代数性质了。

苏剑林的对策:主动加强约束,把式 (3) 变成:

f(\boldsymbol{q},m)\,f^*(\boldsymbol{k},n) = g(\boldsymbol{q},\boldsymbol{k},m-n) \tag{4}

去掉 Re,要求整个复数相等,不只是实部。

分析:这一步其实是有的可循的。原方程f外面的 Re 把复数压成实数,会破坏掉相位结构,也破坏了"复数乘法 = 相位相加"那个关键的代数性质。苏剑林意识到,想要从方程里解出"旋转复数"形式的答案,就必须保留相位信息。所以他主动去掉了Re,把约束加强为复数等式。这步不是逻辑必然,而是"为了让答案能浮现出来"所做的方法论选择。
用一个比喻:Re 就像把彩色照片印成黑白。你要研究照片里的"蓝色",就必须在彩色阶段研究;如果一上来就把照片印成黑白,“蓝色"这个概念就消失了,你再怎么推导也不可能从黑白照片里还原出蓝色。但等你研究清楚了"蓝色物体长什么样”,最后再印成黑白也无所谓——你只是不展示颜色,但它确实存在过。

因此,我们继续,将 f 写成复数的指数形式:

f(\boldsymbol{q},m) = R_f(\boldsymbol{q},m)\,e^{i\Theta_f(\boldsymbol{q},m)}

代入式 (4),拆成两部分:

R_f(\boldsymbol{q},m)\,R_f(\boldsymbol{k},n) = R_g(\boldsymbol{q},\boldsymbol{k},m-n) \tag{5a} \Theta_f(\boldsymbol{q},m) - \Theta_f(\boldsymbol{k},n) = \Theta_g(\boldsymbol{q},\boldsymbol{k},m-n) \tag{5b}

现在我们要解式 (5a)、(5b) 这两个方程。但它们都含有 q、k、m、n 四个变量,直接硬解不可能——必须”消元”。

步骤2:代入特殊点 m = n

直觉和动机分析:其实就是通过代入特殊解和边界条件条件求解方程。回到 RoPE 的物理含义想一想:当两个 token 恰好在同一个位置时(也就是 m = n)会发生什么?按照相对位置编码的理论,m=n 对应"两个 token 在同一个位置"的情形,这时候不应该有任何位置编码的影响——它就应该退化为普通的、不带位置的内积 ⟨q,k⟩。这是一个物理意义上必须成立的边界条件,不是凭空假设的。

把 m = n 代入式 (5a) 和 (5b),右边的第三个参数变成 0:

R_f(\boldsymbol{q},m)\,R_f(\boldsymbol{k},m) = R_g(\boldsymbol{q},\boldsymbol{k},0) \tag{5a'} \Theta_f(\boldsymbol{q},m) - \Theta_f(\boldsymbol{k},m) = \Theta_g(\boldsymbol{q},\boldsymbol{k},0) \tag{5b'}

g(q, k, 0) 退化成了只依赖 q、k 的函数。但它具体等于什么?还需要一个初始条件。

直觉和动机分析:

  1. 苏剑林知道答案应该是"q 乘以一个旋转因子"的形式。当位置 m = 0 时,旋转因子退化为 1(旋转 0 度 = 不旋转),所以 f(q, 0) 自然就等于 q 本身。这个边界条件和目标解是完全自洽的。
  2. 更直接的理由:序列的第 0 个位置是"起点",它不应该被加入任何位置信息,不应该被变换,就是 token 本身。换句话说:
f(\boldsymbol{q}, 0) = \boldsymbol{q} \tag{6}

这个约定的物理含义是"原点不加入位置信息",数学上也和预期答案自洽(m=0 时 e⁰ = 1,正好退化为 q)。

联合式 (5a’)、(5b’) 与式 (6) 求解

由式 (6)(同理 f(k, 0) = k),可以算出 g(q, k, 0) 的模长和相位:

R_g(\boldsymbol{q},\boldsymbol{k},0) = \|\boldsymbol{q}\|\,\|\boldsymbol{k}\| \tag{6a} \Theta_g(\boldsymbol{q},\boldsymbol{k},0) = \Theta(\boldsymbol{q}) - \Theta(\boldsymbol{k}) \tag{6b}

模长部分:将式 (6a) 回代进式 (5a’),推出:

R_f(\boldsymbol{q}, m) = \|\boldsymbol{q}\| \tag{7}

也就是说,位置编码函数 f 不改变向量的模长——它只作用在"方向/相位"这个维度上。这正好对应前面复数直觉里说的"单位复数相乘"——单位复数模长为 1,乘上去只会旋转,不会拉伸。

相位部分:将式 (6b) 回代进式 (5b’),得到:

\Theta_f(\boldsymbol{q},m) - \Theta_f(\boldsymbol{k},m) = \Theta(\boldsymbol{q}) - \Theta(\boldsymbol{k})

移项整理:

\Theta_f(\boldsymbol{q},m) - \Theta(\boldsymbol{q}) = \Theta_f(\boldsymbol{k},m) - \Theta(\boldsymbol{k})

等号左边只含 q 和 m,右边只含 k 和 m。但 q 和 k 是任意的——这意味着两边必须都等于一个只与 m 有关、与 q/k 无关的函数。这一性质符合位置编码的物理意义:位置编码只与位置信息有关,与 token 内容无关。记这个函数为 φ(m),就得到:

\Theta_f(\boldsymbol{q}, m) = \Theta(\boldsymbol{q}) + \varphi(m) \tag{8}

其中 φ(m) 是一个只依赖于位置 m、与 q 本身完全无关的函数。这个形式的含义是:位置 m 处的 q 的相位 = q 本身的相位 + 一个由位置决定的"相位增量"。

这一步隐藏着 RoPE 最核心的设计哲学:位置信息只通过"相位增量"注入,并且这个增量必须与 token 内容无关——也就是说,无论你处理的token是"猫"还是"狗",只要它在位置 m,它吃到的位置编码即"相位增量"就是同一个 φ(m)。这是位置编码作为"模型架构固定属性"的基本要求,否则每对 token 都有自己的位置编码方式,整个模型就乱套了。

步骤3:代入特殊点 n = m−1 解出 φ

现在模长问题解决了,只剩下一个未知函数 φ(m) 需要确定。我们知道它只依赖于 m,但还不知道它的具体形式——它可能是线性的 mθ、二次的 m²θ、对数的 log(m)、甚至是某种乱七八糟的函数。

苏剑林现在要问:φ(m) 的具体形式能从方程里推出来吗?

把式 (8) 回代到式 (5b):

\varphi(m) - \varphi(n) + \Theta(\boldsymbol{q}) - \Theta(\boldsymbol{k}) = \Theta_g(\boldsymbol{q}, \boldsymbol{k}, m-n)

这个方程里 m、n 都是自由变量,仍然复杂。

为什么要代入 n = m − 1

代入 n = m − 1 后,相对位置变成 m − (m−1) = 1,是一个常数。这样做之后,方程右边不再依赖 m!整个右边只剩下 q、k 和常数 1,是个与 m 无关的量。而左边 φ(m) − φ(m−1) 是关于 m 的差分。所以方程的本质变成了:

\underbrace{\varphi(m) - \varphi(m-1)}_{\text{某个关于 } m \text{ 的差分}} = \underbrace{\Theta_g(\boldsymbol{q}, \boldsymbol{k}, 1) + \Theta(\boldsymbol{k}) - \Theta(\boldsymbol{q})}_{\text{与 } m \text{ 无关的量}}

又因为左边完全不依赖 q、k(式 (8) 已确立 φ 只依赖于 m),所以右边虽然形式上含 q、k,实际值也必须是一个与 q、k 无关的常数——否则方程左右对不上。把这个常数设为 θ:

\varphi(m) - \varphi(m-1) = \theta \tag{9}

差分恒等于常数——这正是等差数列的定义!所以 φ(m) 必须是 m 的线性函数。

这块彻底看不懂了,以下是claude的分析:苏剑林在这里做的是一个典型的函数方程套路——当方程里同时含有"未知函数 φ(m)"和"参数依赖项 Θ_g(q, k, m−n)“时,通过特殊代入让参数依赖项变成常数,这样方程就退化为一个纯粹的差分方程,可以解出 φ 的形式。更具体地说,这套思路在数学上叫做"柯西函数方程"风格的求解:柯西方程 f(x+y) = f(x) + f(y) 的解就是线性函数 f(x) = cx,证明思路就是通过特殊代入逼出递推关系。RoPE 这里的推导本质上是同一类问题:有相对位置依赖的函数方程,通过相邻点代入降为递推,最后推出线性解。苏剑林作为一个对函数方程很熟悉的人(他博客里写过不少函数方程的文章),看到 φ(m) − φ(m−1) 这种结构会立刻反应过来"这是等差数列的特征”。所以代入 n = m − 1 不是偶然的灵感,而是经过训练的数学反射

解出等差数列
于是:

\varphi(m) = m\theta \tag{10}

(代入式 (6) 的初始条件 φ(0) = 0,因为位置 0 处没有相位增量。)

这一步揭示的深层必然性

停下来想想刚才发生了什么。我们没有假设 φ 是线性的,也没有"选择"线性形式——线性是被方程强行逼出来的。整个逼迫链条是:

  1. “位置编码与 token 内容无关”(从 RoPE 设计目标出发)
  2. → φ 只依赖 m,不依赖 q、k
  3. → φ(m) − φ(m−1) 的结果必须与 q、k 无关
  4. → 该差分必须是常数
  5. → φ 是等差数列
  6. → φ(m) = mθ

所以 RoPE 里相位随位置线性增长这个看似简单的性质,其实是整套设计哲学的数学必然结果。只要你接受"位置编码应该是 token 无关的全局属性"这个前提,线性就是唯一可能的形式。

代回 f 的定义,我们得到了二维 RoPE 的最终形式:

f(\boldsymbol{q}, m) = \|\boldsymbol{q}\|\,e^{i(\Theta(\boldsymbol{q}) + m\theta)} = \boldsymbol{q}\,e^{im\theta} \tag{11}

这正是第二节里通过直觉猜测的答案。至此,直觉被严格化、被验证——从一个朦胧的灵感变成了一个有完整数学支撑的方案。

写成矩阵形式(把 q 看成二维实向量 (q₀, q₁)):

f(\boldsymbol{q}, m) = \begin{pmatrix} \cos m\theta & -\sin m\theta \\ \sin m\theta & \cos m\theta \end{pmatrix} \begin{pmatrix} q_0 \\ q_1 \end{pmatrix} \tag{12}

这就是一个标准的二维旋转矩阵——所以叫 Rotary Position Embedding(旋转位置编码)

四、推广到高维:分块旋转

4.1 内积的"线性叠加性"

高维内积有一个平凡但关键的性质:d 维内积 = 各个二维子块内积之和
把 d 维向量两两分组,每组当成一个二维平面:

\langle \boldsymbol{u}, \boldsymbol{v} \rangle = \sum_{i=0}^{d/2-1} \langle \boldsymbol{u}^{(i)}, \boldsymbol{v}^{(i)} \rangle \tag{13}

由式 (13) 可知,二维 RoPE 可以无缝推广到高维:只要每一个二维块都满足"内积只依赖相对位置",那么整个高维内积也自动满足

4.2 高维 RoPE 的形式

把 d 维向量分成 d/2 个二维块,每块用一个独立的旋转角 θᵢ(类比式 (12) 的二维旋转矩阵),整个旋转矩阵就是块对角形式:

\mathcal{R}_m = \begin{pmatrix} \cos m\theta_0 & -\sin m\theta_0 & & & & \\ \sin m\theta_0 & \cos m\theta_0 & & & & \\ & & \cos m\theta_1 & -\sin m\theta_1 & & \\ & & \sin m\theta_1 & \cos m\theta_1 & & \\ & & & & \ddots & \\ & & & & & \cos m\theta_{d/2-1} & -\sin m\theta_{d/2-1} \\ & & & & & \sin m\theta_{d/2-1} & \cos m\theta_{d/2-1} \end{pmatrix}

直觉上:把高维空间想象成多个独立的二维平面,每个平面用自己的频率独立旋转,互不干扰。

4.3 高维 RoPE 的核心恒等式

给位置 m 的 query 乘 Rₘ,位置 n 的 key 乘 Rₙ,attention 分数:

(\mathcal{R}_m \boldsymbol{q})^\top (\mathcal{R}_n \boldsymbol{k}) = \boldsymbol{q}^\top \mathcal{R}_m^\top \mathcal{R}_n \boldsymbol{k} = \boldsymbol{q}^\top \mathcal{R}_{n-m} \boldsymbol{k} \tag{14}

最后一步用了两个性质:

正交矩阵转置等于逆:

\mathcal{R}_m^\top = \mathcal{R}_{-m}

(旋转 m 度的逆操作就是反向旋转 m 度)

旋转角度可加:

\mathcal{R}_a \mathcal{R}_b = \mathcal{R}_{a+b}

(连续两次旋转 = 一次性旋转角度之和)
合起来:

\mathcal{R}_m^\top \mathcal{R}_n = \mathcal{R}_{-m} \mathcal{R}_n = \mathcal{R}_{n-m}

绝对位置 m、n 在矩阵乘法中自动消去,只留下相对位置 n−m。式 (14) 就是苏剑林直觉中想要的复数性质式 (1)在高维矩阵语言里的对应。至此整个RoPE的推导已经完整。

4.4 RoPE 的工程优势

Rₘ 是正交矩阵 → 不改变向量模长(呼应式 (7) 的结论)。这是 RoPE 在工程上特别好用的关键:

  • 不会让 q、k 数值范围爆炸或衰减
  • 训练稳定性好
  • 不需要额外的归一化技巧

很多其他位置编码方案(比如简单地把位置向量加到 q、k 上)会改变模长分布导致训练不稳定。RoPE 用旋转——一个保模长的操作——天然避免了这个问题。

五、频率的选择:从 Sinusoidal 借来的智慧

5.1 为什么需要"多频率"

如果所有 θᵢ 都相等,那 RoPE 就只有一个频率,远距离和近距离的区分能力很弱。Sinusoidal 位置编码当年的设计是用多频率:

\theta_i = 10000^{-2i/d} \tag{15}

苏剑林直接借用了这个方案——这就是论文里说"博采众长"的另一层含义。

直觉上,多频率让 RoPE 能在多个尺度上同时编码位置:

  • 高频块(小 i):周期短,对近距离区分敏感
  • 低频块(大 i):周期长,对远距离也能保留信息

类似傅里叶变换的思想——用不同频率的正弦波叠加来表示复杂信号。

5.2 远程衰减性

苏剑林证明了这个频率方案能让 RoPE 拥有远程衰减性:

相对距离越大,attention 分数中的"位置编码贡献"在平均意义下越小。

为什么这是好性质:语言里的依赖关系大多是局部的,模型应该天然倾向于关注近处的 token。远程衰减相当于给模型一个局部性先验——不强制,但默认远处更弱。这符合语言建模的直觉。证明思路不写了看原文吧。

5.4 苏剑林的实验观察

苏剑林做过一个有趣的对照实验:把 θᵢ 当作可训练参数(用 Sinusoidal 公式初始化),训练一段时间后发现 θᵢ 几乎没怎么变。

这说明 Sinusoidal 的频率设计已经足够好,模型自己也学不出更好的方案,所以他干脆固定下来不训练了。

六、回顾:苏剑林思维路径的完整还原

  1. 出发点:线性 Attention 不兼容相对位置编码
  2. 渴望:形式上是绝对位置编码(兼容线性 Attention),效果上是相对位置编码
  3. 直觉:复数旋转天然让绝对位置变成相对位置
e^{im\theta} \cdot (e^{in\theta})^* = e^{i(m-n)\theta}
  1. 反推目标解
f(\boldsymbol{q}, m) = \boldsymbol{q} \cdot e^{im\theta}
  1. 为了让推导收敛到目标解,做三次"加强约束"
    • 加强 1:去掉 Re
      • 式 (3) 外层的 Re 会破坏复数相位结构(只剩 cos,丢失方向信息)
      • 去掉 Re 得到式 (4),保留完整复数形式,让目标解能从代数推导中"长出来"
    • 加强 2:设 f(q, 0) = q
      • 位置 0 不应该有编码(物理直觉)
      • 与目标解在 m=0 处自洽
    • 加强 3:要求 φ(m) 的步长与 q、k 无关
      • 位置编码频率必须是模型固定属性,不能让每对 token 各自有频率
      • 这个约束显式逼出 φ(m) 的线性形式
  2. 函数方程经典技巧
    • 代入 m = n:消去相对位置维度,钉住 g 的边界
    • 代入 n = m − 1:把方程降为差分,逼出等差数列
  3. 解出
\varphi(m) = m\theta
  1. 得到二维 RoPE
f(\boldsymbol{q}, m) = \boldsymbol{q} \cdot e^{im\theta}
  1. 推广到高维:利用内积的分块可加性,d/2 个独立二维平面拼接
  2. 借鉴 Sinusoidal 的频率设计(多频率 + 远程衰减):
\theta_i = 10000^{-2i/d}
  1. 完整的高维 RoPE 诞生

引用

苏剑林. (Mar. 23, 2021). 《Transformer 升级之路:2、博采众长的旋转式位置编码》[Blog post]. https://spaces.ac.cn/archives/8265
苏剑林. (Feb. 03, 2021). 《让研究人员绞尽脑汁的 Transformer 位置编码》[Blog post]. https://spaces.ac.cn/archives/8130
Su, J., Lu, Y., Pan, S., Wen, B., & Liu, Y. (2021). RoFormer: Enhanced Transformer with Rotary Position Embedding. arXiv:2104.09864.


我的感悟

太难了,这么多的数学推导已经给我看懵了,没claude我根本看不下来。这波属于是我和claude合砍80分。感觉记住旋转位置编码等于用绝对位置编码的方式实现相对位置编码的效果应该就差不多了吧

网友解答:
--【壹】--:

LLM & Agent 每日论文阅读计划-D2


碎碎念

今天来补昨天看DeepSeekV2论文留下的其中之一个坑:旋转位置编码(Rotary Position Embedding,RoPE),话说这个不应该叫旋转位置嵌入吗?由于原文涉及到致死量的数学公式,今天花了大量时间拷打claude进行公式理解。(╯-_-)╯╧╧ 方便起见我只阅读了博客。细节阅读部分还是有很多数学公式,因此如果不想看公式的话就看TL;DR,细节阅读的开头结尾和我的感悟就行´͈ ᵕ `͈


今日阅读论文

  • 标题:ROFORMER: ENHANCED TRANSFORMER WITH ROTARY POSITION EMBEDDING
  • 作者单位:苏剑林,追一科技
  • 链接:arxiv | 博客
  • 发表venue:arxiv
  • 年份:2021.4

ps:苏剑林苏神是月之暗面(KIMI AI)的研究员和知名中文 NLP 技术博主,最广为人知的贡献是提出了旋转位置编码 RoPE——目前几乎所有主流大模型(LLaMA、Qwen、DeepSeek、Kimi 等)都采用的位置编码方法。苏神本人也是我的学习目标之一,可惜我的数学实在是太拉了,但凡我有苏神一半的数学水平。。他有个非常知名的博客网页:科学空间


TL;DR

旋转位置编码就是用绝对位置编码的方式实现相对位置编码的效果。从而同时获得绝对位置编码的简单实现和对线性注意力的适配性,以及相对位置编码的更好的性能。


细节阅读:

下面内容企图以一个数学小白的视角猜测和理解苏神当年是怎么想到思路、推导和最终发明旋转位置编码的过程,这不是严格推导的,而是一次基于猜测的"逆向工程"——把 RoPE 论文里那些"为简单起见"和"显然可以"背后藏着的研究思路还原出来。通过猜测和还原苏剑林的真实思考过程,你会发现 RoPE 不是凭空蹦出来的天才之作,而是数学和技术积累+直觉+工程实践的精心组合。

一、问题的起点:一个工程上的痛点

1.1 当时的位置编码格局(2020-2021)

由于Transformers的计算特性,它不像RNN这些架构一次处理一个token,而是并行处理,因此必须显式注入位置信息,让模型分清楚token的先后位置顺序。

*一个不恰当的比喻,就像现在工业化养殖肉猪,一次出栏很多猪,因此养猪场猪出栏的时候要给猪盖章证明检疫合格和出栏时间,从而分清楚哪头猪是哪头,免得出问题了找不到对应的厂家,但是盖这个印章的墨水又不能影响到食用:

绝对位置编码:把位置向量加到输入 token 上

x_k + p_k
  • 代表:BERT 的可训练式、Vaswani 的 Sinusoidal 三角式(来源于transformer经典老番 Attention is all your need)
  • 优点:实现简单,直接加在输入上
  • 缺点:泛化能力弱,长度外推差

相对位置编码:在 attention 计算里直接注入相对距离

i - j
  • 代表:T5、DeBERTa、XLNet
  • 优点:效果普遍更好,因为语言关系本质上是相对的
  • 缺点:必须修改 attention 的计算结构,不适用于线性注意力

1.2 苏剑林真正在意的痛点

苏剑林当时在研究线性 Attention(Performer、Linear Transformer 等)。这类方法依赖可分解形式:

\text{softmax}(QK^\top) \approx \phi(Q)\phi(K)^\top

从而把 attention 复杂度从 O(n²) 降到 O(n)。

问题来了:所有相对位置编码方案都修改了 attention 的内部结构,因此都和线性 Attention 不兼容。而苏剑林想的是

有没有一种位置编码,既能像绝对位置编码那样直接加在 q、k 上(保持线性 Attention 兼容,又能在后续注意力矩阵的内积计算中自动产生相对位置效果(保持效果)

也就是"将绝对位置编码与相对位置编码融于一体"。

二、灵感的火花:复数旋转的天然性质

2.1 关键观察

苏剑林由于是数学出身,同时作为博客作者写过大量复数与几何的科普,因此具有对数学性质的专业性的敏感,对通过"两个绝对位置经过相乘转换成相对位置"这个要求,他马上联想到了复数旋转的性质。具体讲,他注意到一个等式:

e^{im\theta} \cdot (e^{in\theta})^* = e^{i(m-n)\theta} \tag{1}

这个等式在数学上极其平凡,但用到位置编码上简直是天作之合:两个绝对位置 m、n 经过复数乘共轭后,自然地"折叠"成了相对位置 m−n,不需要任何额外操作,完全是复数代数本身的性质。

2.2 复数与实向量内积的桥梁

由于注意力矩阵计算本质上其实就是多个向量内积,而苏剑林想要引入复数的性质,于是开始推导:

\langle \boldsymbol{q}, \boldsymbol{k} \rangle = \text{Re}[\boldsymbol{q}\,\boldsymbol{k}^*] \tag{2}

这就是连接实向量内积和复数的桥梁。二维实向量的内积等于把它们看作复数后,一个乘以另一个共轭再取实部。

这两个等式一拼接,灵魂时刻就到了:

只要把位置信息编码成"乘以一个单位复数"的形式(注入是绝对的),那么 q 和 k 做内积时,相位会自动相减(效果是相对的)

这就是 RoPE 的全部直觉。剩下的所有数学推导,都是在严格化这个直觉、把它从二维推广到高维、并验证它的工程可行性。

2.3 复数乘法的几何本质(理解相位相减的关键)

为了把相位相减这件事看清楚,需要理解复数乘法的几何意义:

复数乘法 = 旋转 + 缩放

设两个复数:

z_1 = r_1 e^{i\theta_1}, \quad z_2 = r_2 e^{i\theta_2}

它们相乘:

z_1 \cdot z_2 = r_1 r_2 \cdot e^{i(\theta_1 + \theta_2)}

模长相乘、相位相加。这是因为欧拉公式加上三角函数和角公式自然得到的:

e^{i\theta} = \cos\theta + i\sin\theta

乘以共轭就是反向旋转:

w^* = re^{-i\theta}

所以:

z_1 \cdot z_2^* = r_1 r_2 \cdot e^{i(\theta_1 - \theta_2)}

相位变成了

直觉版本:乘以一个复数 = 按它的角度逆时针转;乘以它的共轭 = 按它的角度顺时针转。所以 z₁·z₂* 的相位就是 z₁ 和 z₂ 的"夹角"——这正是我们想要的"相对位置"。

三、严格化:把直觉变成数学推导

3.1 问题建模

到这一步,苏剑林手里已经有了一个清晰的直觉——位置信息应该通过"乘一个单位复数"的形式注入,也就是它应该是一种乘性位置编码。但直觉不是推导,要把这个想法落实成一个严格的 RoPE 方案,必须先把问题形式化。

先定义未知函数

我们想要的是一个"位置编码函数",它能把一个 token 向量和它所在的位置合成一个新的、带位置信息的向量。记这个函数为 f。对于位于位置 m 的 query 向量 q,位置编码后的结果是:

f(\boldsymbol{q}, m)

对于位于位置 n 的 key 向量 k,位置编码后的结果是:

f(\boldsymbol{k}, n)

这里要强调一下 f 的输入含义:第一个参数是原始 token 向量本身(q 或 k),第二个参数是它在序列中的位置索引(m 或 n)。函数的输出是"注入了位置信息之后的新向量"。这就是 RoPE 要设计的对象——一旦解出 f 的具体形式,整套方案就成了。

预期的答案形态

虽然 f 还是未知的,但苏剑林心里已经有目标了。根据第二节的直觉——位置信息应该表现为"单位复数相乘"——他预期 f 最终会长成类似下面这种形式:

f(\boldsymbol{q}, m) \sim \boldsymbol{q} \cdot e^{im\theta}

也就是"原始向量乘上一个随位置 m 旋转的复数"。这种位置信息编码最好还是单位复数,这样两个绝对位置相乘共轭后会自动留下相对位置,还不会改变q和k的平均值——这正是我们要的性质。

但目前这只是一个有待验证的猜测,不是严格结论。接下来几节要做的事情就是:从 f 满足的方程出发,通过一系列代数操作和约束强化,严格地推导出 f 必须长成上面这种形式。换句话说,我们要让f的形式从方程里自己"长"出来,而不是假设它。

写下核心约束
我们希望这个 f 有什么性质?回忆 RoPE 的设计目标:形式上是绝对位置编码(f 只依赖绝对位置 m),效果上是相对位置编码(做 attention 内积时只依赖 m−n)
翻译成数学语言:我们希望 f(q, m) 和 f(k, n) 做内积后的结果,只依赖 m−n 而不依赖 m 和 n 各自的具体值。把这个"结果"记作 g,它是一个以 q、k 和相对位置 m−n 为参数的函数。结合前面讲过的桥梁等式 (2),可以写出:

\text{Re}[f(\boldsymbol{q},m)\,f^*(\boldsymbol{k},n)] = g(\boldsymbol{q},\boldsymbol{k},m-n) \tag{3}

左边是"把位置编码后的 q、k 当成复数做乘共轭取实部"——也就是它们作为位置编码后向量的内积。右边是一个抽象函数 g,它的第三个参数是相对位置 m−n,代表"不管 m、n 各是多少,只要 m−n 相同,这个值就相同"。

这是个函数方程

注意这里的未知量是函数 f 本身,不是某个数。我们要解出的是"f 应该长什么样,才能让上面的等式对任意 q、k、m、n 都成立"。这类以函数为未知量的方程叫作函数方程,在数学上有一套专门的求解技巧(特殊值代入、递推、寻找不变量等),后面会反复用到。

分析:在建模和推导前,苏剑林其实通过直觉已经知道答案的轮廓,建模和推导只是为了用方程的代数结构把直觉严格化,同时验证它是方程的合理解。

3.2 解方程

步骤1:加强约束,从实数到复数

直接解式 (3) 行不通: f 外面的 Re 把复数压成实数,会破坏掉相位结构。具体说:

e^{im\theta} = \cos(m\theta) + i\sin(m\theta)

如果取实部,就只剩 cos(mθ)。但 cos 是偶函数,无法区分 m 和 −m,方向感丢失,更重要的是再也没有"复数乘法 = 相位相加"那个漂亮的代数性质了。

苏剑林的对策:主动加强约束,把式 (3) 变成:

f(\boldsymbol{q},m)\,f^*(\boldsymbol{k},n) = g(\boldsymbol{q},\boldsymbol{k},m-n) \tag{4}

去掉 Re,要求整个复数相等,不只是实部。

分析:这一步其实是有的可循的。原方程f外面的 Re 把复数压成实数,会破坏掉相位结构,也破坏了"复数乘法 = 相位相加"那个关键的代数性质。苏剑林意识到,想要从方程里解出"旋转复数"形式的答案,就必须保留相位信息。所以他主动去掉了Re,把约束加强为复数等式。这步不是逻辑必然,而是"为了让答案能浮现出来"所做的方法论选择。
用一个比喻:Re 就像把彩色照片印成黑白。你要研究照片里的"蓝色",就必须在彩色阶段研究;如果一上来就把照片印成黑白,“蓝色"这个概念就消失了,你再怎么推导也不可能从黑白照片里还原出蓝色。但等你研究清楚了"蓝色物体长什么样”,最后再印成黑白也无所谓——你只是不展示颜色,但它确实存在过。

因此,我们继续,将 f 写成复数的指数形式:

f(\boldsymbol{q},m) = R_f(\boldsymbol{q},m)\,e^{i\Theta_f(\boldsymbol{q},m)}

代入式 (4),拆成两部分:

R_f(\boldsymbol{q},m)\,R_f(\boldsymbol{k},n) = R_g(\boldsymbol{q},\boldsymbol{k},m-n) \tag{5a} \Theta_f(\boldsymbol{q},m) - \Theta_f(\boldsymbol{k},n) = \Theta_g(\boldsymbol{q},\boldsymbol{k},m-n) \tag{5b}

现在我们要解式 (5a)、(5b) 这两个方程。但它们都含有 q、k、m、n 四个变量,直接硬解不可能——必须”消元”。

步骤2:代入特殊点 m = n

直觉和动机分析:其实就是通过代入特殊解和边界条件条件求解方程。回到 RoPE 的物理含义想一想:当两个 token 恰好在同一个位置时(也就是 m = n)会发生什么?按照相对位置编码的理论,m=n 对应"两个 token 在同一个位置"的情形,这时候不应该有任何位置编码的影响——它就应该退化为普通的、不带位置的内积 ⟨q,k⟩。这是一个物理意义上必须成立的边界条件,不是凭空假设的。

把 m = n 代入式 (5a) 和 (5b),右边的第三个参数变成 0:

R_f(\boldsymbol{q},m)\,R_f(\boldsymbol{k},m) = R_g(\boldsymbol{q},\boldsymbol{k},0) \tag{5a'} \Theta_f(\boldsymbol{q},m) - \Theta_f(\boldsymbol{k},m) = \Theta_g(\boldsymbol{q},\boldsymbol{k},0) \tag{5b'}

g(q, k, 0) 退化成了只依赖 q、k 的函数。但它具体等于什么?还需要一个初始条件。

直觉和动机分析:

  1. 苏剑林知道答案应该是"q 乘以一个旋转因子"的形式。当位置 m = 0 时,旋转因子退化为 1(旋转 0 度 = 不旋转),所以 f(q, 0) 自然就等于 q 本身。这个边界条件和目标解是完全自洽的。
  2. 更直接的理由:序列的第 0 个位置是"起点",它不应该被加入任何位置信息,不应该被变换,就是 token 本身。换句话说:
f(\boldsymbol{q}, 0) = \boldsymbol{q} \tag{6}

这个约定的物理含义是"原点不加入位置信息",数学上也和预期答案自洽(m=0 时 e⁰ = 1,正好退化为 q)。

联合式 (5a’)、(5b’) 与式 (6) 求解

由式 (6)(同理 f(k, 0) = k),可以算出 g(q, k, 0) 的模长和相位:

R_g(\boldsymbol{q},\boldsymbol{k},0) = \|\boldsymbol{q}\|\,\|\boldsymbol{k}\| \tag{6a} \Theta_g(\boldsymbol{q},\boldsymbol{k},0) = \Theta(\boldsymbol{q}) - \Theta(\boldsymbol{k}) \tag{6b}

模长部分:将式 (6a) 回代进式 (5a’),推出:

R_f(\boldsymbol{q}, m) = \|\boldsymbol{q}\| \tag{7}

也就是说,位置编码函数 f 不改变向量的模长——它只作用在"方向/相位"这个维度上。这正好对应前面复数直觉里说的"单位复数相乘"——单位复数模长为 1,乘上去只会旋转,不会拉伸。

相位部分:将式 (6b) 回代进式 (5b’),得到:

\Theta_f(\boldsymbol{q},m) - \Theta_f(\boldsymbol{k},m) = \Theta(\boldsymbol{q}) - \Theta(\boldsymbol{k})

移项整理:

\Theta_f(\boldsymbol{q},m) - \Theta(\boldsymbol{q}) = \Theta_f(\boldsymbol{k},m) - \Theta(\boldsymbol{k})

等号左边只含 q 和 m,右边只含 k 和 m。但 q 和 k 是任意的——这意味着两边必须都等于一个只与 m 有关、与 q/k 无关的函数。这一性质符合位置编码的物理意义:位置编码只与位置信息有关,与 token 内容无关。记这个函数为 φ(m),就得到:

\Theta_f(\boldsymbol{q}, m) = \Theta(\boldsymbol{q}) + \varphi(m) \tag{8}

其中 φ(m) 是一个只依赖于位置 m、与 q 本身完全无关的函数。这个形式的含义是:位置 m 处的 q 的相位 = q 本身的相位 + 一个由位置决定的"相位增量"。

这一步隐藏着 RoPE 最核心的设计哲学:位置信息只通过"相位增量"注入,并且这个增量必须与 token 内容无关——也就是说,无论你处理的token是"猫"还是"狗",只要它在位置 m,它吃到的位置编码即"相位增量"就是同一个 φ(m)。这是位置编码作为"模型架构固定属性"的基本要求,否则每对 token 都有自己的位置编码方式,整个模型就乱套了。

步骤3:代入特殊点 n = m−1 解出 φ

现在模长问题解决了,只剩下一个未知函数 φ(m) 需要确定。我们知道它只依赖于 m,但还不知道它的具体形式——它可能是线性的 mθ、二次的 m²θ、对数的 log(m)、甚至是某种乱七八糟的函数。

苏剑林现在要问:φ(m) 的具体形式能从方程里推出来吗?

把式 (8) 回代到式 (5b):

\varphi(m) - \varphi(n) + \Theta(\boldsymbol{q}) - \Theta(\boldsymbol{k}) = \Theta_g(\boldsymbol{q}, \boldsymbol{k}, m-n)

这个方程里 m、n 都是自由变量,仍然复杂。

为什么要代入 n = m − 1

代入 n = m − 1 后,相对位置变成 m − (m−1) = 1,是一个常数。这样做之后,方程右边不再依赖 m!整个右边只剩下 q、k 和常数 1,是个与 m 无关的量。而左边 φ(m) − φ(m−1) 是关于 m 的差分。所以方程的本质变成了:

\underbrace{\varphi(m) - \varphi(m-1)}_{\text{某个关于 } m \text{ 的差分}} = \underbrace{\Theta_g(\boldsymbol{q}, \boldsymbol{k}, 1) + \Theta(\boldsymbol{k}) - \Theta(\boldsymbol{q})}_{\text{与 } m \text{ 无关的量}}

又因为左边完全不依赖 q、k(式 (8) 已确立 φ 只依赖于 m),所以右边虽然形式上含 q、k,实际值也必须是一个与 q、k 无关的常数——否则方程左右对不上。把这个常数设为 θ:

\varphi(m) - \varphi(m-1) = \theta \tag{9}

差分恒等于常数——这正是等差数列的定义!所以 φ(m) 必须是 m 的线性函数。

这块彻底看不懂了,以下是claude的分析:苏剑林在这里做的是一个典型的函数方程套路——当方程里同时含有"未知函数 φ(m)"和"参数依赖项 Θ_g(q, k, m−n)“时,通过特殊代入让参数依赖项变成常数,这样方程就退化为一个纯粹的差分方程,可以解出 φ 的形式。更具体地说,这套思路在数学上叫做"柯西函数方程"风格的求解:柯西方程 f(x+y) = f(x) + f(y) 的解就是线性函数 f(x) = cx,证明思路就是通过特殊代入逼出递推关系。RoPE 这里的推导本质上是同一类问题:有相对位置依赖的函数方程,通过相邻点代入降为递推,最后推出线性解。苏剑林作为一个对函数方程很熟悉的人(他博客里写过不少函数方程的文章),看到 φ(m) − φ(m−1) 这种结构会立刻反应过来"这是等差数列的特征”。所以代入 n = m − 1 不是偶然的灵感,而是经过训练的数学反射

解出等差数列
于是:

\varphi(m) = m\theta \tag{10}

(代入式 (6) 的初始条件 φ(0) = 0,因为位置 0 处没有相位增量。)

这一步揭示的深层必然性

停下来想想刚才发生了什么。我们没有假设 φ 是线性的,也没有"选择"线性形式——线性是被方程强行逼出来的。整个逼迫链条是:

  1. “位置编码与 token 内容无关”(从 RoPE 设计目标出发)
  2. → φ 只依赖 m,不依赖 q、k
  3. → φ(m) − φ(m−1) 的结果必须与 q、k 无关
  4. → 该差分必须是常数
  5. → φ 是等差数列
  6. → φ(m) = mθ

所以 RoPE 里相位随位置线性增长这个看似简单的性质,其实是整套设计哲学的数学必然结果。只要你接受"位置编码应该是 token 无关的全局属性"这个前提,线性就是唯一可能的形式。

代回 f 的定义,我们得到了二维 RoPE 的最终形式:

f(\boldsymbol{q}, m) = \|\boldsymbol{q}\|\,e^{i(\Theta(\boldsymbol{q}) + m\theta)} = \boldsymbol{q}\,e^{im\theta} \tag{11}

这正是第二节里通过直觉猜测的答案。至此,直觉被严格化、被验证——从一个朦胧的灵感变成了一个有完整数学支撑的方案。

写成矩阵形式(把 q 看成二维实向量 (q₀, q₁)):

f(\boldsymbol{q}, m) = \begin{pmatrix} \cos m\theta & -\sin m\theta \\ \sin m\theta & \cos m\theta \end{pmatrix} \begin{pmatrix} q_0 \\ q_1 \end{pmatrix} \tag{12}

这就是一个标准的二维旋转矩阵——所以叫 Rotary Position Embedding(旋转位置编码)

四、推广到高维:分块旋转

4.1 内积的"线性叠加性"

高维内积有一个平凡但关键的性质:d 维内积 = 各个二维子块内积之和
把 d 维向量两两分组,每组当成一个二维平面:

\langle \boldsymbol{u}, \boldsymbol{v} \rangle = \sum_{i=0}^{d/2-1} \langle \boldsymbol{u}^{(i)}, \boldsymbol{v}^{(i)} \rangle \tag{13}

由式 (13) 可知,二维 RoPE 可以无缝推广到高维:只要每一个二维块都满足"内积只依赖相对位置",那么整个高维内积也自动满足

4.2 高维 RoPE 的形式

把 d 维向量分成 d/2 个二维块,每块用一个独立的旋转角 θᵢ(类比式 (12) 的二维旋转矩阵),整个旋转矩阵就是块对角形式:

\mathcal{R}_m = \begin{pmatrix} \cos m\theta_0 & -\sin m\theta_0 & & & & \\ \sin m\theta_0 & \cos m\theta_0 & & & & \\ & & \cos m\theta_1 & -\sin m\theta_1 & & \\ & & \sin m\theta_1 & \cos m\theta_1 & & \\ & & & & \ddots & \\ & & & & & \cos m\theta_{d/2-1} & -\sin m\theta_{d/2-1} \\ & & & & & \sin m\theta_{d/2-1} & \cos m\theta_{d/2-1} \end{pmatrix}

直觉上:把高维空间想象成多个独立的二维平面,每个平面用自己的频率独立旋转,互不干扰。

4.3 高维 RoPE 的核心恒等式

给位置 m 的 query 乘 Rₘ,位置 n 的 key 乘 Rₙ,attention 分数:

(\mathcal{R}_m \boldsymbol{q})^\top (\mathcal{R}_n \boldsymbol{k}) = \boldsymbol{q}^\top \mathcal{R}_m^\top \mathcal{R}_n \boldsymbol{k} = \boldsymbol{q}^\top \mathcal{R}_{n-m} \boldsymbol{k} \tag{14}

最后一步用了两个性质:

正交矩阵转置等于逆:

\mathcal{R}_m^\top = \mathcal{R}_{-m}

(旋转 m 度的逆操作就是反向旋转 m 度)

旋转角度可加:

\mathcal{R}_a \mathcal{R}_b = \mathcal{R}_{a+b}

(连续两次旋转 = 一次性旋转角度之和)
合起来:

\mathcal{R}_m^\top \mathcal{R}_n = \mathcal{R}_{-m} \mathcal{R}_n = \mathcal{R}_{n-m}

绝对位置 m、n 在矩阵乘法中自动消去,只留下相对位置 n−m。式 (14) 就是苏剑林直觉中想要的复数性质式 (1)在高维矩阵语言里的对应。至此整个RoPE的推导已经完整。

4.4 RoPE 的工程优势

Rₘ 是正交矩阵 → 不改变向量模长(呼应式 (7) 的结论)。这是 RoPE 在工程上特别好用的关键:

  • 不会让 q、k 数值范围爆炸或衰减
  • 训练稳定性好
  • 不需要额外的归一化技巧

很多其他位置编码方案(比如简单地把位置向量加到 q、k 上)会改变模长分布导致训练不稳定。RoPE 用旋转——一个保模长的操作——天然避免了这个问题。

五、频率的选择:从 Sinusoidal 借来的智慧

5.1 为什么需要"多频率"

如果所有 θᵢ 都相等,那 RoPE 就只有一个频率,远距离和近距离的区分能力很弱。Sinusoidal 位置编码当年的设计是用多频率:

\theta_i = 10000^{-2i/d} \tag{15}

苏剑林直接借用了这个方案——这就是论文里说"博采众长"的另一层含义。

直觉上,多频率让 RoPE 能在多个尺度上同时编码位置:

  • 高频块(小 i):周期短,对近距离区分敏感
  • 低频块(大 i):周期长,对远距离也能保留信息

类似傅里叶变换的思想——用不同频率的正弦波叠加来表示复杂信号。

5.2 远程衰减性

苏剑林证明了这个频率方案能让 RoPE 拥有远程衰减性:

相对距离越大,attention 分数中的"位置编码贡献"在平均意义下越小。

为什么这是好性质:语言里的依赖关系大多是局部的,模型应该天然倾向于关注近处的 token。远程衰减相当于给模型一个局部性先验——不强制,但默认远处更弱。这符合语言建模的直觉。证明思路不写了看原文吧。

5.4 苏剑林的实验观察

苏剑林做过一个有趣的对照实验:把 θᵢ 当作可训练参数(用 Sinusoidal 公式初始化),训练一段时间后发现 θᵢ 几乎没怎么变。

这说明 Sinusoidal 的频率设计已经足够好,模型自己也学不出更好的方案,所以他干脆固定下来不训练了。

六、回顾:苏剑林思维路径的完整还原

  1. 出发点:线性 Attention 不兼容相对位置编码
  2. 渴望:形式上是绝对位置编码(兼容线性 Attention),效果上是相对位置编码
  3. 直觉:复数旋转天然让绝对位置变成相对位置
e^{im\theta} \cdot (e^{in\theta})^* = e^{i(m-n)\theta}
  1. 反推目标解
f(\boldsymbol{q}, m) = \boldsymbol{q} \cdot e^{im\theta}
  1. 为了让推导收敛到目标解,做三次"加强约束"
    • 加强 1:去掉 Re
      • 式 (3) 外层的 Re 会破坏复数相位结构(只剩 cos,丢失方向信息)
      • 去掉 Re 得到式 (4),保留完整复数形式,让目标解能从代数推导中"长出来"
    • 加强 2:设 f(q, 0) = q
      • 位置 0 不应该有编码(物理直觉)
      • 与目标解在 m=0 处自洽
    • 加强 3:要求 φ(m) 的步长与 q、k 无关
      • 位置编码频率必须是模型固定属性,不能让每对 token 各自有频率
      • 这个约束显式逼出 φ(m) 的线性形式
  2. 函数方程经典技巧
    • 代入 m = n:消去相对位置维度,钉住 g 的边界
    • 代入 n = m − 1:把方程降为差分,逼出等差数列
  3. 解出
\varphi(m) = m\theta
  1. 得到二维 RoPE
f(\boldsymbol{q}, m) = \boldsymbol{q} \cdot e^{im\theta}
  1. 推广到高维:利用内积的分块可加性,d/2 个独立二维平面拼接
  2. 借鉴 Sinusoidal 的频率设计(多频率 + 远程衰减):
\theta_i = 10000^{-2i/d}
  1. 完整的高维 RoPE 诞生

引用

苏剑林. (Mar. 23, 2021). 《Transformer 升级之路:2、博采众长的旋转式位置编码》[Blog post]. https://spaces.ac.cn/archives/8265
苏剑林. (Feb. 03, 2021). 《让研究人员绞尽脑汁的 Transformer 位置编码》[Blog post]. https://spaces.ac.cn/archives/8130
Su, J., Lu, Y., Pan, S., Wen, B., & Liu, Y. (2021). RoFormer: Enhanced Transformer with Rotary Position Embedding. arXiv:2104.09864.


我的感悟

太难了,这么多的数学推导已经给我看懵了,没claude我根本看不下来。这波属于是我和claude合砍80分。感觉记住旋转位置编码等于用绝对位置编码的方式实现相对位置编码的效果应该就差不多了吧

问题描述:

LLM & Agent 每日论文阅读计划-D2


碎碎念

今天来补昨天看DeepSeekV2论文留下的其中之一个坑:旋转位置编码(Rotary Position Embedding,RoPE),话说这个不应该叫旋转位置嵌入吗?由于原文涉及到致死量的数学公式,今天花了大量时间拷打claude进行公式理解。(╯-_-)╯╧╧ 方便起见我只阅读了博客。细节阅读部分还是有很多数学公式,因此如果不想看公式的话就看TL;DR,细节阅读的开头结尾和我的感悟就行´͈ ᵕ `͈


今日阅读论文

  • 标题:ROFORMER: ENHANCED TRANSFORMER WITH ROTARY POSITION EMBEDDING
  • 作者单位:苏剑林,追一科技
  • 链接:arxiv | 博客
  • 发表venue:arxiv
  • 年份:2021.4

ps:苏剑林苏神是月之暗面(KIMI AI)的研究员和知名中文 NLP 技术博主,最广为人知的贡献是提出了旋转位置编码 RoPE——目前几乎所有主流大模型(LLaMA、Qwen、DeepSeek、Kimi 等)都采用的位置编码方法。苏神本人也是我的学习目标之一,可惜我的数学实在是太拉了,但凡我有苏神一半的数学水平。。他有个非常知名的博客网页:科学空间


TL;DR

旋转位置编码就是用绝对位置编码的方式实现相对位置编码的效果。从而同时获得绝对位置编码的简单实现和对线性注意力的适配性,以及相对位置编码的更好的性能。


细节阅读:

下面内容企图以一个数学小白的视角猜测和理解苏神当年是怎么想到思路、推导和最终发明旋转位置编码的过程,这不是严格推导的,而是一次基于猜测的"逆向工程"——把 RoPE 论文里那些"为简单起见"和"显然可以"背后藏着的研究思路还原出来。通过猜测和还原苏剑林的真实思考过程,你会发现 RoPE 不是凭空蹦出来的天才之作,而是数学和技术积累+直觉+工程实践的精心组合。

一、问题的起点:一个工程上的痛点

1.1 当时的位置编码格局(2020-2021)

由于Transformers的计算特性,它不像RNN这些架构一次处理一个token,而是并行处理,因此必须显式注入位置信息,让模型分清楚token的先后位置顺序。

*一个不恰当的比喻,就像现在工业化养殖肉猪,一次出栏很多猪,因此养猪场猪出栏的时候要给猪盖章证明检疫合格和出栏时间,从而分清楚哪头猪是哪头,免得出问题了找不到对应的厂家,但是盖这个印章的墨水又不能影响到食用:

绝对位置编码:把位置向量加到输入 token 上

x_k + p_k
  • 代表:BERT 的可训练式、Vaswani 的 Sinusoidal 三角式(来源于transformer经典老番 Attention is all your need)
  • 优点:实现简单,直接加在输入上
  • 缺点:泛化能力弱,长度外推差

相对位置编码:在 attention 计算里直接注入相对距离

i - j
  • 代表:T5、DeBERTa、XLNet
  • 优点:效果普遍更好,因为语言关系本质上是相对的
  • 缺点:必须修改 attention 的计算结构,不适用于线性注意力

1.2 苏剑林真正在意的痛点

苏剑林当时在研究线性 Attention(Performer、Linear Transformer 等)。这类方法依赖可分解形式:

\text{softmax}(QK^\top) \approx \phi(Q)\phi(K)^\top

从而把 attention 复杂度从 O(n²) 降到 O(n)。

问题来了:所有相对位置编码方案都修改了 attention 的内部结构,因此都和线性 Attention 不兼容。而苏剑林想的是

有没有一种位置编码,既能像绝对位置编码那样直接加在 q、k 上(保持线性 Attention 兼容,又能在后续注意力矩阵的内积计算中自动产生相对位置效果(保持效果)

也就是"将绝对位置编码与相对位置编码融于一体"。

二、灵感的火花:复数旋转的天然性质

2.1 关键观察

苏剑林由于是数学出身,同时作为博客作者写过大量复数与几何的科普,因此具有对数学性质的专业性的敏感,对通过"两个绝对位置经过相乘转换成相对位置"这个要求,他马上联想到了复数旋转的性质。具体讲,他注意到一个等式:

e^{im\theta} \cdot (e^{in\theta})^* = e^{i(m-n)\theta} \tag{1}

这个等式在数学上极其平凡,但用到位置编码上简直是天作之合:两个绝对位置 m、n 经过复数乘共轭后,自然地"折叠"成了相对位置 m−n,不需要任何额外操作,完全是复数代数本身的性质。

2.2 复数与实向量内积的桥梁

由于注意力矩阵计算本质上其实就是多个向量内积,而苏剑林想要引入复数的性质,于是开始推导:

\langle \boldsymbol{q}, \boldsymbol{k} \rangle = \text{Re}[\boldsymbol{q}\,\boldsymbol{k}^*] \tag{2}

这就是连接实向量内积和复数的桥梁。二维实向量的内积等于把它们看作复数后,一个乘以另一个共轭再取实部。

这两个等式一拼接,灵魂时刻就到了:

只要把位置信息编码成"乘以一个单位复数"的形式(注入是绝对的),那么 q 和 k 做内积时,相位会自动相减(效果是相对的)

这就是 RoPE 的全部直觉。剩下的所有数学推导,都是在严格化这个直觉、把它从二维推广到高维、并验证它的工程可行性。

2.3 复数乘法的几何本质(理解相位相减的关键)

为了把相位相减这件事看清楚,需要理解复数乘法的几何意义:

复数乘法 = 旋转 + 缩放

设两个复数:

z_1 = r_1 e^{i\theta_1}, \quad z_2 = r_2 e^{i\theta_2}

它们相乘:

z_1 \cdot z_2 = r_1 r_2 \cdot e^{i(\theta_1 + \theta_2)}

模长相乘、相位相加。这是因为欧拉公式加上三角函数和角公式自然得到的:

e^{i\theta} = \cos\theta + i\sin\theta

乘以共轭就是反向旋转:

w^* = re^{-i\theta}

所以:

z_1 \cdot z_2^* = r_1 r_2 \cdot e^{i(\theta_1 - \theta_2)}

相位变成了

直觉版本:乘以一个复数 = 按它的角度逆时针转;乘以它的共轭 = 按它的角度顺时针转。所以 z₁·z₂* 的相位就是 z₁ 和 z₂ 的"夹角"——这正是我们想要的"相对位置"。

三、严格化:把直觉变成数学推导

3.1 问题建模

到这一步,苏剑林手里已经有了一个清晰的直觉——位置信息应该通过"乘一个单位复数"的形式注入,也就是它应该是一种乘性位置编码。但直觉不是推导,要把这个想法落实成一个严格的 RoPE 方案,必须先把问题形式化。

先定义未知函数

我们想要的是一个"位置编码函数",它能把一个 token 向量和它所在的位置合成一个新的、带位置信息的向量。记这个函数为 f。对于位于位置 m 的 query 向量 q,位置编码后的结果是:

f(\boldsymbol{q}, m)

对于位于位置 n 的 key 向量 k,位置编码后的结果是:

f(\boldsymbol{k}, n)

这里要强调一下 f 的输入含义:第一个参数是原始 token 向量本身(q 或 k),第二个参数是它在序列中的位置索引(m 或 n)。函数的输出是"注入了位置信息之后的新向量"。这就是 RoPE 要设计的对象——一旦解出 f 的具体形式,整套方案就成了。

预期的答案形态

虽然 f 还是未知的,但苏剑林心里已经有目标了。根据第二节的直觉——位置信息应该表现为"单位复数相乘"——他预期 f 最终会长成类似下面这种形式:

f(\boldsymbol{q}, m) \sim \boldsymbol{q} \cdot e^{im\theta}

也就是"原始向量乘上一个随位置 m 旋转的复数"。这种位置信息编码最好还是单位复数,这样两个绝对位置相乘共轭后会自动留下相对位置,还不会改变q和k的平均值——这正是我们要的性质。

但目前这只是一个有待验证的猜测,不是严格结论。接下来几节要做的事情就是:从 f 满足的方程出发,通过一系列代数操作和约束强化,严格地推导出 f 必须长成上面这种形式。换句话说,我们要让f的形式从方程里自己"长"出来,而不是假设它。

写下核心约束
我们希望这个 f 有什么性质?回忆 RoPE 的设计目标:形式上是绝对位置编码(f 只依赖绝对位置 m),效果上是相对位置编码(做 attention 内积时只依赖 m−n)
翻译成数学语言:我们希望 f(q, m) 和 f(k, n) 做内积后的结果,只依赖 m−n 而不依赖 m 和 n 各自的具体值。把这个"结果"记作 g,它是一个以 q、k 和相对位置 m−n 为参数的函数。结合前面讲过的桥梁等式 (2),可以写出:

\text{Re}[f(\boldsymbol{q},m)\,f^*(\boldsymbol{k},n)] = g(\boldsymbol{q},\boldsymbol{k},m-n) \tag{3}

左边是"把位置编码后的 q、k 当成复数做乘共轭取实部"——也就是它们作为位置编码后向量的内积。右边是一个抽象函数 g,它的第三个参数是相对位置 m−n,代表"不管 m、n 各是多少,只要 m−n 相同,这个值就相同"。

这是个函数方程

注意这里的未知量是函数 f 本身,不是某个数。我们要解出的是"f 应该长什么样,才能让上面的等式对任意 q、k、m、n 都成立"。这类以函数为未知量的方程叫作函数方程,在数学上有一套专门的求解技巧(特殊值代入、递推、寻找不变量等),后面会反复用到。

分析:在建模和推导前,苏剑林其实通过直觉已经知道答案的轮廓,建模和推导只是为了用方程的代数结构把直觉严格化,同时验证它是方程的合理解。

3.2 解方程

步骤1:加强约束,从实数到复数

直接解式 (3) 行不通: f 外面的 Re 把复数压成实数,会破坏掉相位结构。具体说:

e^{im\theta} = \cos(m\theta) + i\sin(m\theta)

如果取实部,就只剩 cos(mθ)。但 cos 是偶函数,无法区分 m 和 −m,方向感丢失,更重要的是再也没有"复数乘法 = 相位相加"那个漂亮的代数性质了。

苏剑林的对策:主动加强约束,把式 (3) 变成:

f(\boldsymbol{q},m)\,f^*(\boldsymbol{k},n) = g(\boldsymbol{q},\boldsymbol{k},m-n) \tag{4}

去掉 Re,要求整个复数相等,不只是实部。

分析:这一步其实是有的可循的。原方程f外面的 Re 把复数压成实数,会破坏掉相位结构,也破坏了"复数乘法 = 相位相加"那个关键的代数性质。苏剑林意识到,想要从方程里解出"旋转复数"形式的答案,就必须保留相位信息。所以他主动去掉了Re,把约束加强为复数等式。这步不是逻辑必然,而是"为了让答案能浮现出来"所做的方法论选择。
用一个比喻:Re 就像把彩色照片印成黑白。你要研究照片里的"蓝色",就必须在彩色阶段研究;如果一上来就把照片印成黑白,“蓝色"这个概念就消失了,你再怎么推导也不可能从黑白照片里还原出蓝色。但等你研究清楚了"蓝色物体长什么样”,最后再印成黑白也无所谓——你只是不展示颜色,但它确实存在过。

因此,我们继续,将 f 写成复数的指数形式:

f(\boldsymbol{q},m) = R_f(\boldsymbol{q},m)\,e^{i\Theta_f(\boldsymbol{q},m)}

代入式 (4),拆成两部分:

R_f(\boldsymbol{q},m)\,R_f(\boldsymbol{k},n) = R_g(\boldsymbol{q},\boldsymbol{k},m-n) \tag{5a} \Theta_f(\boldsymbol{q},m) - \Theta_f(\boldsymbol{k},n) = \Theta_g(\boldsymbol{q},\boldsymbol{k},m-n) \tag{5b}

现在我们要解式 (5a)、(5b) 这两个方程。但它们都含有 q、k、m、n 四个变量,直接硬解不可能——必须”消元”。

步骤2:代入特殊点 m = n

直觉和动机分析:其实就是通过代入特殊解和边界条件条件求解方程。回到 RoPE 的物理含义想一想:当两个 token 恰好在同一个位置时(也就是 m = n)会发生什么?按照相对位置编码的理论,m=n 对应"两个 token 在同一个位置"的情形,这时候不应该有任何位置编码的影响——它就应该退化为普通的、不带位置的内积 ⟨q,k⟩。这是一个物理意义上必须成立的边界条件,不是凭空假设的。

把 m = n 代入式 (5a) 和 (5b),右边的第三个参数变成 0:

R_f(\boldsymbol{q},m)\,R_f(\boldsymbol{k},m) = R_g(\boldsymbol{q},\boldsymbol{k},0) \tag{5a'} \Theta_f(\boldsymbol{q},m) - \Theta_f(\boldsymbol{k},m) = \Theta_g(\boldsymbol{q},\boldsymbol{k},0) \tag{5b'}

g(q, k, 0) 退化成了只依赖 q、k 的函数。但它具体等于什么?还需要一个初始条件。

直觉和动机分析:

  1. 苏剑林知道答案应该是"q 乘以一个旋转因子"的形式。当位置 m = 0 时,旋转因子退化为 1(旋转 0 度 = 不旋转),所以 f(q, 0) 自然就等于 q 本身。这个边界条件和目标解是完全自洽的。
  2. 更直接的理由:序列的第 0 个位置是"起点",它不应该被加入任何位置信息,不应该被变换,就是 token 本身。换句话说:
f(\boldsymbol{q}, 0) = \boldsymbol{q} \tag{6}

这个约定的物理含义是"原点不加入位置信息",数学上也和预期答案自洽(m=0 时 e⁰ = 1,正好退化为 q)。

联合式 (5a’)、(5b’) 与式 (6) 求解

由式 (6)(同理 f(k, 0) = k),可以算出 g(q, k, 0) 的模长和相位:

R_g(\boldsymbol{q},\boldsymbol{k},0) = \|\boldsymbol{q}\|\,\|\boldsymbol{k}\| \tag{6a} \Theta_g(\boldsymbol{q},\boldsymbol{k},0) = \Theta(\boldsymbol{q}) - \Theta(\boldsymbol{k}) \tag{6b}

模长部分:将式 (6a) 回代进式 (5a’),推出:

R_f(\boldsymbol{q}, m) = \|\boldsymbol{q}\| \tag{7}

也就是说,位置编码函数 f 不改变向量的模长——它只作用在"方向/相位"这个维度上。这正好对应前面复数直觉里说的"单位复数相乘"——单位复数模长为 1,乘上去只会旋转,不会拉伸。

相位部分:将式 (6b) 回代进式 (5b’),得到:

\Theta_f(\boldsymbol{q},m) - \Theta_f(\boldsymbol{k},m) = \Theta(\boldsymbol{q}) - \Theta(\boldsymbol{k})

移项整理:

\Theta_f(\boldsymbol{q},m) - \Theta(\boldsymbol{q}) = \Theta_f(\boldsymbol{k},m) - \Theta(\boldsymbol{k})

等号左边只含 q 和 m,右边只含 k 和 m。但 q 和 k 是任意的——这意味着两边必须都等于一个只与 m 有关、与 q/k 无关的函数。这一性质符合位置编码的物理意义:位置编码只与位置信息有关,与 token 内容无关。记这个函数为 φ(m),就得到:

\Theta_f(\boldsymbol{q}, m) = \Theta(\boldsymbol{q}) + \varphi(m) \tag{8}

其中 φ(m) 是一个只依赖于位置 m、与 q 本身完全无关的函数。这个形式的含义是:位置 m 处的 q 的相位 = q 本身的相位 + 一个由位置决定的"相位增量"。

这一步隐藏着 RoPE 最核心的设计哲学:位置信息只通过"相位增量"注入,并且这个增量必须与 token 内容无关——也就是说,无论你处理的token是"猫"还是"狗",只要它在位置 m,它吃到的位置编码即"相位增量"就是同一个 φ(m)。这是位置编码作为"模型架构固定属性"的基本要求,否则每对 token 都有自己的位置编码方式,整个模型就乱套了。

步骤3:代入特殊点 n = m−1 解出 φ

现在模长问题解决了,只剩下一个未知函数 φ(m) 需要确定。我们知道它只依赖于 m,但还不知道它的具体形式——它可能是线性的 mθ、二次的 m²θ、对数的 log(m)、甚至是某种乱七八糟的函数。

苏剑林现在要问:φ(m) 的具体形式能从方程里推出来吗?

把式 (8) 回代到式 (5b):

\varphi(m) - \varphi(n) + \Theta(\boldsymbol{q}) - \Theta(\boldsymbol{k}) = \Theta_g(\boldsymbol{q}, \boldsymbol{k}, m-n)

这个方程里 m、n 都是自由变量,仍然复杂。

为什么要代入 n = m − 1

代入 n = m − 1 后,相对位置变成 m − (m−1) = 1,是一个常数。这样做之后,方程右边不再依赖 m!整个右边只剩下 q、k 和常数 1,是个与 m 无关的量。而左边 φ(m) − φ(m−1) 是关于 m 的差分。所以方程的本质变成了:

\underbrace{\varphi(m) - \varphi(m-1)}_{\text{某个关于 } m \text{ 的差分}} = \underbrace{\Theta_g(\boldsymbol{q}, \boldsymbol{k}, 1) + \Theta(\boldsymbol{k}) - \Theta(\boldsymbol{q})}_{\text{与 } m \text{ 无关的量}}

又因为左边完全不依赖 q、k(式 (8) 已确立 φ 只依赖于 m),所以右边虽然形式上含 q、k,实际值也必须是一个与 q、k 无关的常数——否则方程左右对不上。把这个常数设为 θ:

\varphi(m) - \varphi(m-1) = \theta \tag{9}

差分恒等于常数——这正是等差数列的定义!所以 φ(m) 必须是 m 的线性函数。

这块彻底看不懂了,以下是claude的分析:苏剑林在这里做的是一个典型的函数方程套路——当方程里同时含有"未知函数 φ(m)"和"参数依赖项 Θ_g(q, k, m−n)“时,通过特殊代入让参数依赖项变成常数,这样方程就退化为一个纯粹的差分方程,可以解出 φ 的形式。更具体地说,这套思路在数学上叫做"柯西函数方程"风格的求解:柯西方程 f(x+y) = f(x) + f(y) 的解就是线性函数 f(x) = cx,证明思路就是通过特殊代入逼出递推关系。RoPE 这里的推导本质上是同一类问题:有相对位置依赖的函数方程,通过相邻点代入降为递推,最后推出线性解。苏剑林作为一个对函数方程很熟悉的人(他博客里写过不少函数方程的文章),看到 φ(m) − φ(m−1) 这种结构会立刻反应过来"这是等差数列的特征”。所以代入 n = m − 1 不是偶然的灵感,而是经过训练的数学反射

解出等差数列
于是:

\varphi(m) = m\theta \tag{10}

(代入式 (6) 的初始条件 φ(0) = 0,因为位置 0 处没有相位增量。)

这一步揭示的深层必然性

停下来想想刚才发生了什么。我们没有假设 φ 是线性的,也没有"选择"线性形式——线性是被方程强行逼出来的。整个逼迫链条是:

  1. “位置编码与 token 内容无关”(从 RoPE 设计目标出发)
  2. → φ 只依赖 m,不依赖 q、k
  3. → φ(m) − φ(m−1) 的结果必须与 q、k 无关
  4. → 该差分必须是常数
  5. → φ 是等差数列
  6. → φ(m) = mθ

所以 RoPE 里相位随位置线性增长这个看似简单的性质,其实是整套设计哲学的数学必然结果。只要你接受"位置编码应该是 token 无关的全局属性"这个前提,线性就是唯一可能的形式。

代回 f 的定义,我们得到了二维 RoPE 的最终形式:

f(\boldsymbol{q}, m) = \|\boldsymbol{q}\|\,e^{i(\Theta(\boldsymbol{q}) + m\theta)} = \boldsymbol{q}\,e^{im\theta} \tag{11}

这正是第二节里通过直觉猜测的答案。至此,直觉被严格化、被验证——从一个朦胧的灵感变成了一个有完整数学支撑的方案。

写成矩阵形式(把 q 看成二维实向量 (q₀, q₁)):

f(\boldsymbol{q}, m) = \begin{pmatrix} \cos m\theta & -\sin m\theta \\ \sin m\theta & \cos m\theta \end{pmatrix} \begin{pmatrix} q_0 \\ q_1 \end{pmatrix} \tag{12}

这就是一个标准的二维旋转矩阵——所以叫 Rotary Position Embedding(旋转位置编码)

四、推广到高维:分块旋转

4.1 内积的"线性叠加性"

高维内积有一个平凡但关键的性质:d 维内积 = 各个二维子块内积之和
把 d 维向量两两分组,每组当成一个二维平面:

\langle \boldsymbol{u}, \boldsymbol{v} \rangle = \sum_{i=0}^{d/2-1} \langle \boldsymbol{u}^{(i)}, \boldsymbol{v}^{(i)} \rangle \tag{13}

由式 (13) 可知,二维 RoPE 可以无缝推广到高维:只要每一个二维块都满足"内积只依赖相对位置",那么整个高维内积也自动满足

4.2 高维 RoPE 的形式

把 d 维向量分成 d/2 个二维块,每块用一个独立的旋转角 θᵢ(类比式 (12) 的二维旋转矩阵),整个旋转矩阵就是块对角形式:

\mathcal{R}_m = \begin{pmatrix} \cos m\theta_0 & -\sin m\theta_0 & & & & \\ \sin m\theta_0 & \cos m\theta_0 & & & & \\ & & \cos m\theta_1 & -\sin m\theta_1 & & \\ & & \sin m\theta_1 & \cos m\theta_1 & & \\ & & & & \ddots & \\ & & & & & \cos m\theta_{d/2-1} & -\sin m\theta_{d/2-1} \\ & & & & & \sin m\theta_{d/2-1} & \cos m\theta_{d/2-1} \end{pmatrix}

直觉上:把高维空间想象成多个独立的二维平面,每个平面用自己的频率独立旋转,互不干扰。

4.3 高维 RoPE 的核心恒等式

给位置 m 的 query 乘 Rₘ,位置 n 的 key 乘 Rₙ,attention 分数:

(\mathcal{R}_m \boldsymbol{q})^\top (\mathcal{R}_n \boldsymbol{k}) = \boldsymbol{q}^\top \mathcal{R}_m^\top \mathcal{R}_n \boldsymbol{k} = \boldsymbol{q}^\top \mathcal{R}_{n-m} \boldsymbol{k} \tag{14}

最后一步用了两个性质:

正交矩阵转置等于逆:

\mathcal{R}_m^\top = \mathcal{R}_{-m}

(旋转 m 度的逆操作就是反向旋转 m 度)

旋转角度可加:

\mathcal{R}_a \mathcal{R}_b = \mathcal{R}_{a+b}

(连续两次旋转 = 一次性旋转角度之和)
合起来:

\mathcal{R}_m^\top \mathcal{R}_n = \mathcal{R}_{-m} \mathcal{R}_n = \mathcal{R}_{n-m}

绝对位置 m、n 在矩阵乘法中自动消去,只留下相对位置 n−m。式 (14) 就是苏剑林直觉中想要的复数性质式 (1)在高维矩阵语言里的对应。至此整个RoPE的推导已经完整。

4.4 RoPE 的工程优势

Rₘ 是正交矩阵 → 不改变向量模长(呼应式 (7) 的结论)。这是 RoPE 在工程上特别好用的关键:

  • 不会让 q、k 数值范围爆炸或衰减
  • 训练稳定性好
  • 不需要额外的归一化技巧

很多其他位置编码方案(比如简单地把位置向量加到 q、k 上)会改变模长分布导致训练不稳定。RoPE 用旋转——一个保模长的操作——天然避免了这个问题。

五、频率的选择:从 Sinusoidal 借来的智慧

5.1 为什么需要"多频率"

如果所有 θᵢ 都相等,那 RoPE 就只有一个频率,远距离和近距离的区分能力很弱。Sinusoidal 位置编码当年的设计是用多频率:

\theta_i = 10000^{-2i/d} \tag{15}

苏剑林直接借用了这个方案——这就是论文里说"博采众长"的另一层含义。

直觉上,多频率让 RoPE 能在多个尺度上同时编码位置:

  • 高频块(小 i):周期短,对近距离区分敏感
  • 低频块(大 i):周期长,对远距离也能保留信息

类似傅里叶变换的思想——用不同频率的正弦波叠加来表示复杂信号。

5.2 远程衰减性

苏剑林证明了这个频率方案能让 RoPE 拥有远程衰减性:

相对距离越大,attention 分数中的"位置编码贡献"在平均意义下越小。

为什么这是好性质:语言里的依赖关系大多是局部的,模型应该天然倾向于关注近处的 token。远程衰减相当于给模型一个局部性先验——不强制,但默认远处更弱。这符合语言建模的直觉。证明思路不写了看原文吧。

5.4 苏剑林的实验观察

苏剑林做过一个有趣的对照实验:把 θᵢ 当作可训练参数(用 Sinusoidal 公式初始化),训练一段时间后发现 θᵢ 几乎没怎么变。

这说明 Sinusoidal 的频率设计已经足够好,模型自己也学不出更好的方案,所以他干脆固定下来不训练了。

六、回顾:苏剑林思维路径的完整还原

  1. 出发点:线性 Attention 不兼容相对位置编码
  2. 渴望:形式上是绝对位置编码(兼容线性 Attention),效果上是相对位置编码
  3. 直觉:复数旋转天然让绝对位置变成相对位置
e^{im\theta} \cdot (e^{in\theta})^* = e^{i(m-n)\theta}
  1. 反推目标解
f(\boldsymbol{q}, m) = \boldsymbol{q} \cdot e^{im\theta}
  1. 为了让推导收敛到目标解,做三次"加强约束"
    • 加强 1:去掉 Re
      • 式 (3) 外层的 Re 会破坏复数相位结构(只剩 cos,丢失方向信息)
      • 去掉 Re 得到式 (4),保留完整复数形式,让目标解能从代数推导中"长出来"
    • 加强 2:设 f(q, 0) = q
      • 位置 0 不应该有编码(物理直觉)
      • 与目标解在 m=0 处自洽
    • 加强 3:要求 φ(m) 的步长与 q、k 无关
      • 位置编码频率必须是模型固定属性,不能让每对 token 各自有频率
      • 这个约束显式逼出 φ(m) 的线性形式
  2. 函数方程经典技巧
    • 代入 m = n:消去相对位置维度,钉住 g 的边界
    • 代入 n = m − 1:把方程降为差分,逼出等差数列
  3. 解出
\varphi(m) = m\theta
  1. 得到二维 RoPE
f(\boldsymbol{q}, m) = \boldsymbol{q} \cdot e^{im\theta}
  1. 推广到高维:利用内积的分块可加性,d/2 个独立二维平面拼接
  2. 借鉴 Sinusoidal 的频率设计(多频率 + 远程衰减):
\theta_i = 10000^{-2i/d}
  1. 完整的高维 RoPE 诞生

引用

苏剑林. (Mar. 23, 2021). 《Transformer 升级之路:2、博采众长的旋转式位置编码》[Blog post]. https://spaces.ac.cn/archives/8265
苏剑林. (Feb. 03, 2021). 《让研究人员绞尽脑汁的 Transformer 位置编码》[Blog post]. https://spaces.ac.cn/archives/8130
Su, J., Lu, Y., Pan, S., Wen, B., & Liu, Y. (2021). RoFormer: Enhanced Transformer with Rotary Position Embedding. arXiv:2104.09864.


我的感悟

太难了,这么多的数学推导已经给我看懵了,没claude我根本看不下来。这波属于是我和claude合砍80分。感觉记住旋转位置编码等于用绝对位置编码的方式实现相对位置编码的效果应该就差不多了吧

网友解答:
--【壹】--:

LLM & Agent 每日论文阅读计划-D2


碎碎念

今天来补昨天看DeepSeekV2论文留下的其中之一个坑:旋转位置编码(Rotary Position Embedding,RoPE),话说这个不应该叫旋转位置嵌入吗?由于原文涉及到致死量的数学公式,今天花了大量时间拷打claude进行公式理解。(╯-_-)╯╧╧ 方便起见我只阅读了博客。细节阅读部分还是有很多数学公式,因此如果不想看公式的话就看TL;DR,细节阅读的开头结尾和我的感悟就行´͈ ᵕ `͈


今日阅读论文

  • 标题:ROFORMER: ENHANCED TRANSFORMER WITH ROTARY POSITION EMBEDDING
  • 作者单位:苏剑林,追一科技
  • 链接:arxiv | 博客
  • 发表venue:arxiv
  • 年份:2021.4

ps:苏剑林苏神是月之暗面(KIMI AI)的研究员和知名中文 NLP 技术博主,最广为人知的贡献是提出了旋转位置编码 RoPE——目前几乎所有主流大模型(LLaMA、Qwen、DeepSeek、Kimi 等)都采用的位置编码方法。苏神本人也是我的学习目标之一,可惜我的数学实在是太拉了,但凡我有苏神一半的数学水平。。他有个非常知名的博客网页:科学空间


TL;DR

旋转位置编码就是用绝对位置编码的方式实现相对位置编码的效果。从而同时获得绝对位置编码的简单实现和对线性注意力的适配性,以及相对位置编码的更好的性能。


细节阅读:

下面内容企图以一个数学小白的视角猜测和理解苏神当年是怎么想到思路、推导和最终发明旋转位置编码的过程,这不是严格推导的,而是一次基于猜测的"逆向工程"——把 RoPE 论文里那些"为简单起见"和"显然可以"背后藏着的研究思路还原出来。通过猜测和还原苏剑林的真实思考过程,你会发现 RoPE 不是凭空蹦出来的天才之作,而是数学和技术积累+直觉+工程实践的精心组合。

一、问题的起点:一个工程上的痛点

1.1 当时的位置编码格局(2020-2021)

由于Transformers的计算特性,它不像RNN这些架构一次处理一个token,而是并行处理,因此必须显式注入位置信息,让模型分清楚token的先后位置顺序。

*一个不恰当的比喻,就像现在工业化养殖肉猪,一次出栏很多猪,因此养猪场猪出栏的时候要给猪盖章证明检疫合格和出栏时间,从而分清楚哪头猪是哪头,免得出问题了找不到对应的厂家,但是盖这个印章的墨水又不能影响到食用:

绝对位置编码:把位置向量加到输入 token 上

x_k + p_k
  • 代表:BERT 的可训练式、Vaswani 的 Sinusoidal 三角式(来源于transformer经典老番 Attention is all your need)
  • 优点:实现简单,直接加在输入上
  • 缺点:泛化能力弱,长度外推差

相对位置编码:在 attention 计算里直接注入相对距离

i - j
  • 代表:T5、DeBERTa、XLNet
  • 优点:效果普遍更好,因为语言关系本质上是相对的
  • 缺点:必须修改 attention 的计算结构,不适用于线性注意力

1.2 苏剑林真正在意的痛点

苏剑林当时在研究线性 Attention(Performer、Linear Transformer 等)。这类方法依赖可分解形式:

\text{softmax}(QK^\top) \approx \phi(Q)\phi(K)^\top

从而把 attention 复杂度从 O(n²) 降到 O(n)。

问题来了:所有相对位置编码方案都修改了 attention 的内部结构,因此都和线性 Attention 不兼容。而苏剑林想的是

有没有一种位置编码,既能像绝对位置编码那样直接加在 q、k 上(保持线性 Attention 兼容,又能在后续注意力矩阵的内积计算中自动产生相对位置效果(保持效果)

也就是"将绝对位置编码与相对位置编码融于一体"。

二、灵感的火花:复数旋转的天然性质

2.1 关键观察

苏剑林由于是数学出身,同时作为博客作者写过大量复数与几何的科普,因此具有对数学性质的专业性的敏感,对通过"两个绝对位置经过相乘转换成相对位置"这个要求,他马上联想到了复数旋转的性质。具体讲,他注意到一个等式:

e^{im\theta} \cdot (e^{in\theta})^* = e^{i(m-n)\theta} \tag{1}

这个等式在数学上极其平凡,但用到位置编码上简直是天作之合:两个绝对位置 m、n 经过复数乘共轭后,自然地"折叠"成了相对位置 m−n,不需要任何额外操作,完全是复数代数本身的性质。

2.2 复数与实向量内积的桥梁

由于注意力矩阵计算本质上其实就是多个向量内积,而苏剑林想要引入复数的性质,于是开始推导:

\langle \boldsymbol{q}, \boldsymbol{k} \rangle = \text{Re}[\boldsymbol{q}\,\boldsymbol{k}^*] \tag{2}

这就是连接实向量内积和复数的桥梁。二维实向量的内积等于把它们看作复数后,一个乘以另一个共轭再取实部。

这两个等式一拼接,灵魂时刻就到了:

只要把位置信息编码成"乘以一个单位复数"的形式(注入是绝对的),那么 q 和 k 做内积时,相位会自动相减(效果是相对的)

这就是 RoPE 的全部直觉。剩下的所有数学推导,都是在严格化这个直觉、把它从二维推广到高维、并验证它的工程可行性。

2.3 复数乘法的几何本质(理解相位相减的关键)

为了把相位相减这件事看清楚,需要理解复数乘法的几何意义:

复数乘法 = 旋转 + 缩放

设两个复数:

z_1 = r_1 e^{i\theta_1}, \quad z_2 = r_2 e^{i\theta_2}

它们相乘:

z_1 \cdot z_2 = r_1 r_2 \cdot e^{i(\theta_1 + \theta_2)}

模长相乘、相位相加。这是因为欧拉公式加上三角函数和角公式自然得到的:

e^{i\theta} = \cos\theta + i\sin\theta

乘以共轭就是反向旋转:

w^* = re^{-i\theta}

所以:

z_1 \cdot z_2^* = r_1 r_2 \cdot e^{i(\theta_1 - \theta_2)}

相位变成了

直觉版本:乘以一个复数 = 按它的角度逆时针转;乘以它的共轭 = 按它的角度顺时针转。所以 z₁·z₂* 的相位就是 z₁ 和 z₂ 的"夹角"——这正是我们想要的"相对位置"。

三、严格化:把直觉变成数学推导

3.1 问题建模

到这一步,苏剑林手里已经有了一个清晰的直觉——位置信息应该通过"乘一个单位复数"的形式注入,也就是它应该是一种乘性位置编码。但直觉不是推导,要把这个想法落实成一个严格的 RoPE 方案,必须先把问题形式化。

先定义未知函数

我们想要的是一个"位置编码函数",它能把一个 token 向量和它所在的位置合成一个新的、带位置信息的向量。记这个函数为 f。对于位于位置 m 的 query 向量 q,位置编码后的结果是:

f(\boldsymbol{q}, m)

对于位于位置 n 的 key 向量 k,位置编码后的结果是:

f(\boldsymbol{k}, n)

这里要强调一下 f 的输入含义:第一个参数是原始 token 向量本身(q 或 k),第二个参数是它在序列中的位置索引(m 或 n)。函数的输出是"注入了位置信息之后的新向量"。这就是 RoPE 要设计的对象——一旦解出 f 的具体形式,整套方案就成了。

预期的答案形态

虽然 f 还是未知的,但苏剑林心里已经有目标了。根据第二节的直觉——位置信息应该表现为"单位复数相乘"——他预期 f 最终会长成类似下面这种形式:

f(\boldsymbol{q}, m) \sim \boldsymbol{q} \cdot e^{im\theta}

也就是"原始向量乘上一个随位置 m 旋转的复数"。这种位置信息编码最好还是单位复数,这样两个绝对位置相乘共轭后会自动留下相对位置,还不会改变q和k的平均值——这正是我们要的性质。

但目前这只是一个有待验证的猜测,不是严格结论。接下来几节要做的事情就是:从 f 满足的方程出发,通过一系列代数操作和约束强化,严格地推导出 f 必须长成上面这种形式。换句话说,我们要让f的形式从方程里自己"长"出来,而不是假设它。

写下核心约束
我们希望这个 f 有什么性质?回忆 RoPE 的设计目标:形式上是绝对位置编码(f 只依赖绝对位置 m),效果上是相对位置编码(做 attention 内积时只依赖 m−n)
翻译成数学语言:我们希望 f(q, m) 和 f(k, n) 做内积后的结果,只依赖 m−n 而不依赖 m 和 n 各自的具体值。把这个"结果"记作 g,它是一个以 q、k 和相对位置 m−n 为参数的函数。结合前面讲过的桥梁等式 (2),可以写出:

\text{Re}[f(\boldsymbol{q},m)\,f^*(\boldsymbol{k},n)] = g(\boldsymbol{q},\boldsymbol{k},m-n) \tag{3}

左边是"把位置编码后的 q、k 当成复数做乘共轭取实部"——也就是它们作为位置编码后向量的内积。右边是一个抽象函数 g,它的第三个参数是相对位置 m−n,代表"不管 m、n 各是多少,只要 m−n 相同,这个值就相同"。

这是个函数方程

注意这里的未知量是函数 f 本身,不是某个数。我们要解出的是"f 应该长什么样,才能让上面的等式对任意 q、k、m、n 都成立"。这类以函数为未知量的方程叫作函数方程,在数学上有一套专门的求解技巧(特殊值代入、递推、寻找不变量等),后面会反复用到。

分析:在建模和推导前,苏剑林其实通过直觉已经知道答案的轮廓,建模和推导只是为了用方程的代数结构把直觉严格化,同时验证它是方程的合理解。

3.2 解方程

步骤1:加强约束,从实数到复数

直接解式 (3) 行不通: f 外面的 Re 把复数压成实数,会破坏掉相位结构。具体说:

e^{im\theta} = \cos(m\theta) + i\sin(m\theta)

如果取实部,就只剩 cos(mθ)。但 cos 是偶函数,无法区分 m 和 −m,方向感丢失,更重要的是再也没有"复数乘法 = 相位相加"那个漂亮的代数性质了。

苏剑林的对策:主动加强约束,把式 (3) 变成:

f(\boldsymbol{q},m)\,f^*(\boldsymbol{k},n) = g(\boldsymbol{q},\boldsymbol{k},m-n) \tag{4}

去掉 Re,要求整个复数相等,不只是实部。

分析:这一步其实是有的可循的。原方程f外面的 Re 把复数压成实数,会破坏掉相位结构,也破坏了"复数乘法 = 相位相加"那个关键的代数性质。苏剑林意识到,想要从方程里解出"旋转复数"形式的答案,就必须保留相位信息。所以他主动去掉了Re,把约束加强为复数等式。这步不是逻辑必然,而是"为了让答案能浮现出来"所做的方法论选择。
用一个比喻:Re 就像把彩色照片印成黑白。你要研究照片里的"蓝色",就必须在彩色阶段研究;如果一上来就把照片印成黑白,“蓝色"这个概念就消失了,你再怎么推导也不可能从黑白照片里还原出蓝色。但等你研究清楚了"蓝色物体长什么样”,最后再印成黑白也无所谓——你只是不展示颜色,但它确实存在过。

因此,我们继续,将 f 写成复数的指数形式:

f(\boldsymbol{q},m) = R_f(\boldsymbol{q},m)\,e^{i\Theta_f(\boldsymbol{q},m)}

代入式 (4),拆成两部分:

R_f(\boldsymbol{q},m)\,R_f(\boldsymbol{k},n) = R_g(\boldsymbol{q},\boldsymbol{k},m-n) \tag{5a} \Theta_f(\boldsymbol{q},m) - \Theta_f(\boldsymbol{k},n) = \Theta_g(\boldsymbol{q},\boldsymbol{k},m-n) \tag{5b}

现在我们要解式 (5a)、(5b) 这两个方程。但它们都含有 q、k、m、n 四个变量,直接硬解不可能——必须”消元”。

步骤2:代入特殊点 m = n

直觉和动机分析:其实就是通过代入特殊解和边界条件条件求解方程。回到 RoPE 的物理含义想一想:当两个 token 恰好在同一个位置时(也就是 m = n)会发生什么?按照相对位置编码的理论,m=n 对应"两个 token 在同一个位置"的情形,这时候不应该有任何位置编码的影响——它就应该退化为普通的、不带位置的内积 ⟨q,k⟩。这是一个物理意义上必须成立的边界条件,不是凭空假设的。

把 m = n 代入式 (5a) 和 (5b),右边的第三个参数变成 0:

R_f(\boldsymbol{q},m)\,R_f(\boldsymbol{k},m) = R_g(\boldsymbol{q},\boldsymbol{k},0) \tag{5a'} \Theta_f(\boldsymbol{q},m) - \Theta_f(\boldsymbol{k},m) = \Theta_g(\boldsymbol{q},\boldsymbol{k},0) \tag{5b'}

g(q, k, 0) 退化成了只依赖 q、k 的函数。但它具体等于什么?还需要一个初始条件。

直觉和动机分析:

  1. 苏剑林知道答案应该是"q 乘以一个旋转因子"的形式。当位置 m = 0 时,旋转因子退化为 1(旋转 0 度 = 不旋转),所以 f(q, 0) 自然就等于 q 本身。这个边界条件和目标解是完全自洽的。
  2. 更直接的理由:序列的第 0 个位置是"起点",它不应该被加入任何位置信息,不应该被变换,就是 token 本身。换句话说:
f(\boldsymbol{q}, 0) = \boldsymbol{q} \tag{6}

这个约定的物理含义是"原点不加入位置信息",数学上也和预期答案自洽(m=0 时 e⁰ = 1,正好退化为 q)。

联合式 (5a’)、(5b’) 与式 (6) 求解

由式 (6)(同理 f(k, 0) = k),可以算出 g(q, k, 0) 的模长和相位:

R_g(\boldsymbol{q},\boldsymbol{k},0) = \|\boldsymbol{q}\|\,\|\boldsymbol{k}\| \tag{6a} \Theta_g(\boldsymbol{q},\boldsymbol{k},0) = \Theta(\boldsymbol{q}) - \Theta(\boldsymbol{k}) \tag{6b}

模长部分:将式 (6a) 回代进式 (5a’),推出:

R_f(\boldsymbol{q}, m) = \|\boldsymbol{q}\| \tag{7}

也就是说,位置编码函数 f 不改变向量的模长——它只作用在"方向/相位"这个维度上。这正好对应前面复数直觉里说的"单位复数相乘"——单位复数模长为 1,乘上去只会旋转,不会拉伸。

相位部分:将式 (6b) 回代进式 (5b’),得到:

\Theta_f(\boldsymbol{q},m) - \Theta_f(\boldsymbol{k},m) = \Theta(\boldsymbol{q}) - \Theta(\boldsymbol{k})

移项整理:

\Theta_f(\boldsymbol{q},m) - \Theta(\boldsymbol{q}) = \Theta_f(\boldsymbol{k},m) - \Theta(\boldsymbol{k})

等号左边只含 q 和 m,右边只含 k 和 m。但 q 和 k 是任意的——这意味着两边必须都等于一个只与 m 有关、与 q/k 无关的函数。这一性质符合位置编码的物理意义:位置编码只与位置信息有关,与 token 内容无关。记这个函数为 φ(m),就得到:

\Theta_f(\boldsymbol{q}, m) = \Theta(\boldsymbol{q}) + \varphi(m) \tag{8}

其中 φ(m) 是一个只依赖于位置 m、与 q 本身完全无关的函数。这个形式的含义是:位置 m 处的 q 的相位 = q 本身的相位 + 一个由位置决定的"相位增量"。

这一步隐藏着 RoPE 最核心的设计哲学:位置信息只通过"相位增量"注入,并且这个增量必须与 token 内容无关——也就是说,无论你处理的token是"猫"还是"狗",只要它在位置 m,它吃到的位置编码即"相位增量"就是同一个 φ(m)。这是位置编码作为"模型架构固定属性"的基本要求,否则每对 token 都有自己的位置编码方式,整个模型就乱套了。

步骤3:代入特殊点 n = m−1 解出 φ

现在模长问题解决了,只剩下一个未知函数 φ(m) 需要确定。我们知道它只依赖于 m,但还不知道它的具体形式——它可能是线性的 mθ、二次的 m²θ、对数的 log(m)、甚至是某种乱七八糟的函数。

苏剑林现在要问:φ(m) 的具体形式能从方程里推出来吗?

把式 (8) 回代到式 (5b):

\varphi(m) - \varphi(n) + \Theta(\boldsymbol{q}) - \Theta(\boldsymbol{k}) = \Theta_g(\boldsymbol{q}, \boldsymbol{k}, m-n)

这个方程里 m、n 都是自由变量,仍然复杂。

为什么要代入 n = m − 1

代入 n = m − 1 后,相对位置变成 m − (m−1) = 1,是一个常数。这样做之后,方程右边不再依赖 m!整个右边只剩下 q、k 和常数 1,是个与 m 无关的量。而左边 φ(m) − φ(m−1) 是关于 m 的差分。所以方程的本质变成了:

\underbrace{\varphi(m) - \varphi(m-1)}_{\text{某个关于 } m \text{ 的差分}} = \underbrace{\Theta_g(\boldsymbol{q}, \boldsymbol{k}, 1) + \Theta(\boldsymbol{k}) - \Theta(\boldsymbol{q})}_{\text{与 } m \text{ 无关的量}}

又因为左边完全不依赖 q、k(式 (8) 已确立 φ 只依赖于 m),所以右边虽然形式上含 q、k,实际值也必须是一个与 q、k 无关的常数——否则方程左右对不上。把这个常数设为 θ:

\varphi(m) - \varphi(m-1) = \theta \tag{9}

差分恒等于常数——这正是等差数列的定义!所以 φ(m) 必须是 m 的线性函数。

这块彻底看不懂了,以下是claude的分析:苏剑林在这里做的是一个典型的函数方程套路——当方程里同时含有"未知函数 φ(m)"和"参数依赖项 Θ_g(q, k, m−n)“时,通过特殊代入让参数依赖项变成常数,这样方程就退化为一个纯粹的差分方程,可以解出 φ 的形式。更具体地说,这套思路在数学上叫做"柯西函数方程"风格的求解:柯西方程 f(x+y) = f(x) + f(y) 的解就是线性函数 f(x) = cx,证明思路就是通过特殊代入逼出递推关系。RoPE 这里的推导本质上是同一类问题:有相对位置依赖的函数方程,通过相邻点代入降为递推,最后推出线性解。苏剑林作为一个对函数方程很熟悉的人(他博客里写过不少函数方程的文章),看到 φ(m) − φ(m−1) 这种结构会立刻反应过来"这是等差数列的特征”。所以代入 n = m − 1 不是偶然的灵感,而是经过训练的数学反射

解出等差数列
于是:

\varphi(m) = m\theta \tag{10}

(代入式 (6) 的初始条件 φ(0) = 0,因为位置 0 处没有相位增量。)

这一步揭示的深层必然性

停下来想想刚才发生了什么。我们没有假设 φ 是线性的,也没有"选择"线性形式——线性是被方程强行逼出来的。整个逼迫链条是:

  1. “位置编码与 token 内容无关”(从 RoPE 设计目标出发)
  2. → φ 只依赖 m,不依赖 q、k
  3. → φ(m) − φ(m−1) 的结果必须与 q、k 无关
  4. → 该差分必须是常数
  5. → φ 是等差数列
  6. → φ(m) = mθ

所以 RoPE 里相位随位置线性增长这个看似简单的性质,其实是整套设计哲学的数学必然结果。只要你接受"位置编码应该是 token 无关的全局属性"这个前提,线性就是唯一可能的形式。

代回 f 的定义,我们得到了二维 RoPE 的最终形式:

f(\boldsymbol{q}, m) = \|\boldsymbol{q}\|\,e^{i(\Theta(\boldsymbol{q}) + m\theta)} = \boldsymbol{q}\,e^{im\theta} \tag{11}

这正是第二节里通过直觉猜测的答案。至此,直觉被严格化、被验证——从一个朦胧的灵感变成了一个有完整数学支撑的方案。

写成矩阵形式(把 q 看成二维实向量 (q₀, q₁)):

f(\boldsymbol{q}, m) = \begin{pmatrix} \cos m\theta & -\sin m\theta \\ \sin m\theta & \cos m\theta \end{pmatrix} \begin{pmatrix} q_0 \\ q_1 \end{pmatrix} \tag{12}

这就是一个标准的二维旋转矩阵——所以叫 Rotary Position Embedding(旋转位置编码)

四、推广到高维:分块旋转

4.1 内积的"线性叠加性"

高维内积有一个平凡但关键的性质:d 维内积 = 各个二维子块内积之和
把 d 维向量两两分组,每组当成一个二维平面:

\langle \boldsymbol{u}, \boldsymbol{v} \rangle = \sum_{i=0}^{d/2-1} \langle \boldsymbol{u}^{(i)}, \boldsymbol{v}^{(i)} \rangle \tag{13}

由式 (13) 可知,二维 RoPE 可以无缝推广到高维:只要每一个二维块都满足"内积只依赖相对位置",那么整个高维内积也自动满足

4.2 高维 RoPE 的形式

把 d 维向量分成 d/2 个二维块,每块用一个独立的旋转角 θᵢ(类比式 (12) 的二维旋转矩阵),整个旋转矩阵就是块对角形式:

\mathcal{R}_m = \begin{pmatrix} \cos m\theta_0 & -\sin m\theta_0 & & & & \\ \sin m\theta_0 & \cos m\theta_0 & & & & \\ & & \cos m\theta_1 & -\sin m\theta_1 & & \\ & & \sin m\theta_1 & \cos m\theta_1 & & \\ & & & & \ddots & \\ & & & & & \cos m\theta_{d/2-1} & -\sin m\theta_{d/2-1} \\ & & & & & \sin m\theta_{d/2-1} & \cos m\theta_{d/2-1} \end{pmatrix}

直觉上:把高维空间想象成多个独立的二维平面,每个平面用自己的频率独立旋转,互不干扰。

4.3 高维 RoPE 的核心恒等式

给位置 m 的 query 乘 Rₘ,位置 n 的 key 乘 Rₙ,attention 分数:

(\mathcal{R}_m \boldsymbol{q})^\top (\mathcal{R}_n \boldsymbol{k}) = \boldsymbol{q}^\top \mathcal{R}_m^\top \mathcal{R}_n \boldsymbol{k} = \boldsymbol{q}^\top \mathcal{R}_{n-m} \boldsymbol{k} \tag{14}

最后一步用了两个性质:

正交矩阵转置等于逆:

\mathcal{R}_m^\top = \mathcal{R}_{-m}

(旋转 m 度的逆操作就是反向旋转 m 度)

旋转角度可加:

\mathcal{R}_a \mathcal{R}_b = \mathcal{R}_{a+b}

(连续两次旋转 = 一次性旋转角度之和)
合起来:

\mathcal{R}_m^\top \mathcal{R}_n = \mathcal{R}_{-m} \mathcal{R}_n = \mathcal{R}_{n-m}

绝对位置 m、n 在矩阵乘法中自动消去,只留下相对位置 n−m。式 (14) 就是苏剑林直觉中想要的复数性质式 (1)在高维矩阵语言里的对应。至此整个RoPE的推导已经完整。

4.4 RoPE 的工程优势

Rₘ 是正交矩阵 → 不改变向量模长(呼应式 (7) 的结论)。这是 RoPE 在工程上特别好用的关键:

  • 不会让 q、k 数值范围爆炸或衰减
  • 训练稳定性好
  • 不需要额外的归一化技巧

很多其他位置编码方案(比如简单地把位置向量加到 q、k 上)会改变模长分布导致训练不稳定。RoPE 用旋转——一个保模长的操作——天然避免了这个问题。

五、频率的选择:从 Sinusoidal 借来的智慧

5.1 为什么需要"多频率"

如果所有 θᵢ 都相等,那 RoPE 就只有一个频率,远距离和近距离的区分能力很弱。Sinusoidal 位置编码当年的设计是用多频率:

\theta_i = 10000^{-2i/d} \tag{15}

苏剑林直接借用了这个方案——这就是论文里说"博采众长"的另一层含义。

直觉上,多频率让 RoPE 能在多个尺度上同时编码位置:

  • 高频块(小 i):周期短,对近距离区分敏感
  • 低频块(大 i):周期长,对远距离也能保留信息

类似傅里叶变换的思想——用不同频率的正弦波叠加来表示复杂信号。

5.2 远程衰减性

苏剑林证明了这个频率方案能让 RoPE 拥有远程衰减性:

相对距离越大,attention 分数中的"位置编码贡献"在平均意义下越小。

为什么这是好性质:语言里的依赖关系大多是局部的,模型应该天然倾向于关注近处的 token。远程衰减相当于给模型一个局部性先验——不强制,但默认远处更弱。这符合语言建模的直觉。证明思路不写了看原文吧。

5.4 苏剑林的实验观察

苏剑林做过一个有趣的对照实验:把 θᵢ 当作可训练参数(用 Sinusoidal 公式初始化),训练一段时间后发现 θᵢ 几乎没怎么变。

这说明 Sinusoidal 的频率设计已经足够好,模型自己也学不出更好的方案,所以他干脆固定下来不训练了。

六、回顾:苏剑林思维路径的完整还原

  1. 出发点:线性 Attention 不兼容相对位置编码
  2. 渴望:形式上是绝对位置编码(兼容线性 Attention),效果上是相对位置编码
  3. 直觉:复数旋转天然让绝对位置变成相对位置
e^{im\theta} \cdot (e^{in\theta})^* = e^{i(m-n)\theta}
  1. 反推目标解
f(\boldsymbol{q}, m) = \boldsymbol{q} \cdot e^{im\theta}
  1. 为了让推导收敛到目标解,做三次"加强约束"
    • 加强 1:去掉 Re
      • 式 (3) 外层的 Re 会破坏复数相位结构(只剩 cos,丢失方向信息)
      • 去掉 Re 得到式 (4),保留完整复数形式,让目标解能从代数推导中"长出来"
    • 加强 2:设 f(q, 0) = q
      • 位置 0 不应该有编码(物理直觉)
      • 与目标解在 m=0 处自洽
    • 加强 3:要求 φ(m) 的步长与 q、k 无关
      • 位置编码频率必须是模型固定属性,不能让每对 token 各自有频率
      • 这个约束显式逼出 φ(m) 的线性形式
  2. 函数方程经典技巧
    • 代入 m = n:消去相对位置维度,钉住 g 的边界
    • 代入 n = m − 1:把方程降为差分,逼出等差数列
  3. 解出
\varphi(m) = m\theta
  1. 得到二维 RoPE
f(\boldsymbol{q}, m) = \boldsymbol{q} \cdot e^{im\theta}
  1. 推广到高维:利用内积的分块可加性,d/2 个独立二维平面拼接
  2. 借鉴 Sinusoidal 的频率设计(多频率 + 远程衰减):
\theta_i = 10000^{-2i/d}
  1. 完整的高维 RoPE 诞生

引用

苏剑林. (Mar. 23, 2021). 《Transformer 升级之路:2、博采众长的旋转式位置编码》[Blog post]. https://spaces.ac.cn/archives/8265
苏剑林. (Feb. 03, 2021). 《让研究人员绞尽脑汁的 Transformer 位置编码》[Blog post]. https://spaces.ac.cn/archives/8130
Su, J., Lu, Y., Pan, S., Wen, B., & Liu, Y. (2021). RoFormer: Enhanced Transformer with Rotary Position Embedding. arXiv:2104.09864.


我的感悟

太难了,这么多的数学推导已经给我看懵了,没claude我根本看不下来。这波属于是我和claude合砍80分。感觉记住旋转位置编码等于用绝对位置编码的方式实现相对位置编码的效果应该就差不多了吧