λLLM Wiki

Rotary Position Embedding

旋转位置编码(Rotary Position Embedding, RoPE) 是 Su et al. (2021) 提出的位置编码方案。核心思想是:对 Q 和 K 向量施加一个与位置成正比的旋转,使得注意力内积自然只依赖相对位置,而无需显式计算位置差。RoPE 已成为 LLaMA、Qwen、DeepSeek 等主流 LLM 的标准位置编码。

出发点

Transformer 的 self-attention 本身是置换不变的——打乱 token 顺序,attention 输出不变。位置编码的作用就是打破这种对称性,让模型感知 token 的顺序。

理想的位置编码应满足:Q 和 K 的内积只依赖词向量本身和它们之间的相对位置 mnm - n

fq(xm,m),  fk(xn,n)=g(xm,xn,mn)\langle f_q(x_m, m),\; f_k(x_n, n) \rangle = g(x_m, x_n, m - n)

原始 Transformer 的正弦位置编码是加法的(x+px + p),展开内积 (x+p)(x+p)(x+p)^\top(x'+p') 后会产生交叉项 xp+pxx^\top p' + p^\top x',无法干净地只依赖相对位置。RoPE 用**乘法(旋转)**解决了这个问题。

二维情形的完整推导

d=2d = 2 的情形出发最容易理解。在复平面上,一个二维向量可以表示为复数 z=reiφz = r\, e^{i\varphi}

第一步:建立约束方程

设位置 mm 处的 query 编码函数为 fq(xm,m)f_q(x_m, m),位置 nn 处的 key 编码函数为 fk(xn,n)f_k(x_n, n)初始条件是位置 0 不编码任何位置信息:

fq(xm,0)=Wqxm=q,fk(xn,0)=Wkxn=kf_q(x_m, 0) = W_q x_m = q, \quad f_k(x_n, 0) = W_k x_n = k

需要满足的相对位置约束为:

Re[fq(xm,m)fk(xn,n)]=g(xm,xn,mn)\text{Re}\left[f_q(x_m, m) \cdot f_k(x_n, n)^*\right] = g(x_m, x_n, m - n)

其中 {}^* 为复数共轭。右侧函数 gg 只依赖相对位置 mnm - n

第二步:极坐标分解

fqf_qfkf_kgg 分别写成模(半径)和辐角的乘积:

fq(xq,m)=Rq(xq,m)  eiΘq(xq,m)f_q(x_q, m) = R_q(x_q, m)\; e^{i\,\Theta_q(x_q, m)}

fk(xk,n)=Rk(xk,n)  eiΘk(xk,n)f_k(x_k, n) = R_k(x_k, n)\; e^{i\,\Theta_k(x_k, n)}

g(xq,xk,mn)=Rg(xq,xk,mn)  eiΘg(xq,xk,mn)g(x_q, x_k, m-n) = R_g(x_q, x_k, m-n)\; e^{i\,\Theta_g(x_q, x_k, m-n)}

代入约束方程,将模和辐角分开,得到两个独立约束:

R_q(x_q, m) \cdot R_k(x_k, n) = R_g(x_q, x_k, m - n) \tag{模约束}

\Theta_k(x_k, n) - \Theta_q(x_q, m) = \Theta_g(x_q, x_k, m - n) \tag{辐角约束}

第三步:证明模与位置无关

在模约束中令 m=nm = n

Rq(xq,m)Rk(xk,m)=Rg(xq,xk,0)R_q(x_q, m) \cdot R_k(x_k, m) = R_g(x_q, x_k, 0)

右侧 Rg(,,0)R_g(\cdot, \cdot, 0) 是常数(不依赖 mm)。再利用初始条件 Rq(xq,0)=qR_q(x_q, 0) = \|q\|Rk(xk,0)=kR_k(x_k, 0) = \|k\|,最简单的满足条件的解是:

Rq(xq,m)=q,Rk(xk,n)=kR_q(x_q, m) = \|q\|, \quad R_k(x_k, n) = \|k\|

模与位置完全无关,旋转不改变向量的长度。

第四步:证明辐角线性增长

在辐角约束中同样令 m=nm = n

Θk(xk,m)Θq(xq,m)=Θg(xq,xk,0)=θkθq\Theta_k(x_k, m) - \Theta_q(x_q, m) = \Theta_g(x_q, x_k, 0) = \theta_k - \theta_q

这说明 Θq(xq,m)θq=Θk(xk,m)θk\Theta_q(x_q, m) - \theta_q = \Theta_k(x_k, m) - \theta_k,辐角的”位置偏移量”与词向量 xx 无关。记这个公共的位置偏移为 ϕ(m)\phi(m)

