RoPE 形式上很巧:把 q、k 的维度两两配对,第 $d$ 对乘上旋转矩阵 $R(m\theta_d)$。但它是不是"唯一正确解"?Su et al. 2021 的论文附录里给过一个刻画,这篇把推导补全,看清楚每一步用了什么假设、哪些可以松。
函数方程:把「相对性」写成等式
位置编码方案要满足:打分只依赖相对位置。若编码器对 query/key 分别做变换 $f(q,m)$、$f(k,n)$,要求存在某个 $g$ 使得对一切 $q,k,m,n$:
$$ f(q,m)^\top f(k,n) = g(q,k,m-n) . \tag{1} $$
先取线性编码这个最窄的假设:$f(q,m) = \Phi_m\, q$,$\Phi_m$ 是与内容无关的矩阵。代入 (1):
$$ q^\top \Phi_m^\top \Phi_n\, k = g(q,k,m-n) \quad \forall q,k . $$
右边只通过 $m-n$ 依赖下标,左边却是两个矩阵的乘积——约束非常强。固定 $n=0$ 记 $\Psi_m = \Phi_m^\top \Phi_0$,则 $g(q,k,m) = q^\top \Psi_m k$。而由 (1) 把 $m$ 换成 $m+n$:$g(q,k,m) = q^\top \Phi_{m+n}^\top \Phi_n\, k$ 必须对一切 $n$ 成立。两边对 $n$ 求导(把下标延拓到实数,这是关键一步),并记 $B = \Phi'_0$,整理得柯西方程型的条件
$$ \Phi'_m = B\, \Phi_m, \qquad \Phi_0 = I \;\Longrightarrow\; \Phi_m = e^{Bm}. $$
回代验证:$\Phi_m^\top \Phi_n = e^{B^\top m} e^{Bn}$ 要与 $n$ 无关,充分必要地引向 $B^\top = -B$——即 $B$ 反对称。这时 $e^{B^\top m}e^{Bn} = e^{-Bm}e^{Bn} = e^{-B(m-n)}$,只含 $m-n$,(1) 成立。
反对称生成元 = 旋转
有限维里,反对称矩阵的特征值全是纯虚数 $\pm i\theta_d$,经正交相似变换块对角化为 $2\times 2$ 小块:
$$ B \sim \bigoplus_d \begin{bmatrix} 0 & -\theta_d \\ \theta_d & 0 \end{bmatrix} \;\Longrightarrow\; e^{Bm} \sim \bigoplus_d \begin{bmatrix} \cos m\theta_d & -\sin m\theta_d \\ \sin m\theta_d & \cos m\theta_d \end{bmatrix} . $$
这正是 RoPE:维度两两配对、每对以频率 $\theta_d$ 旋转。所以 RoPE 不是"一个不错的选择",而是在线性编码 + 相对性两个假设下,解族的唯一形态;剩下的自由度只有频率 $\{\theta_d\}$ 的选取(基底 10000 的几何铺排,见第 5070 篇)。
两个可以松的假设,以及松了之后是什么
线性可以松。 $\Phi_m$ 非线性时解空间很大,没有干净刻画;但注意线性编码保住了 RoPE 最重要的工程性质——$f(q,m)$ 对 $m$ 的作用是一次矩阵乘,从而和 FlashAttention 分块、KV cache 追加兼容。线性不是数学上必须的,是系统接口上必须的。
保范的必要性藏在上面。 $B^\top = -B$ 推出 $\Phi_m = e^{Bm}$ 是正交矩阵,$\|\Phi_m q\| = \|q\|$——保范不是额外假设,是解的副产品。反过来看就明白为什么需要它:若允许生成元带实部(如 $C = \lambda I$,$\Phi_m = e^{\lambda m}I$),打分会被整体乘 $e^{2\lambda m}$,softmax 的温度被位置系统性拉伸,深层堆叠后指数失控。"保范"等价于"别让位置项改 softmax 温度",是稳定性筛掉了非旋转解。
相对性的因子化形式本身可以松。 ALiBi(第 5050 篇)就不满足 (1)——位置项不是经由 $q,k$ 各自的编码进内积的,而是直接加在打分结果上。这说明 (1) 是一个充分性框架:凡能写成"编码进 q/k"的方案必为旋转族;写不成的(加性偏置、输入端拼接)在框架之外,各有代价。
小结
函数方程 (1) 把"RoPE 为什么长这样"从工程巧合变成初等分析:线性编码 + 相对位置 ⇒ 柯西方程 ⇒ 反对称生成元 ⇒ 分块旋转。频率铺排是解族里留给设计的自由度,解族本身没有竞争者——这解释了为什么 RoPE 提出后,所有"改进位置编码"的工作都在改频率、改插值、改维度分组,没人改掉"旋转"本身。