旋转位置编码(RoPE)公式详细推导过程
RoPE是从Sinusoidal位置编码改进而来的,因此可先去看Sinusoidal位置编码公式推导过程,再来看本文章,会更好地理解。
旋转位置编码(RoPE)公式推导过程
参考链接
Transformer升级之路:1、Sinusoidal位置编码追根溯源
1. 前置数学公式
1.1 复数的指数形式
复数可以通过欧拉公式表示为:
z
=
r
e
i
θ
=
r
(
cos
(
θ
)
+
i
sin
(
θ
)
)
z = r e^{i\theta} = r(\cos(\theta) + i \sin(\theta))
z=reiθ=r(cos(θ)+isin(θ))
其中,
r
r
r 是复数的模,
θ
\theta
θ 是复数的幅角,
i
i
i 是虚数单位。
1.2 复数的乘法
对于两个复数
z
1
=
r
1
e
i
θ
1
z_1 = r_1 e^{i\theta_1}
z1=r1eiθ1 和
z
2
=
r
2
e
i
θ
2
z_2 = r_2 e^{i\theta_2}
z2=r2eiθ2,它们的乘积为:
z
1
z
2
=
r
1
r
2
e
i
(
θ
1
+
θ
2
)
z_1 z_2 = r_1 r_2 e^{i(\theta_1 + \theta_2)}
z1z2=r1r2ei(θ1+θ2)
1.3 复数的共轭
复数
z
=
r
e
i
θ
z = r e^{i\theta}
z=reiθ 的共轭为:
z
∗
=
r
e
−
i
θ
z^* = r e^{-i\theta}
z∗=re−iθ
1.4 旋转矩阵
二维空间中的旋转矩阵
R
(
θ
)
R(\theta)
R(θ) 用来表示一个向量绕原点旋转
θ
\theta
θ 角度,表示为:
R
(
θ
)
=
(
cos
(
θ
)
−
sin
(
θ
)
sin
(
θ
)
cos
(
θ
)
)
R(\theta) = \begin{pmatrix} \cos(\theta) & -\sin(\theta) \\ \sin(\theta) & \cos(\theta) \end{pmatrix}
R(θ)=(cos(θ)sin(θ)−sin(θ)cos(θ))
R
(
θ
)
R(\theta)
R(θ)是由对一个二维向量$\begin{pmatrix} x \ y \end{pmatrix}
在复数平面上进行旋转
在复数平面上进行旋转
在复数平面上进行旋转\theta$角度得到的,推导过程如下:
z
=
(
c
o
s
(
θ
)
+
i
s
i
n
(
θ
)
)
(
x
+
y
i
)
=
(
c
o
s
(
θ
)
x
+
c
o
s
(
θ
)
y
i
+
s
i
n
(
θ
)
x
i
−
s
i
n
(
θ
)
y
)
=
(
c
o
s
(
θ
)
+
s
i
n
(
θ
)
i
)
x
+
(
−
s
i
n
(
θ
)
+
c
o
s
(
θ
)
i
)
y
=
(
1
,
i
)
(
c
o
s
(
θ
)
x
−
s
i
n
(
θ
)
y
s
i
n
(
θ
)
x
c
o
s
(
θ
)
y
)
=
(
1
,
i
)
(
c
o
s
(
θ
)
−
s
i
n
(
θ
)
s
i
n
(
θ
)
c
o
s
(
θ
)
)
(
x
y
)
\begin{aligned} z &= (cos(\theta) + i sin(\theta))(x + y i) \\ &= (cos(\theta)x + cos(\theta)y i + sin(\theta)xi - sin(\theta)y) \\ &= (cos(\theta) + sin(\theta)i)x + (-sin(\theta) + cos(\theta)i)y \\ &= (1, i) \begin{pmatrix} cos(\theta)x & -sin(\theta)y \\ sin(\theta)x & cos(\theta)y \end{pmatrix} \\ &= (1, i) \begin{pmatrix} cos(\theta) & -sin(\theta) \\ sin(\theta) & cos(\theta) \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix} \end{aligned}
z=(cos(θ)+isin(θ))(x+yi)=(cos(θ)x+cos(θ)yi+sin(θ)xi−sin(θ)y)=(cos(θ)+sin(θ)i)x+(−sin(θ)+cos(θ)i)y=(1,i)(cos(θ)xsin(θ)x−sin(θ)ycos(θ)y)=(1,i)(cos(θ)sin(θ)−sin(θ)cos(θ))(xy)
1.5 旋转矩阵 R θ ⊤ R_{\theta}^{\top} Rθ⊤= R − θ R_{- \theta} R−θ
旋转矩阵 R θ \mathbf{R}_\theta Rθ 是正交矩阵,满足 R θ ⊤ = R − θ \mathbf{R}_\theta^\top = \mathbf{R}_{-\theta} Rθ⊤=R−θ 。具体推导过程如下:
-
正交矩阵的定义:
一个矩阵 Q \mathbf{Q} Q 是正交矩阵,如果它的转置等于它的逆,即:
Q ⊤ = Q − 1 \mathbf{Q}^\top = \mathbf{Q}^{-1} Q⊤=Q−1
这意味着 Q ⊤ Q = I \mathbf{Q}^\top \mathbf{Q} = \mathbf{I} Q⊤Q=I ,其中 I \mathbf{I} I 是单位矩阵。 -
旋转矩阵的形式:
在二维空间中,旋转矩阵 R θ \mathbf{R}_\theta Rθ 用来将一个向量逆时针旋转角度 θ \theta θ ,其形式为:
R θ = [ cos θ − sin θ sin θ cos θ ] \mathbf{R}_\theta = \begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix} Rθ=[cosθsinθ−sinθcosθ] -
计算旋转矩阵的转置:
R θ ⊤ = [ cos θ sin θ − sin θ cos θ ] \mathbf{R}_\theta^\top = \begin{bmatrix} \cos\theta & \sin\theta \\ -\sin\theta & \cos\theta \end{bmatrix} Rθ⊤=[cosθ−sinθsinθcosθ] -
计算旋转矩阵的逆:
将 − θ -\theta −θ 代入旋转矩阵的定义,得到:
R − θ = [ cos ( − θ ) − sin ( − θ ) sin ( − θ ) cos ( − θ ) ] \mathbf{R}_{-\theta} = \begin{bmatrix} \cos(-\theta) & -\sin(-\theta) \\ \sin(-\theta) & \cos(-\theta) \end{bmatrix} R−θ=[cos(−θ)sin(−θ)−sin(−θ)cos(−θ)]
利用三角函数的性质 cos ( − θ ) = cos θ \cos(-\theta) = \cos\theta cos(−θ)=cosθ 和 sin ( − θ ) = − sin θ \sin(-\theta) = -\sin\theta sin(−θ)=−sinθ ,所以:
R − θ = [ cos θ sin θ − sin θ cos θ ] \mathbf{R}_{-\theta} = \begin{bmatrix} \cos\theta & \sin\theta \\ -\sin\theta & \cos\theta \end{bmatrix} R−θ=[cosθ−sinθsinθcosθ] -
比较转置和逆:
R θ ⊤ = R − θ \mathbf{R}_\theta^\top = \mathbf{R}_{-\theta} Rθ⊤=R−θ
这说明旋转矩阵的转置等于其逆矩阵,因此旋转矩阵是正交矩阵。
2. 推导过程
2.1 目标
我们希望通过旋转位置编码(RoPE)来将绝对位置编码转化为相对位置编码。在这个过程中,核心操作是通过旋转来使得位置编码携带相对位置信息。
2.2 假设
为了实现位置编码的相对性,我们假设有如下操作:
- f ( q , m ) f(q, m) f(q,m) 和 f ( k , n ) f(k, n) f(k,n) 分别是对查询向量 q q q 和键向量 k k k 的位置编码操作,目的是使得它们携带位置 m m m 和 n n n 的信息。
- 假设它们满足内积恒等式:
⟨ f ( q , m ) , f ( k , n ) ⟩ = g ( q , k , m − n ) \langle f(q, m), f(k, n) \rangle = g(q, k, m - n) ⟨f(q,m),f(k,n)⟩=g(q,k,m−n)
其中, g ( q , k , m − n ) g(q, k, m - n) g(q,k,m−n) 表示一个与 m − n m - n m−n 相关的函数。
2.3 复数的引入
通过复数来表示向量,我们可以将问题简化。对于复数,内积可以表示为:
⟨
q
,
k
⟩
=
R
e
(
q
k
∗
)
\langle q, k \rangle = \mathrm{Re}(q k^*)
⟨q,k⟩=Re(qk∗)
其中,
q
∗
q^*
q∗ 是
q
q
q 的共轭复数。
因此,我们有:
R
e
(
f
(
q
,
m
)
f
∗
(
k
,
n
)
)
=
g
(
q
,
k
,
m
−
n
)
\mathrm{Re}(f(q, m) f^*(k, n)) = g(q, k, m - n)
Re(f(q,m)f∗(k,n))=g(q,k,m−n)
2.4 使用复数的指数形式
接下来,我们使用复数的指数形式来表示
f
(
q
,
m
)
f(q, m)
f(q,m) 和
f
(
k
,
n
)
f(k, n)
f(k,n):
f
(
q
,
m
)
=
R
f
(
q
,
m
)
e
i
Θ
f
(
q
,
m
)
,
f
(
k
,
n
)
=
R
f
(
k
,
n
)
e
i
Θ
f
(
k
,
n
)
,
g
(
q
,
k
,
m
−
n
)
=
R
g
(
q
,
k
,
m
−
n
)
e
i
Θ
g
(
q
,
k
,
m
−
n
)
f(q, m) = R_f(q, m) e^{i \Theta_f(q, m)}, \quad f(k, n) = R_f(k, n) e^{i \Theta_f(k, n)}, \quad g(q, k, m - n) = R_g(q, k, m - n) e^{i \Theta_g(q, k, m - n)}
f(q,m)=Rf(q,m)eiΘf(q,m),f(k,n)=Rf(k,n)eiΘf(k,n),g(q,k,m−n)=Rg(q,k,m−n)eiΘg(q,k,m−n)
代入方程后得到:
R
f
(
q
,
m
)
R
f
(
k
,
n
)
=
R
g
(
q
,
k
,
m
−
n
)
,
Θ
f
(
q
,
m
)
−
Θ
f
(
k
,
n
)
=
Θ
g
(
q
,
k
,
m
−
n
)
R_f(q, m) R_f(k, n) = R_g(q, k, m - n), \quad \Theta_f(q, m) - \Theta_f(k, n) = \Theta_g(q, k, m - n)
Rf(q,m)Rf(k,n)=Rg(q,k,m−n),Θf(q,m)−Θf(k,n)=Θg(q,k,m−n)
2.5 求解模长
为了使得内积恒等式成立,我们要求解模长部分。代入
m
=
n
m = n
m=n 后,我们得到:
R
f
(
q
,
m
)
R
f
(
k
,
n
)
=
R
g
(
q
,
k
,
0
)
=
R
f
(
q
,
0
)
R
f
(
k
,
0
)
=
∥
q
∥
∥
k
∥
R_f(q, m) R_f(k, n) = R_g(q, k, 0) = R_f(q, 0) R_f(k, 0) = \| q \| \| k \|
Rf(q,m)Rf(k,n)=Rg(q,k,0)=Rf(q,0)Rf(k,0)=∥q∥∥k∥
所以我们可以设定:
R
f
(
q
,
m
)
=
∥
q
∥
,
R
f
(
k
,
n
)
=
∥
k
∥
R_f(q, m) = \| q \|, \quad R_f(k, n) = \| k \|
Rf(q,m)=∥q∥,Rf(k,n)=∥k∥
即它们的模长不依赖于
m
m
m 和
n
n
n。
2.6 求解角度
接下来,我们求解角度部分。代入
m
=
n
m = n
m=n 后得到:
Θ
f
(
q
,
m
)
−
Θ
f
(
k
,
m
)
=
Θ
g
(
q
,
k
,
0
)
=
Θ
f
(
q
,
0
)
−
Θ
f
(
k
,
0
)
=
Θ
(
q
)
−
Θ
(
k
)
\Theta_f(q, m) - \Theta_f(k, m) = \Theta_g(q, k, 0) = \Theta_f(q, 0) - \Theta_f(k, 0) = \Theta(q) - \Theta(k)
Θf(q,m)−Θf(k,m)=Θg(q,k,0)=Θf(q,0)−Θf(k,0)=Θ(q)−Θ(k)
其中,
Θ
(
q
)
Θ(q)
Θ(q) 和
Θ
(
k
)
Θ(k)
Θ(k) 是
q
q
q 和
k
k
k 本身的幅角。由此,我们得到:
Θ
f
(
q
,
m
)
−
Θ
(
q
)
=
Θ
f
(
k
,
m
)
−
Θ
(
k
)
\Theta_f(q, m) - \Theta(q) = \Theta_f(k, m) - \Theta(k)
Θf(q,m)−Θ(q)=Θf(k,m)−Θ(k)
即
Θ
f
(
q
,
m
)
−
Θ
(
q
)
\Theta_f(q, m) - \Theta(q)
Θf(q,m)−Θ(q) 是一个只与
m
m
m 相关、与
q
q
q 无关的函数,记为
φ
(
m
)
φ(m)
φ(m)。因此,
Θ
f
(
q
,
m
)
\Theta_f(q, m)
Θf(q,m) 可以表示为:
Θ
f
(
q
,
m
)
=
Θ
(
q
)
+
φ
(
m
)
\Theta_f(q, m) = \Theta(q) + \varphi(m)
Θf(q,m)=Θ(q)+φ(m)
2.7 得到解
接下来,代入
n
=
m
−
1
n = m - 1
n=m−1,我们可以得到:
φ
(
m
)
−
φ
(
m
−
1
)
=
Θ
g
(
q
,
k
,
1
)
+
Θ
(
k
)
−
Θ
(
q
)
\varphi(m) - \varphi(m - 1) = \Theta_g(q, k, 1) + \Theta(k) - \Theta(q)
φ(m)−φ(m−1)=Θg(q,k,1)+Θ(k)−Θ(q)
即
φ
(
m
)
{ \varphi(m) }
φ(m) 是等差数列,设右端为
θ
θ
θ,我们得到:
φ
(
m
)
=
m
θ
\varphi(m) = m \theta
φ(m)=mθ
2.8 二维编码形式
在二维情形下,RoPE 可以表示为:
f
(
q
,
m
)
=
R
f
(
q
,
m
)
e
i
Θ
f
(
q
,
m
)
=
∥
q
∥
e
i
(
Θ
(
q
)
+
m
θ
)
=
q
e
i
m
θ
f(q, m) = R_f(q, m) e^{i \Theta_f(q, m)} = \| q \| e^{i (\Theta(q) + m \theta)} = q e^{im \theta}
f(q,m)=Rf(q,m)eiΘf(q,m)=∥q∥ei(Θ(q)+mθ)=qeimθ
根据复数乘法的几何意义,该变换实际上对应着向量的旋转,所以我们称之为“旋转式位置编码(ROPE)”,它还可以写成矩阵形式:
f ( q , m ) = ( cos ( m θ ) − sin ( m θ ) sin ( m θ ) cos ( m θ ) ) ( q 0 q 1 ) f(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} f(q,m)=(cos(mθ)sin(mθ)−sin(mθ)cos(mθ))(q0q1)
公式的具体推导过程,可以参考前置数学知识里 1.4 的旋转矩阵公式里的推导过程。
2.8.1 推导公式
已知向量 q \mathbf{q} q、 k \mathbf{k} k,且它们的位置分别为 m m m、 n n n
公式 ( R m q ) ⊤ ( R n k ) = q ⊤ R n − m k (\mathbf{R}_m \mathbf{q})^\top (\mathbf{R}_n \mathbf{k}) = \mathbf{q}^\top \mathbf{R}_{n-m} \mathbf{k} (Rmq)⊤(Rnk)=q⊤Rn−mk 的推导过程
-
展开内积:
( R m q ) ⊤ ( R n k ) = q ⊤ R m ⊤ R n k (\mathbf{R}_m \mathbf{q})^\top (\mathbf{R}_n \mathbf{k}) = \mathbf{q}^\top \mathbf{R}_m^\top \mathbf{R}_n \mathbf{k} (Rmq)⊤(Rnk)=q⊤Rm⊤Rnk -
利用旋转矩阵的性质:
旋转矩阵 R θ \mathbf{R}_\theta Rθ 是正交矩阵,满足 R θ ⊤ = R − θ \mathbf{R}_\theta^\top = \mathbf{R}_{-\theta} Rθ⊤=R−θ(具体证明过程可看1.6的内容)。因此:
R m ⊤ = R − m \mathbf{R}_m^\top = \mathbf{R}_{-m} Rm⊤=R−m -
代入旋转矩阵的性质:
q ⊤ R m ⊤ R n k = q ⊤ R − m R n k \mathbf{q}^\top \mathbf{R}_m^\top \mathbf{R}_n \mathbf{k} = \mathbf{q}^\top \mathbf{R}_{-m} \mathbf{R}_n \mathbf{k} q⊤Rm⊤Rnk=q⊤R−mRnk -
利用旋转矩阵的加法性质:
旋转矩阵的乘积对应角度的相加,即 R − m R n = R n − m \mathbf{R}_{-m} \mathbf{R}_n = \mathbf{R}_{n-m} R−mRn=Rn−m。因此:
q ⊤ R − m R n k = q ⊤ R n − m k \mathbf{q}^\top \mathbf{R}_{-m} \mathbf{R}_n \mathbf{k} = \mathbf{q}^\top \mathbf{R}_{n-m} \mathbf{k} q⊤R−mRnk=q⊤Rn−mk
最终得到:
(
R
m
q
)
⊤
(
R
n
k
)
=
q
⊤
R
n
−
m
k
(\mathbf{R}_m \mathbf{q})^\top (\mathbf{R}_n \mathbf{k}) = \mathbf{q}^\top \mathbf{R}_{n-m} \mathbf{k}
(Rmq)⊤(Rnk)=q⊤Rn−mk
解释
- 旋转矩阵的正交性:旋转矩阵 R θ \mathbf{R}_\theta Rθ 是正交矩阵,满足 R θ ⊤ R θ = I \mathbf{R}_\theta^\top \mathbf{R}_\theta = \mathbf{I} Rθ⊤Rθ=I,因此 R θ ⊤ = R − θ \mathbf{R}_\theta^\top = \mathbf{R}_{-\theta} Rθ⊤=R−θ。
- 旋转矩阵的加法性质:旋转矩阵的乘积对应角度的相加,即 R θ R ϕ = R θ + ϕ \mathbf{R}_\theta \mathbf{R}_\phi = \mathbf{R}_{\theta+\phi} RθRϕ=Rθ+ϕ。
这些性质在推导过程中起到了关键作用,使得我们可以将旋转矩阵的乘积简化为一个单一的旋转矩阵。
公式 R m q ⋅ R n k = q ⋅ k ⋅ cos ( ( m − n ) θ ) \mathbf{\mathbf{R}_m \mathbf{q} \cdot \mathbf{R}_n \mathbf{k} = \mathbf{q} \cdot \mathbf{k} \cdot \cos((m - n)\theta)} Rmq⋅Rnk=q⋅k⋅cos((m−n)θ) 的推导过程
利用内积的几何意义:
-
旋转矩阵保持向量的长度不变,即 ∥ R m q ∥ = ∥ q ∥ \|\mathbf{R}_m \mathbf{q}\| = \|\mathbf{q}\| ∥Rmq∥=∥q∥ 和 ∥ R n k ∥ = ∥ k ∥ \|\mathbf{R}_n \mathbf{k}\| = \|\mathbf{k}\| ∥Rnk∥=∥k∥ 。
-
旋转后的向量内积可以表示为:
R m q ⋅ R n k = ∥ R m q ∥ ∥ R n k ∥ cos ( ( m − n ) θ ) = ∥ q ∥ ∥ k ∥ cos ( ( m − n ) θ ) \mathbf{R}_m \mathbf{q} \cdot \mathbf{R}_n \mathbf{k} = \|\mathbf{R}_m \mathbf{q}\| \|\mathbf{R}_n \mathbf{k}\| \cos((m - n)\theta) = \|\mathbf{q}\| \|\mathbf{k}\| \cos((m - n)\theta) Rmq⋅Rnk=∥Rmq∥∥Rnk∥cos((m−n)θ)=∥q∥∥k∥cos((m−n)θ) -
由于 q ⋅ k = ∥ q ∥ ∥ k ∥ cos α \mathbf{q} \cdot \mathbf{k} = \|\mathbf{q}\| \|\mathbf{k}\| \cos \alpha q⋅k=∥q∥∥k∥cosα ,其中 α \alpha α 是 q \mathbf{q} q 和 k \mathbf{k} k 之间的夹角,所以:
R m q ⋅ R n k = ( q ⋅ k ) ⋅ cos ( ( m − n ) θ ) \mathbf{R}_m \mathbf{q} \cdot \mathbf{R}_n \mathbf{k} = (\mathbf{q} \cdot \mathbf{k}) \cdot \cos((m - n)\theta) Rmq⋅Rnk=(q⋅k)⋅cos((m−n)θ) -
某些情况下上式也可化简为:
R m q ⋅ R n k = ( q ⋅ k ) ⋅ cos ( θ ) \mathbf{R}_m \mathbf{q} \cdot \mathbf{R}_n \mathbf{k} = (\mathbf{q} \cdot \mathbf{k}) \cdot \cos(\theta) Rmq⋅Rnk=(q⋅k)⋅cos(θ)
2.9 跟Sinusoidal公式比较
Sinusoidal的复数形式的公式如下:
p
m
=
x
+
y
i
p_m = x + y i
pm=x+yi
以向量形式表示为
p
m
=
(
x
y
)
p_m = \begin{pmatrix} x \\ y \end{pmatrix}
pm=(xy)
跟 RoPE 的公式比较可以看出来,RoPE 多了旋转操作,也就是左边多乘了
cos
(
m
θ
)
+
i
sin
(
m
θ
)
\cos(m \theta) + i\sin(m \theta)
cos(mθ)+isin(mθ),因此 RoPE 在左边多了个旋转矩阵
2.10 多维情况
由于内积满足线性叠加性,因此任意偶数维的RoPE,我们都可以表示为二维情形的拼接,即:
R m = ( cos ( m θ 0 ) − sin ( m θ 0 ) 0 0 ⋯ 0 0 sin ( m θ 0 ) cos ( m θ 0 ) 0 0 ⋯ 0 0 0 0 cos ( m θ 1 ) − sin ( m θ 1 ) ⋯ 0 0 0 0 sin ( m θ 1 ) cos ( m θ 1 ) ⋯ 0 0 ⋮ ⋮ ⋮ ⋮ ⋱ ⋮ ⋮ 0 0 0 0 ⋯ cos ( m θ d 2 − 1 ) − sin ( m θ d 2 − 1 ) 0 0 0 0 ⋯ sin ( m θ d 2 − 1 ) cos ( m θ d 2 − 1 ) ) R_m = \begin{pmatrix} \cos(m\theta_0) & -\sin(m\theta_0) & 0 & 0 & \cdots & 0 & 0 \\ \sin(m\theta_0) & \cos(m\theta_0) & 0 & 0 & \cdots & 0 & 0 \\ 0 & 0 & \cos(m\theta_1) & -\sin(m\theta_1) & \cdots & 0 & 0 \\ 0 & 0 & \sin(m\theta_1) & \cos(m\theta_1) & \cdots & 0 & 0 \\ \vdots & \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & 0 & 0 & 0 & \cdots & \cos(m\theta_{\frac{d}{2} - 1}) & -\sin(m\theta_{\frac{d}{2} - 1}) \\ 0 & 0 & 0 & 0 & \cdots & \sin(m\theta_{\frac{d}{2} - 1}) & \cos(m\theta_{\frac{d}{2} - 1}) \\ \end{pmatrix} Rm= cos(mθ0)sin(mθ0)00⋮00−sin(mθ0)cos(mθ0)00⋮0000cos(mθ1)sin(mθ1)⋮0000−sin(mθ1)cos(mθ1)⋮00⋯⋯⋯⋯⋱⋯⋯0000⋮cos(mθ2d−1)sin(mθ2d−1)0000⋮−sin(mθ2d−1)cos(mθ2d−1)
R m ( q 0 q 1 q 2 q 3 ⋮ q d − 2 q d − 1 ) R_m \begin{pmatrix} q_0 \\ q_1 \\ q_2 \\ q_3 \\ \vdots \\ q_{d-2} \\ q_{d-1} \end{pmatrix} Rm q0q1q2q3⋮qd−2qd−1
也就是说,给位置为 m m m的向量 q q q乘上矩阵 R m R_m Rm、位置为 n n n的向量 k k k乘上矩阵 R n R_n Rn,用变换后的 Q Q Q、 K K K序列做Attention,那么Attention就自动包含相对位置信息了,因为成立恒等式:
( R m q ) ⊤ ( R n k ) = q ⊤ R m ⊤ R n k = q ⊤ R m − n k (R_m q)^\top (R_n k) = q^\top R_m^\top R_n k = q^\top R_{m-n} k (Rmq)⊤(Rnk)=q⊤Rm⊤Rnk=q⊤Rm−nk
值得指出的是, R m R_m Rm是一个正交矩阵,它不会改变向量的模长,因此通常来说它不会改变原模型的稳定性。
由于 R m R_m Rm的稀疏性,所以直接用矩阵乘法来实现会很浪费算力,推荐通过下述方式来实现RoPE:
( q 0 q 1 q 2 q 3 ⋮ q d − 2 q d − 1 ) ⊙ ( cos ( m θ 0 ) cos ( m θ 0 ) cos ( m θ 1 ) cos ( m θ 1 ) ⋮ cos ( m θ d 2 − 1 ) cos ( m θ d 2 − 1 ) ) + ( − q 1 q 0 − q 3 q 2 ⋮ − q d − 1 q d − 2 ) ⊙ ( sin ( m θ 0 ) sin ( m θ 0 ) sin ( m θ 1 ) sin ( m θ 1 ) ⋮ sin ( m θ d 2 − 1 ) sin ( m θ d 2 − 1 ) ) \begin{pmatrix} q_0 \\ q_1 \\ q_2 \\ q_3 \\ \vdots \\ q_{d-2} \\ q_{d-1} \end{pmatrix} \odot \begin{pmatrix} \cos(m\theta_0) \\ \cos(m\theta_0) \\ \cos(m\theta_1) \\ \cos(m\theta_1) \\ \vdots \\ \cos(m\theta_{\frac{d}{2} - 1}) \\ \cos(m\theta_{\frac{d}{2} - 1}) \end{pmatrix} + \begin{pmatrix} -q_1 \\ q_0 \\ -q_3 \\ q_2 \\ \vdots \\ -q_{d-1} \\ q_{d-2} \end{pmatrix} \odot \begin{pmatrix} \sin(m\theta_0) \\ \sin(m\theta_0) \\ \sin(m\theta_1) \\ \sin(m\theta_1) \\ \vdots \\ \sin(m\theta_{\frac{d}{2} - 1}) \\ \sin(m\theta_{\frac{d}{2} - 1}) \end{pmatrix} q0q1q2q3⋮qd−2qd−1 ⊙ cos(mθ0)cos(mθ0)cos(mθ1)cos(mθ1)⋮cos(mθ2d−1)cos(mθ2d−1) + −q1q0−q3q2⋮−qd−1qd−2 ⊙ sin(mθ0)sin(mθ0)sin(mθ1)sin(mθ1)⋮sin(mθ2d−1)sin(mθ2d−1)
变量说明:
-
q = ( q 0 q 1 q 2 q 3 ⋮ q d − 2 q d − 1 ) \mathbf{q} = \begin{pmatrix} q_0 \\ q_1 \\ q_2 \\ q_3 \\ \vdots \\ q_{d-2} \\ q_{d-1} \end{pmatrix} q= q0q1q2q3⋮qd−2qd−1 :
- 这是位置编码向量,其中 q 0 , q 1 , … , q d − 1 q_0, q_1, \ldots, q_{d-1} q0,q1,…,qd−1 是位置编码向量的每一个分量。
- d d d 是位置编码的维度。通常 d d d 为偶数,且每个维度对应一个不同的频率。
- 每个 q i q_i qi 表示一个位置编码的分量,通常由某种方法(如正弦波或余弦波)生成,表示位置在某种空间中的表示。
-
θ i \theta_i θi:
- 这是旋转角度,控制了在不同维度上的位置编码旋转程度。旋转角度通常通过以下公式计算:
θ i = 1000 0 − 2 i d \theta_i = 10000^{\frac{-2i}{d}} θi=10000d−2i - θ i \theta_i θi 控制了在每个维度上的旋转,通常在高维空间中,这种旋转带来远程位置编码的衰减效应,即随着维度的增加,远离当前位置的编码向量的内积趋近于0。
- i i i 表示第 i i i 个旋转角度,它跟偶数维向量的第 j j j个维度的关系是 i = ⌊ j 2 ⌋ i = \left\lfloor \frac{j}{2} \right\rfloor i=⌊2j⌋
- d d d 是位置编码向量的总维度。
- 这是旋转角度,控制了在不同维度上的位置编码旋转程度。旋转角度通常通过以下公式计算:
-
m m m:
- m m m 是一个常数,它是输入序列里的第 m m m个位置。
-
⊙ \odot ⊙:
- 这是表示逐位对应相乘的符号,也称为哈达玛积(Hadamard Product)。即两个向量中的对应元素按元素相乘。
2.10.1 乘性位置编码的变体
从这个实现也可以看到,RoPE 可以视为是乘性位置编码的变体。
3. 总结
通过复数的指数形式和旋转矩阵,我们将位置编码转化为旋转形式,从而实现了相对位置编码。通过旋转,位置之间的相对关系可以被有效地编码,并且可以在计算注意力时使用。