Θq(xq,m)=ϕ(m)+θq,Θk(xk,n)=ϕ(n)+θk\Theta_q(x_q, m) = \phi(m) + \theta_q, \quad \Theta_k(x_k, n) = \phi(n) + \theta_k

现在把 n=m+1n = m + 1 代入辐角约束:

[ϕ(m+1)+θk][ϕ(m)+θq]=Θg(xq,xk,1)[\phi(m+1) + \theta_k] - [\phi(m) + \theta_q] = \Theta_g(x_q, x_k, 1)

ϕ(m+1)ϕ(m)=Θg(xq,xk,1)+θqθk\phi(m+1) - \phi(m) = \Theta_g(x_q, x_k, 1) + \theta_q - \theta_k

右侧是一个与 mm 无关的常数。这意味着 ϕ(m)\phi(m) 的相邻差为常数——ϕ\phi 是一个等差数列

ϕ(m)=mθ+γ\phi(m) = m\theta + \gamma

其中 θ\theta 是公差(旋转角速度),γ\gamma 是一个常数偏移(取 γ=0\gamma = 0 不失一般性)。

第五步:得到最终形式

综合第三步(模不变)和第四步(辐角线性):

fq(xm,m)=(Wqxm)  eimθ,fk(xn,n)=(Wkxn)  einθ\boxed{f_q(x_m, m) = (W_q x_m)\; e^{im\theta}, \quad f_k(x_n, n) = (W_k x_n)\; e^{in\theta}}

验证内积:

fqfk=(Wqxm)  eimθ(Wkxn)  einθ=(Wqxm)(Wkxn)ei(mn)θf_q \cdot f_k^* = (W_q x_m)\; e^{im\theta} \cdot (W_k x_n)^*\; e^{-in\theta} = (W_q x_m)(W_k x_n)^* \cdot e^{i(m-n)\theta}

取实部后:

fq,fk=Re[(Wqxm)(Wkxn)ei(mn)θ]=g(xm,xn,mn)\langle f_q, f_k \rangle = \text{Re}\left[(W_q x_m)(W_k x_n)^* \cdot e^{i(m-n)\theta}\right] = g(x_m, x_n, m-n) \quad \checkmark

确实只依赖相对位置 mnm - n

二维矩阵形式

复数乘法 zeiαz \cdot e^{i\alpha} 等价于二维旋转矩阵:

eiα(ab)        (cosαsinαsinαcosα)(ab)e^{i\alpha} \cdot \begin{pmatrix} a \\ b \end{pmatrix} \;\;\leftrightarrow\;\; \begin{pmatrix} \cos\alpha & -\sin\alpha \\ \sin\alpha & \cos\alpha \end{pmatrix} \begin{pmatrix} a \\ b \end{pmatrix}

因此:

f(xm,m)=(cosmθsinmθsinmθcosmθ)RmθWxmf(x_m, m) = \underbrace{\begin{pmatrix} \cos m\theta & -\sin m\theta \\ \sin m\theta & \cos m\theta \end{pmatrix}}_{R_{m\theta}} W x_m

几何直觉:线性投影 WxWx 得到一个二维向量,然后绕原点旋转 mθm\theta 角度。位置 0 不旋转,位置 1 旋转 θ\theta,位置 2 旋转 2θ2\theta,依此类推。计算两个位置的内积时,旋转角度相减,只剩相对旋转 (mn)θ(m-n)\theta

推广到 dd

dd 维无法直接做”一次旋转”,但可以拆成 d/2d/2独立的二维子空间,每个子空间用不同频率 θi\theta_i 做独立旋转。

编码函数:

f{q,k}(xm,m)=RΘ,md  W{q,k}  xmf_{\{q,k\}}(x_m, m) = R^d_{\Theta,m}\; W_{\{q,k\}}\; x_m

其中 RΘ,mdR^d_{\Theta,m}分块对角旋转矩阵(block-diagonal rotation matrix)

RΘ,md=(cosmθ1sinmθ1sinmθ1cosmθ1cosmθ2sinmθ2sinmθ2cosmθ2)R^d_{\Theta,m} = \begin{pmatrix} \cos m\theta_1 & -\sin m\theta_1 & & & \\ \sin m\theta_1 & \cos m\theta_1 & & & \\ & & \cos m\theta_2 & -\sin m\theta_2 & \\ & & \sin m\theta_2 & \cos m\theta_2 & \\ & & & & \ddots \end{pmatrix}

频率参数:

θi=100002(i1)/d,i[1,d/2]\theta_i = 10000^{-2(i-1)/d}, \quad i \in [1,\, d/2]

这组频率与原始 Transformer 正弦编码完全相同。θ1\theta_1 最大(高频,旋转快),θd/2\theta_{d/2} 最小(低频,旋转慢)。直觉上,低维子空间编码精细的局部位置,高维子空间编码粗粒度的全局位置。

验证相对位置性

qmkn=(RΘ,mdWqxm)(RΘ,ndWkxn)=xmWq(RΘ,md)RΘ,ndRΘ,nmdWkxnq_m^\top k_n = (R^d_{\Theta,m} W_q x_m)^\top (R^d_{\Theta,n} W_k x_n) = x_m^\top W_q^\top \underbrace{(R^d_{\Theta,m})^\top R^d_{\Theta,n}}_{R^d_{\Theta,\,n-m}} W_k x_n

由于每个 2×22 \times 2 旋转块是正交矩阵(orthogonal matrix)

(Rmθ)Rnθ=R(nm)θ(R_{m\theta})^\top R_{n\theta} = R_{(n-m)\theta}

所以整个分块对角矩阵也满足 (RΘ,md)RΘ,nd=RΘ,nmd(R^d_{\Theta,m})^\top R^d_{\Theta,n} = R^d_{\Theta,\,n-m}。内积只依赖相对位置 nmn - m

具体数值示例

d=4d = 4(2 个子空间)为例,展示 RoPE 前后向量的变化。

设频率 θ1=1.0\theta_1 = 1.0θ2=0.01\theta_2 = 0.01(简化取值)。设经过线性投影后,位置 m=3m = 3 处的 Q 向量为:

q=Wqx3=(1.00.50.80.3)q = W_q x_3 = \begin{pmatrix} 1.0 \\ 0.5 \\ 0.8 \\ -0.3 \end{pmatrix}

RoPE 对每个二维子空间独立旋转:

子空间 1(维度 0-1),旋转角度 3×θ1=3.03 \times \theta_1 = 3.0 rad:

(cos3.0sin3.0sin3.0cos3.0)(1.00.5)=(0.9190.641)\begin{pmatrix} \cos 3.0 & -\sin 3.0 \\ \sin 3.0 & \cos 3.0 \end{pmatrix} \begin{pmatrix} 1.0 \\ 0.5 \end{pmatrix} = \begin{pmatrix} -0.919 \\ 0.641 \end{pmatrix}

子空间 2(维度 2-3),旋转角度 3×θ2=0.033 \times \theta_2 = 0.03 rad:

(cos0.03sin0.03sin0.03cos0.03)(0.80.3)=(0.8080.276)\begin{pmatrix} \cos 0.03 & -\sin 0.03 \\ \sin 0.03 & \cos 0.03 \end{pmatrix} \begin{pmatrix} 0.8 \\ -0.3 \end{pmatrix} = \begin{pmatrix} 0.808 \\ -0.276 \end{pmatrix}

RoPE 后的 Q 向量:

q3=RΘ,34  q=(0.9190.6410.8080.276)q_3 = R^4_{\Theta,3}\; q = \begin{pmatrix} -0.919 \\ 0.641 \\ 0.808 \\ -0.276 \end{pmatrix}

观察:

  • 高频子空间(维度 0-1):旋转了 3 弧度(约 172°),向量方向剧烈变化。相邻位置之间差异大,编码精细的局部位置信息。
  • 低频子空间(维度 2-3):旋转了 0.03 弧度(约 1.7°),向量几乎不变。远距离位置之间才有明显差异,编码粗粒度的全局位置信息。
  • 向量模长不变:旋转前 q=1.02+0.52+0.82+0.321.386\|q\| = \sqrt{1.0^2 + 0.5^2 + 0.8^2 + 0.3^2} \approx 1.386,旋转后模长仍为 1.3861.386

不同位置的 Q 向量对比

假设同一个词出现在不同位置,投影后都得到相同的 q=(1.0,  0.5,  0.8,  0.3)q = (1.0,\; 0.5,\; 0.8,\; -0.3)^\top

位置 mm子空间 1 旋转角子空间 2 旋转角旋转后 qmq_m
00 rad0 rad(1.000,  0.500,  0.800,  0.300)(1.000,\; 0.500,\; 0.800,\; -0.300)
11.0 rad0.01 rad(0.311,  1.112,  0.803,  0.292)(0.311,\; 1.112,\; 0.803,\; -0.292)
22.0 rad0.02 rad(0.567,  1.045,  0.806,  0.284)(-0.567,\; 1.045,\; 0.806,\; -0.284)
33.0 rad0.03 rad(0.919,  0.641,  0.808,  0.276)(-0.919,\; 0.641,\; 0.808,\; -0.276)

可以看到:高频子空间(前两维)随位置快速变化,低频子空间(后两维)几乎不动。这与人类阅读的直觉一致——附近的词需要精确区分位置,远处的词只需要大致的距离感。

高效实现

RΘ,mdR^d_{\Theta,m} 是极度稀疏的分块对角矩阵,不需要做完整的 d×dd \times d 矩阵乘法。展开单个 2×22 \times 2 旋转块的计算:

(cosαsinαsinαcosα)(x1x2)=(x1cosαx2sinαx2cosα+x1sinα)\begin{pmatrix} \cos\alpha & -\sin\alpha \\ \sin\alpha & \cos\alpha \end{pmatrix} \begin{pmatrix} x_1 \\ x_2 \end{pmatrix} = \begin{pmatrix} x_1 \cos\alpha - x_2 \sin\alpha \\ x_2 \cos\alpha + x_1 \sin\alpha \end{pmatrix}

写成逐元素操作:

=(x1x2)(cosαcosα)+(x2x1)(sinαsinα)= \begin{pmatrix} x_1 \\ x_2 \end{pmatrix} \odot \begin{pmatrix} \cos\alpha \\ \cos\alpha \end{pmatrix} + \begin{pmatrix} -x_2 \\ x_1 \end{pmatrix} \odot \begin{pmatrix} \sin\alpha \\ \sin\alpha \end{pmatrix}

推广到 dd 维,实际实现只需两次逐元素乘法(Hadamard product) + 一次加法

RΘ,md  x=xcos(mΘ)+rotate_half(x)sin(mΘ)R^d_{\Theta,m}\; x = x \odot \cos(m\Theta) + \text{rotate\_half}(x) \odot \sin(m\Theta)

其中 rotate_half\text{rotate\_half} 将相邻维度对交换并取负:

(x1,x2,x3,x4,)rotate_half(x2,x1,x4,x3,)(x_1, x_2, x_3, x_4, \dots) \xrightarrow{\text{rotate\_half}} (-x_2, x_1, -x_4, x_3, \dots)

计算开销极低,与维度 dd 线性相关,不引入任何可学习参数。

长距离衰减

RoPE 下的注意力内积可以用复数形式写成:

qmkn=Re[i=0d/21hiei(mn)θi]q_m^\top k_n = \text{Re}\left[\sum_{i=0}^{d/2-1} h_i \cdot e^{i(m-n)\theta_i}\right]

其中 hi=q[2i:2i+1]k[2i:2i+1]h_i = q_{[2i:2i+1]} \cdot k^*_{[2i:2i+1]} 是第 ii 个子空间的”局部内积”。

通过 Abel 求和变换可以证明:在频率 θi=100002i/d\theta_i = 10000^{-2i/d} 下,上式的幅度随 mn|m - n| 增大而单调衰减

直觉上:当 mn|m - n| 增大时,各子空间的旋转因子 ei(mn)θie^{i(m-n)\theta_i} 的相位越来越分散,相消干涉使得求和值趋近于零。这意味着 RoPE 隐含了一种”近处关注多、远处关注少”的归纳偏置。

与原始正弦编码的对比

正弦位置编码RoPE
作用方式加法x+px + p乘法(旋转)RmWxR_m \cdot Wx
作用对象输入 embeddingQ 和 K 向量
相对位置隐含但不干净(有交叉项)严格只依赖相对位置
频率参数θi=100002i/d\theta_i = 10000^{-2i/d}相同
保范数是(正交变换)

加法编码的问题具体展开:(x+p)(x+p)=xx+xp+px+pp(x+p)^\top(x'+p') = x^\top x' + x^\top p' + p^\top x' + p^\top p'。其中 xpx^\top p'pxp^\top x' 是词向量和”错位”位置编码的交叉项,它们既不只依赖内容、也不只依赖位置,破坏了相对位置的干净性。

长度外推

RoPE 本身在训练长度内效果优异,但直接外推到更长序列时性能会退化——高频维度的旋转角度超出训练分布。常见的外推扩展方法:

  • NTK-aware Scaling:缩放频率基数(如将 10000 放大到更大的值),等效于”减速旋转”,使高频维度不至于旋转过快
  • YaRN:结合 NTK scaling 和注意力温度缩放
  • Dynamic NTK:根据实际序列长度动态调整基数

这些方法使 RoPE 能在推理时处理数倍于训练长度的序列。

相关页面

Comments