RoPE旋转位置编码从复数到欧拉公式

第二部分 从复数到欧拉公式
先复习下复数的一些关键概念

我们一般用表示复数,实数a叫做复数的实部,实数b叫做复数的虚部


复数的辐角是指复数在复平面上对应的向量和正向实数轴所成的有向角


的共轭复数定义为:,也可记作,复数与其共轭的乘积等于它的模的平方,即,这是一个实数


2.1 如何通俗易懂的理解复数


在我们的日常生活中,经常会遇到各种平移运动,为了描述这些平移运动,数学上定义了加减乘除,然还有一类运动是旋转运动,而加减乘除无法去描述旋转运动,而有了复数之后,便不一样了,此话怎讲?

根据复数的定义:

,可以看出来:
,而这个展开过程就揭示了虚数 i 背后的本质,因为这个展开过程中的两次乘法可以看成连续的操作,即把 1 经过2次完全一样的操作:× i × 𝑖
,变成了 −1 ,那什么样的操作能得到这个效果呢?
你两眼一亮,直呼:旋转啊,先旋转 90度,再旋转 90 度就可以了啊,如下图所示


so,i
𝑖
 就代表了旋转(至此,可能你已经隐隐约约意识到,为何我们在解释旋转位置编码时,为何要扯上复数了),为形象说明,再举两个例子

比如对于
,自然数 1,绕坐标中心旋转180度
),再平移1 ,就回到坐标原点
再比如对于(a+bi)i=−b+ai
(
𝑎
+
𝑏
𝑖
)
𝑖
=

𝑏
+
𝑎
𝑖


2.2 如何快速理解欧拉公式
2.2.1 什么是欧拉公式
当x
𝑥
 表示任意实数,e
𝑒
 是自然对数的底数,i
𝑖
 是复数中的虚数单位,则根据欧拉公式有

eix=cosx+isinx
𝑒
𝑖
𝑥
=
cos

𝑥
+
𝑖
sin

𝑥

表达的含义在于该指数函数可以表示为实部为cosx
𝑐
𝑜
𝑠
𝑥
,虚部为sinx
𝑠
𝑖
𝑛
𝑥
的一个复数

该欧拉公式相当于建立了指数函数、三角函数和复数之间的桥梁,但怎么推导出来的呢,其实很简单

由于有
ex=1+x+12!x2+13!x3+⋯
𝑒
𝑥
=
1
+
𝑥
+
1
2
!
𝑥
2
+
1
3
!
𝑥
3
+

sin(x)=x−13!x3+15!x5+⋯
sin

(
𝑥
)
=
𝑥

1
3
!
𝑥
3
+
1
5
!
𝑥
5
+

cos(x)=1−12!x2+14!x4+⋯
cos

(
𝑥
)
=
1

1
2
!
𝑥
2
+
1
4
!
𝑥
4
+

所以,如果x=iθ
𝑥
=
𝑖
𝜃
 ,则有
eiθ=1+iθ+(iθ)22!+(iθ)33!+(iθ)44!+(iθ)55!+(iθ)66!+(iθ)77!+(iθ)88!+⋯=1+iθ−θ22!−iθ33!+θ44!+iθ55!−θ66!−iθ77!+θ88!+⋯=(1−θ22!+θ44!−θ66!+θ88!−⋯)+i(θ−θ33!+θ55!−θ77!+⋯)=cosθ+isinθ
𝑒
𝑖
𝜃
=
1
+
𝑖
𝜃
+
(
𝑖
𝜃
)
2
2
!
+
(
𝑖
𝜃
)
3
3
!
+
(
𝑖
𝜃
)
4
4
!
+
(
𝑖
𝜃
)
5
5
!
+
(
𝑖
𝜃
)
6
6
!
+
(
𝑖
𝜃
)
7
7
!
+
(
𝑖
𝜃
)
8
8
!
+

=
1
+
𝑖
𝜃

𝜃
2
2
!

𝑖
𝜃
3
3
!
+
𝜃
4
4
!
+
𝑖
𝜃
5
5
!

𝜃
6
6
!

𝑖
𝜃
7
7
!
+
𝜃
8
8
!
+

=
(
1

𝜃
2
2
!
+
𝜃
4
4
!

𝜃
6
6
!
+
𝜃
8
8
!


)
+
𝑖
(
𝜃

𝜃
3
3
!
+
𝜃
5
5
!

𝜃
7
7
!
+

)
=
cos

𝜃
+
𝑖
sin

𝜃

2.2.2 欧拉公式与三角函数
如何直观的理解这个欧拉公式呢?

其实,可以把eiθ
𝑒
𝑖
𝜃
看作通过单位圆的圆周运动来描述单位圆上的点,cosθ+isinθ
cos

𝜃
+
𝑖
sin

𝜃
通过复平面的坐标来描述单位圆上的点,是同一个点不同的描述方式,所以有eiθ=cosθ+isinθ
𝑒
𝑖
𝜃
=
cos

𝜃
+
𝑖
sin

𝜃
,如下图所示

根据欧拉公式eiθ=cosθ+isinθ
𝑒
𝑖
𝜃
=
cos

𝜃
+
𝑖
sin

𝜃
,可以轻易推出:

sinθ=eiθ−e−iθ2i
sin

𝜃
=
𝑒
𝑖
𝜃

𝑒

𝑖
𝜃
2
𝑖

cosθ=eiθ+e−iθ2
cos

𝜃
=
𝑒
𝑖
𝜃
+
𝑒

𝑖
𝜃
2

我们把复数当作向量来看待,复数的实部是x
𝑥
方向,虚部是y
𝑦
方向,很容易观察出其几何意义,如下图所示

还在思考怎么得来的?很简单哦,还记得向量的加减法么?

第三部分 旋转位置编码(RoPE)的推导与实现
3.1 旋转位置编码的原理与推导
所谓旋转位置编码,其在位置编码上删除了绝对位置嵌入,而在网络的每一层增加了苏剑林等人(2021)提出的旋转位置嵌入(RoPE),其思想是采用绝对位置编码的形式 实现相对位置编码,且RoPE主要借助了复数的思想

具体来说,当咱们给self-attention中的q,k,v
𝑞
,
𝑘
,
𝑣
向量都加入了位置信息后,便可以表示为

qmknvn=fq(xm,m)=fk(xn,n)=fv(xn,n)
𝑞
𝑚
=
𝑓
𝑞
(
𝑥
𝑚
,
𝑚
)
𝑘
𝑛
=
𝑓
𝑘
(
𝑥
𝑛
,
𝑛
)
𝑣
𝑛
=
𝑓
𝑣
(
𝑥
𝑛
,
𝑛
)

其中

qm
𝑞
𝑚
表示「第 m
𝑚
 个 token 对应的词向量 xm
𝑥
𝑚
 」集成「位置信息 m
𝑚
 」之后的 query 向量
而kn
𝑘
𝑛
 、 vn
𝑣
𝑛
 则分别表示第 n
𝑛
 个 token 对应的词向量 xn
𝑥
𝑛
 集成位置信息 n
𝑛
 之后的 key 向量、 value 向量
3.1.1 第一种形式的推导(可能是全网最通俗易懂版)
接着论文中提出为了能利用上 token 之间的相对位置信息,假定 query 向量 qm
𝑞
𝑚
 和 key 向量 kn
𝑘
𝑛
 之间的内积操作可以被一个函数 g
𝑔
 表示,该函数 g
𝑔
 的输入是词嵌入向量 xm
𝑥
𝑚
、xn
𝑥
𝑛
 ,和它们之间的相对位置 m−n
𝑚

𝑛

<fq(xm,m),fk(xn,n)>=g(xm,xn,m−n)
<
𝑓
𝑞
(
𝑥
𝑚
,
𝑚
)
,
𝑓
𝑘
(
𝑥
𝑛
,
𝑛
)
>=
𝑔
(
𝑥
𝑚
,
𝑥
𝑛
,
𝑚

𝑛
)

这里面其实有很大的一个关键,但大部分资料甚至RoPE原始论文都不会给你特别强调出来,即为何要构造这么一个等式呢?

原因在于左边算是q和k向量的内积,而这恰好是transformer计算自注意力机制的核心一步,右边等式则意味着m与n的相对位置
如此一来,该等式便把“q和k的内积”与“它们的相对位置”给串起来了
也如阿荀所说,左边是含有各自绝对位置信息的q向量和k向量,而这个等式就是RoPE追求的目标,物理含义就是通过显式传入绝对位置信息实现与传入相对位置信息对等的情况
假定现在词嵌入向量的维度是两维 d=2
𝑑
=
2
 ,然后RoPE利用2维度平面上的向量的几何性质,再结合复数的性质,神奇般的找到了满足上述等式的 f
𝑓
 和 g
𝑔
 ,其形式如下:

fq(xm,m)=(Wqxm)eimθfk(xn,n)=(Wkxn)einθg(xm,xn,m−n)=Re[(Wqxm)(Wkxn)∗ei(m−n)θ]
𝑓
𝑞
(
𝑥
𝑚
,
𝑚
)
=
(
𝑊
𝑞
𝑥
𝑚
)
𝑒
𝑖
𝑚
𝜃
𝑓
𝑘
(
𝑥
𝑛
,
𝑛
)
=
(
𝑊
𝑘
𝑥
𝑛
)
𝑒
𝑖
𝑛
𝜃
𝑔
(
𝑥
𝑚
,
𝑥
𝑛
,
𝑚

𝑛
)
=
Re

[
(
𝑊
𝑞
𝑥
𝑚
)
(
𝑊
𝑘
𝑥
𝑛
)

𝑒
𝑖
(
𝑚

𝑛
)
𝜃
]

这里面的 Re 表示复数的实部

进一步地, fq
𝑓
𝑞
可以表示成下面的式子(如果此刻你觉得你有点懵,没事,下文马上会一步一步的详细推导):
fq(xm,m)=(cosmθsinmθ−sinmθ)cosmθ)(W(1,1)qW(2,1)qW(1,2)qW(2,2)q)(x(1)mx(2)m)=(cosmθsinmθ−sinmθ)cosmθ)(q(1)mq(2)m)
𝑓
𝑞
(
𝑥
𝑚
,
𝑚
)
=
(
cos

𝑚
𝜃

sin

𝑚
𝜃
)
sin

𝑚
𝜃
cos

𝑚
𝜃
)
(
𝑊
𝑞
(
1
,
1
)
𝑊
𝑞
(
1
,
2
)
𝑊
𝑞
(
2
,
1
)
𝑊
𝑞
(
2
,
2
)
)
(
𝑥
𝑚
(
1
)
𝑥
𝑚
(
2
)
)
=
(
cos

𝑚
𝜃

sin

𝑚
𝜃
)
sin

𝑚
𝜃
cos

𝑚
𝜃
)
(
𝑞
𝑚
(
1
)
𝑞
𝑚
(
2
)
)

看到这里会发现,这不就是 query 向量乘以了一个旋转矩阵吗?这就是为什么叫做旋转位置编码的原因
同理,fk
𝑓
𝑘
  可以表示成下面的式子:
fk(xm,m)=(cosmθsinmθ−sinmθ)cosmθ)(W(1,1)kW(2,1)kW(1,2)kW(2,2)k)(x(1)mx(2)m)=(cosmθsinmθ−sinmθ)cosmθ)(k(1)mk(2)m)
𝑓
𝑘
(
𝑥
𝑚
,
𝑚
)
=
(
cos

𝑚
𝜃

sin

𝑚
𝜃
)
sin

𝑚
𝜃
cos

𝑚
𝜃
)
(
𝑊
𝑘
(
1
,
1
)
𝑊
𝑘
(
1
,
2
)
𝑊
𝑘
(
2
,
1
)
𝑊
𝑘
(
2
,
2
)
)
(
𝑥
𝑚
(
1
)
𝑥
𝑚
(
2
)
)
=
(
cos

𝑚
𝜃

sin

𝑚
𝜃
)
sin

𝑚
𝜃
cos

𝑚
𝜃
)
(
𝑘
𝑚
(
1
)
𝑘
𝑚
(
2
)
)

最终g(xm,xn,m−n)
𝑔
(
𝑥
𝑚
,
𝑥
𝑛
,
𝑚

𝑛
)
可以表示如下:
g(xm,xn,m−n)=(q(1)mq(2)m)(cos((m−n)θ)sin((m−n)θ)−sin((m−n)θ)cos((m−n)θ))(k(1)nk(2)n)
𝑔
(
𝑥
𝑚
,
𝑥
𝑛
,
𝑚

𝑛
)
=
(
𝑞
𝑚
(
1
)
𝑞
𝑚
(
2
)
)
(
cos

(
(
𝑚

𝑛
)
𝜃
)

sin

(
(
𝑚

𝑛
)
𝜃
)
sin

(
(
𝑚

𝑛
)
𝜃
)
cos

(
(
𝑚

𝑛
)
𝜃
)
)
(
𝑘
𝑛
(
1
)
𝑘
𝑛
(
2
)
)

然上述分别关于fq
𝑓
𝑞
、fk
𝑓
𝑘
、g(xm,xn,m−n)
𝑔
(
𝑥
𝑚
,
𝑥
𝑛
,
𝑚

𝑛
)
的三个式子,咋一步一步推导来的?为做细致说明,特参考此文一步一步解释下

首先看第一个式子,对于fq(xm,m)=(Wqxm)eimθ
𝑓
𝑞
(
𝑥
𝑚
,
𝑚
)
=
(
𝑊
𝑞
𝑥
𝑚
)
𝑒
𝑖
𝑚
𝜃
,这个式子的右边项有两部分,一部分是Wqxm
𝑊
𝑞
𝑥
𝑚
、一部分是eimθ
𝑒
𝑖
𝑚
𝜃

对于前者Wqxm
𝑊
𝑞
𝑥
𝑚
,可知其中的Wq
𝑊
𝑞
是个二维矩阵,xm
𝑥
𝑚
是个二维向量,自然相乘的结果也必然是一个二维向量,用qm
𝑞
𝑚
表示
qm=(q(1)mq(2)m)=Wqxm=(W(11)qW(21)qW(12)qW(22)q)(x(1)mx(2)m)
𝑞
𝑚
=
(
𝑞
𝑚
(
1
)
𝑞
𝑚
(
2
)
)
=
𝑊
𝑞
𝑥
𝑚
=
(
𝑊
𝑞
(
11
)
𝑊
𝑞
(
12
)
𝑊
𝑞
(
21
)
𝑊
𝑞
(
22
)
)
(
𝑥
𝑚
(
1
)
𝑥
𝑚
(
2
)
)
对于后者eimθ
𝑒
𝑖
𝑚
𝜃
,根据欧拉公式eix=cosx+isinx
𝑒
𝑖
𝑥
=
cos

𝑥
+
𝑖
sin

𝑥
,可得
eimθ=cos(mθ)+isin(mθ)einθ=cos(nθ)+isin(nθ)ei(m−n)θ=cos((m−n)θ)+isin((m−n)θ)
𝑒
𝑖
𝑚
𝜃
=
cos

(
𝑚
𝜃
)
+
𝑖
sin

(
𝑚
𝜃
)
𝑒
𝑖
𝑛
𝜃
=
cos

(
𝑛
𝜃
)
+
𝑖
sin

(
𝑛
𝜃
)
𝑒
𝑖
(
𝑚

𝑛
)
𝜃
=
cos

(
(
𝑚

𝑛
)
𝜃
)
+
𝑖
sin

(
(
𝑚

𝑛
)
𝜃
)

 
基于上面第1点结论,可知
fq(xm,m)=(Wqxm)eimθ=qmeimθ
𝑓
𝑞
(
𝑥
𝑚
,
𝑚
)
=
(
𝑊
𝑞
𝑥
𝑚
)
𝑒
𝑖
𝑚
𝜃
=
𝑞
𝑚
𝑒
𝑖
𝑚
𝜃

然后将qm
𝑞
𝑚
表示成复数形式,可得
qm=[q(1)m,q(2)m]=[q(1)m+iq(2)m]
𝑞
𝑚
=
[
𝑞
𝑚
(
1
)
,
𝑞
𝑚
(
2
)
]
=
[
𝑞
𝑚
(
1
)
+
𝑖
𝑞
𝑚
(
2
)
]

从而有
fq(xm,m)=qmeimθ=[q(1)m+iq(2)m]eimθ
𝑓
𝑞
(
𝑥
𝑚
,
𝑚
)
=
𝑞
𝑚
𝑒
𝑖
𝑚
𝜃
=
[
𝑞
𝑚
(
1
)
+
𝑖
𝑞
𝑚
(
2
)
]
𝑒
𝑖
𝑚
𝜃


基于上面第2点结论,可知fq(xm,m)
𝑓
𝑞
(
𝑥
𝑚
,
𝑚
)
即是两个复数相乘
fq(xm,m)=qmeimθ=(q(1)m+iq(2)m)∗(cos(mθ)+isin(mθ))
𝑓
𝑞
(
𝑥
𝑚
,
𝑚
)
=
𝑞
𝑚
𝑒
𝑖
𝑚
𝜃
=
(
𝑞
𝑚
(
1
)
+
𝑖
𝑞
𝑚
(
2
)
)

(
cos

(
𝑚
𝜃
)
+
𝑖
sin

(
𝑚
𝜃
)
)
考虑到以下两个关于复数的背景知识
(a+ib)⋅(c+id)=ac+ibc+iad+i2bd=(ac−bd)+i(bc+ad)
(
𝑎
+
𝑖
𝑏
)

(
𝑐
+
𝑖
𝑑
)
=
𝑎
𝑐
+
𝑖
𝑏
𝑐
+
𝑖
𝑎
𝑑
+
𝑖
2
𝑏
𝑑
=
(
𝑎
𝑐

𝑏
𝑑
)
+
𝑖
(
𝑏
𝑐
+
𝑎
𝑑
)

i2=−1
𝑖
2
=

1


可得
qmeimθ=(q(1)mcos(mθ)=(q(1)m+iq(2)m)∗(cos(mθ)+isin(mθ))−q(2)msin(mθ))+i(q(2)mcos(mθ)+q(1)msin(mθ))
𝑞
𝑚
𝑒
𝑖
𝑚
𝜃
=
(
𝑞
𝑚
(
1
)
+
𝑖
𝑞
𝑚
(
2
)
)

(
cos

(
𝑚
𝜃
)
+
𝑖
sin

(
𝑚
𝜃
)
)
=
(
𝑞
𝑚
(
1
)
cos

(
𝑚
𝜃
)

𝑞
𝑚
(
2
)
sin

(
𝑚
𝜃
)
)
+
𝑖
(
𝑞
𝑚
(
2
)
cos

(
𝑚
𝜃
)
+
𝑞
𝑚
(
1
)
sin

(
𝑚
𝜃
)
)


将这个结果表达成实数向量形式,即是
qmeimθ=[q(1)mcos(mθ)−q(2)msin(mθ),q(2)mcos(mθ)+q(1)msin(mθ)]
𝑞
𝑚
𝑒
𝑖
𝑚
𝜃
=
[
𝑞
𝑚
(
1
)
cos

(
𝑚
𝜃
)

𝑞
𝑚
(
2
)
sin

(
𝑚
𝜃
)
,
𝑞
𝑚
(
2
)
cos

(
𝑚
𝜃
)
+
𝑞
𝑚
(
1
)
sin

(
𝑚
𝜃
)
]


至此,你也就不难发现,这不就是query向量乘以了一个旋转矩阵么
fq(xm,m)=(Wqxm)eimθ=qmeimθ=[q(1)mcos(mθ)−q(2)msin(mθ),q(2)mcos(mθ)+q(1)msin(mθ)]=(cos(mθ)sin(mθ)−sin(mθ)cos(mθ))(q(1)mq(2)m)
𝑓
𝑞
(
𝑥
𝑚
,
𝑚
)
=
(
𝑊
𝑞
𝑥
𝑚
)
𝑒
𝑖
𝑚
𝜃
=
𝑞
𝑚
𝑒
𝑖
𝑚
𝜃
=
[
𝑞
𝑚
(
1
)
cos

(
𝑚
𝜃
)

𝑞
𝑚
(
2
)
sin

(
𝑚
𝜃
)
,
𝑞
𝑚
(
2
)
cos

(
𝑚
𝜃
)
+
𝑞
𝑚
(
1
)
sin

(
𝑚
𝜃
)
]
=
(
cos

(
𝑚
𝜃
)

sin

(
𝑚
𝜃
)
sin

(
𝑚
𝜃
)
cos

(
𝑚
𝜃
)
)
(
𝑞
𝑚
(
1
)
𝑞
𝑚
(
2
)
)
至于第二个式子,根据上述过程同理,可得key向量kn
𝑘
𝑛

fk(xn,n)=(Wkxn)einθ=kneinθ=[k(1)ncos(nθ)−k(2)nsin(nθ),k(2)ncos(nθ)+k(1)nsin(nθ)]=(cos(nθ)sin(nθ)−sin(nθ)cos(nθ))(k(1)nk(2)n)
𝑓
𝑘
(
𝑥
𝑛
,
𝑛
)
=
(
𝑊
𝑘
𝑥
𝑛
)
𝑒
𝑖
𝑛
𝜃
=
𝑘
𝑛
𝑒
𝑖
𝑛
𝜃
=
[
𝑘
𝑛
(
1
)
cos

(
𝑛
𝜃
)

𝑘
𝑛
(
2
)
sin

(
𝑛
𝜃
)
,
𝑘
𝑛
(
2
)
cos

(
𝑛
𝜃
)
+
𝑘
𝑛
(
1
)
sin

(
𝑛
𝜃
)
]
=
(
cos

(
𝑛
𝜃
)

sin

(
𝑛
𝜃
)
sin

(
𝑛
𝜃
)
cos

(
𝑛
𝜃
)
)
(
𝑘
𝑛
(
1
)
𝑘
𝑛
(
2
)
)
最后第三个式子,函数g,则可得

g(xm,xn,m−n)=Re[(Wqxm)(Wkxn)∗ei(m−n)θ]
𝑔
(
𝑥
𝑚
,
𝑥
𝑛
,
𝑚

𝑛
)
=
Re

[
(
𝑊
𝑞
𝑥
𝑚
)
(
𝑊
𝑘
𝑥
𝑛
)

𝑒
𝑖
(
𝑚

𝑛
)
𝜃
]
其中,Re[x]
𝑅
𝑒
[
𝑥
]
表示一个复数x
𝑥
的实数部分,而(Wkxn)∗
(
𝑊
𝑘
𝑥
𝑛
)

则表示复数Wkxn
𝑊
𝑘
𝑥
𝑛
的共轭

考虑到
z=a+ibz∗=a−ib
𝑧
=
𝑎
+
𝑖
𝑏
𝑧

=
𝑎

𝑖
𝑏

再结合上面第一个式子中的推导,可得
Wqxm=qm=q(1)m+iq(2)mWkxn=kn=k(1)n+ik(2)n(Wkxn)∗=k∗n=k(1)n−ik(2)nei(m−n)θ=cos((m−n)θ)+isin((m−n)θ)
𝑊
𝑞
𝑥
𝑚
=
𝑞
𝑚
=
𝑞
𝑚
(
1
)
+
𝑖
𝑞
𝑚
(
2
)
𝑊
𝑘
𝑥
𝑛
=
𝑘
𝑛
=
𝑘
𝑛
(
1
)
+
𝑖
𝑘
𝑛
(
2
)
(
𝑊
𝑘
𝑥
𝑛
)

=
𝑘
𝑛

=
𝑘
𝑛
(
1
)

𝑖
𝑘
𝑛
(
2
)
𝑒
𝑖
(
𝑚

𝑛
)
𝜃
=
cos

(
(
𝑚

𝑛
)
𝜃
)
+
𝑖
sin

(
(
𝑚

𝑛
)
𝜃
)

继续结合上面第一个式子中的推导(比如(a+ib)⋅(c+id)=ac+ibc+iad+i2bd=(ac−bd)+i(bc+ad)
(
𝑎
+
𝑖
𝑏
)

(
𝑐
+
𝑖
𝑑
)
=
𝑎
𝑐
+
𝑖
𝑏
𝑐
+
𝑖
𝑎
𝑑
+
𝑖
2
𝑏
𝑑
=
(
𝑎
𝑐

𝑏
𝑑
)
+
𝑖
(
𝑏
𝑐
+
𝑎
𝑑
)
,及i2=−1
𝑖
2
=

1
),继续可知,我们现在要证明的是存在
g(xm,xn,m−n)=Re[(Wqxm)(Wkxn)∗ei(m−n)θ]=Re[(q(1)m+iq(2)m)(k(1)n−ik(2)n)(cos((m−n)θ)+isin((m−n)θ))]=Re[((q(1)mk(1)n+q(2)mk(2)n)+i(q(2)mk(1)n−q(1)mk(2)n))(cos((m−n)θ)+isin((m−n)θ))]=(q(1)mk(1)n+q(2)mk(2)n)cos((m−n)θ)−(q(2)mk(1)n−q(1)mk(2)n)sin((m−n)θ)
𝑔
(
𝑥
𝑚
,
𝑥
𝑛
,
𝑚

𝑛
)
=
Re

[
(
𝑊
𝑞
𝑥
𝑚
)
(
𝑊
𝑘
𝑥
𝑛
)

𝑒
𝑖
(
𝑚

𝑛
)
𝜃
]
=
Re

[
(
𝑞
𝑚
(
1
)
+
𝑖
𝑞
𝑚
(
2
)
)
(
𝑘
𝑛
(
1
)

𝑖
𝑘
𝑛
(
2
)
)
(
cos

(
(
𝑚

𝑛
)
𝜃
)
+
𝑖
sin

(
(
𝑚

𝑛
)
𝜃
)
)
]
=
Re

[
(
(
𝑞
𝑚
(
1
)
𝑘
𝑛
(
1
)
+
𝑞
𝑚
(
2
)
𝑘
𝑛
(
2
)
)
+
𝑖
(
𝑞
𝑚
(
2
)
𝑘
𝑛
(
1
)

𝑞
𝑚
(
1
)
𝑘
𝑛
(
2
)
)
)
(
cos

(
(
𝑚

𝑛
)
𝜃
)
+
𝑖
sin

(
(
𝑚

𝑛
)
𝜃
)
)
]
=
(
𝑞
𝑚
(
1
)
𝑘
𝑛
(
1
)
+
𝑞
𝑚
(
2
)
𝑘
𝑛
(
2
)
)
cos

(
(
𝑚

𝑛
)
𝜃
)

(
𝑞
𝑚
(
2
)
𝑘
𝑛
(
1
)

𝑞
𝑚
(
1
)
𝑘
𝑛
(
2
)
)
sin

(
(
𝑚

𝑛
)
𝜃
)
总之,接下来我们就要证明上述函数 g 的计算公式是成立的
首先,回顾一下attention操作,位置m的query和位置n的key会做一个内积操作
即由
fq(xm,m)=[q(1)mcos(mθ)−q(2)msin(mθ),q(2)mcos(mθ)+q(1)msin(mθ)]fk(xn,n)=[k(1)ncos(nθ)−k(2)nsin(nθ),k(2)ncos(nθ)+k(1)nsin(nθ)]
𝑓
𝑞
(
𝑥
𝑚
,
𝑚
)
=
[
𝑞
𝑚
(
1
)
cos

(
𝑚
𝜃
)

𝑞
𝑚
(
2
)
sin

(
𝑚
𝜃
)
,
𝑞
𝑚
(
2
)
cos

(
𝑚
𝜃
)
+
𝑞
𝑚
(
1
)
sin

(
𝑚
𝜃
)
]
𝑓
𝑘
(
𝑥
𝑛
,
𝑛
)
=
[
𝑘
𝑛
(
1
)
cos

(
𝑛
𝜃
)

𝑘
𝑛
(
2
)
sin

(
𝑛
𝜃
)
,
𝑘
𝑛
(
2
)
cos

(
𝑛
𝜃
)
+
𝑘
𝑛
(
1
)
sin

(
𝑛
𝜃
)
]

可得
<fq(xm,m),fk(xn,n)>=(q(1)mcos(mθ)−q(2)msin(mθ))(k(1)ncos(nθ)−k(2)nsin(nθ))+(q(2)mcos(mθ)+q(1)msin(mθ))(k(2)ncos(nθ)+k(1)nsin(nθ))=q(1)mcos(mθ)k(1)ncos(nθ)−q(1)mcos(mθ)k(2)nsin(nθ)−q(2)msin(mθ)k(1)ncos(nθ)+q(2)msin(mθ)k(2)nsin(nθ)+q(2)mcos(mθ)k(2)ncos(nθ)+q(2)mcos(mθ)k(1)nsin(nθ)+q(1)msin(mθ)k(2)ncos(nθ)+q(1)msin(mθ)k(1)nsin(nθ)
<
𝑓
𝑞
(
𝑥
𝑚
,
𝑚
)
,
𝑓
𝑘
(
𝑥
𝑛
,
𝑛
)
>
=
(
𝑞
𝑚
(
1
)
cos

(
𝑚
𝜃
)

𝑞
𝑚
(
2
)
sin

(
𝑚
𝜃
)
)
(
𝑘
𝑛
(
1
)
cos

(
𝑛
𝜃
)

𝑘
𝑛
(
2
)
sin

(
𝑛
𝜃
)
)
+
(
𝑞
𝑚
(
2
)
cos

(
𝑚
𝜃
)
+
𝑞
𝑚
(
1
)
sin

(
𝑚
𝜃
)
)
(
𝑘
𝑛
(
2
)
cos

(
𝑛
𝜃
)
+
𝑘
𝑛
(
1
)
sin

(
𝑛
𝜃
)
)
=
𝑞
𝑚
(
1
)
cos

(
𝑚
𝜃
)
𝑘
𝑛
(
1
)
cos

(
𝑛
𝜃
)

𝑞
𝑚
(
1
)
cos

(
𝑚
𝜃
)
𝑘
𝑛
(
2
)
sin

(
𝑛
𝜃
)

𝑞
𝑚
(
2
)
sin

(
𝑚
𝜃
)
𝑘
𝑛
(
1
)
cos

(
𝑛
𝜃
)
+
𝑞
𝑚
(
2
)
sin

(
𝑚
𝜃
)
𝑘
𝑛
(
2
)
sin

(
𝑛
𝜃
)
+
𝑞
𝑚
(
2
)
cos

(
𝑚
𝜃
)
𝑘
𝑛
(
2
)
cos

(
𝑛
𝜃
)
+
𝑞
𝑚
(
2
)
cos

(
𝑚
𝜃
)
𝑘
𝑛
(
1
)
sin

(
𝑛
𝜃
)
+
𝑞
𝑚
(
1
)
sin

(
𝑚
𝜃
)
𝑘
𝑛
(
2
)
cos

(
𝑛
𝜃
)
+
𝑞
𝑚
(
1
)
sin

(
𝑚
𝜃
)
𝑘
𝑛
(
1
)
sin

(
𝑛
𝜃
)

「相当于[A,B]与[C,D]做内积,则相当于A B横着,C D竖着,最终结果为AC BD,最后再把括号里的项全部对应相乘、展开」
首先,把上面第二点的式子整理一下,总计8项,为了把qk
𝑞
𝑘
相关的项提取出来,第1项 8项合并处理、第2项 7项合并处理、第3项 6项合并处理、第4项 5项合并处理
其次,考虑到
sin(a+b)=sinacosb+cosasinbsin(a−b)=sinacosb−cosasinbcos(a+b)=cosacosb−sinasinbcos(a−b)=cosacosb+sinasinb
sin

(
𝑎
+
𝑏
)
=
sin

𝑎
cos

𝑏
+
cos

𝑎
sin

𝑏
sin

(
𝑎

𝑏
)
=
sin

𝑎
cos

𝑏

cos

𝑎
sin

𝑏
cos

(
𝑎
+
𝑏
)
=
cos

𝑎
cos

𝑏

sin

𝑎
sin

𝑏
cos

(
𝑎

𝑏
)
=
cos

𝑎
cos

𝑏
+
sin

𝑎
sin

𝑏

最后,再把相关项的特点,两次调整下顺序即可

依据以上三点,从而有
<fq(xm,m),fk(xn,n)>=q(1)mk(1)n(cos(mθ)cos(nθ)+sin(mθ)sin(nθ))+q(1)mk(2)n(−cos(mθ)sin(nθ)+sin(mθ)cos(nθ))+q(2)mk(1)n(−sin(mθ)cos(nθ)+cos(mθ)sin(nθ))+q(2)mk(2)n(sin(mθ)sin(nθ)+cos(mθ)cos(nθ))=q(1)mk(1)ncos((m−n)θ)+q(1)mk(2)nsin((m−n)θ)−q(2)mk(1)nsin((m−n)θ)+q(2)mk(2)ncos((m−n)θ)=(q(1)mk(1)n+q(2)mk(2)n)cos((m−n)θ)+(q(1)mk(2)n−q(2)mk(1)n)sin((m−n)θ)=(q(1)mk(1)n+q(2)mk(2)n)cos((m−n)θ)−(q(2)mk(1)n−q(1)mk(2)n)sin((m−n)θ)=g(xm,xn,m−n)
<
𝑓
𝑞
(
𝑥
𝑚
,
𝑚
)
,
𝑓
𝑘
(
𝑥
𝑛
,
𝑛
)
>
=
𝑞
𝑚
(
1
)
𝑘
𝑛
(
1
)
(
cos

(
𝑚
𝜃
)
cos

(
𝑛
𝜃
)
+
sin

(
𝑚
𝜃
)
sin

(
𝑛
𝜃
)
)
+
𝑞
𝑚
(
1
)
𝑘
𝑛
(
2
)
(

cos

(
𝑚
𝜃
)
sin

(
𝑛
𝜃
)
+
sin

(
𝑚
𝜃
)
cos

(
𝑛
𝜃
)
)
+
𝑞
𝑚
(
2
)
𝑘
𝑛
(
1
)
(

sin

(
𝑚
𝜃
)
cos

(
𝑛
𝜃
)
+
cos

(
𝑚
𝜃
)
sin

(
𝑛
𝜃
)
)
+
𝑞
𝑚
(
2
)
𝑘
𝑛
(
2
)
(
sin

(
𝑚
𝜃
)
sin

(
𝑛
𝜃
)
+
cos

(
𝑚
𝜃
)
cos

(
𝑛
𝜃
)
)
=
𝑞
𝑚
(
1
)
𝑘
𝑛
(
1
)
cos

(
(
𝑚

𝑛
)
𝜃
)
+
𝑞
𝑚
(
1
)
𝑘
𝑛
(
2
)
sin

(
(
𝑚

𝑛
)
𝜃
)

𝑞
𝑚
(
2
)
𝑘
𝑛
(
1
)
sin

(
(
𝑚

𝑛
)
𝜃
)
+
𝑞
𝑚
(
2
)
𝑘
𝑛
(
2
)
cos

(
(
𝑚

𝑛
)
𝜃
)
=
(
𝑞
𝑚
(
1
)
𝑘
𝑛
(
1
)
+
𝑞
𝑚
(
2
)
𝑘
𝑛
(
2
)
)
cos

(
(
𝑚

𝑛
)
𝜃
)
+
(
𝑞
𝑚
(
1
)
𝑘
𝑛
(
2
)

𝑞
𝑚
(
2
)
𝑘
𝑛
(
1
)
)
sin

(
(
𝑚

𝑛
)
𝜃
)
=
(
𝑞
𝑚
(
1
)
𝑘
𝑛
(
1
)
+
𝑞
𝑚
(
2
)
𝑘
𝑛
(
2
)
)
cos

(
(
𝑚

𝑛
)
𝜃
)

(
𝑞
𝑚
(
2
)
𝑘
𝑛
(
1
)

𝑞
𝑚
(
1
)
𝑘
𝑛
(
2
)
)
sin

(
(
𝑚

𝑛
)
𝜃
)
=
𝑔
(
𝑥
𝑚
,
𝑥
𝑛
,
𝑚

𝑛
)


完美! 如此,也就证明了,位置 m 的 query 和位置 n 的 key 的内积就是函数 g
最后,把上面的式子一、式子二的最终结果都分别用矩阵向量乘的形式来表达就是:

<fq(xm,m),fk(xn,n)>=((cos(mθ)sin(mθ)−sin(mθ)cos(mθ))(q(1)mq(2)m))T((cos(nθ)sin(nθ)−sin(nθ)cos(nθ))(k(1)nk(2)n))=(q(1)mq(2)m)(cos(mθ)−sin(mθ)sin(mθ)cos(mθ))(cos(nθ)sin(nθ)−sin(nθ)cos(nθ))(k(1)nk(2)n)
<
𝑓
𝑞
(
𝑥
𝑚
,
𝑚
)
,
𝑓
𝑘
(
𝑥
𝑛
,
𝑛
)
>
=
(
(
cos

(
𝑚
𝜃
)

sin

(
𝑚
𝜃
)
sin

(
𝑚
𝜃
)
cos

(
𝑚
𝜃
)
)
(
𝑞
𝑚
(
1
)
𝑞
𝑚
(
2
)
)
)
𝑇
(
(
cos

(
𝑛
𝜃
)

sin

(
𝑛
𝜃
)
sin

(
𝑛
𝜃
)
cos

(
𝑛
𝜃
)
)
(
𝑘
𝑛
(
1
)
𝑘
𝑛
(
2
)
)
)
=
(
𝑞
𝑚
(
1
)
𝑞
𝑚
(
2
)
)
(
cos

(
𝑚
𝜃
)
sin

(
𝑚
𝜃
)

sin

(
𝑚
𝜃
)
cos

(
𝑚
𝜃
)
)
(
cos

(
𝑛
𝜃
)

sin

(
𝑛
𝜃
)
sin

(
𝑛
𝜃
)
cos

(
𝑛
𝜃
)
)
(
𝑘
𝑛
(
1
)
𝑘
𝑛
(
2
)
)

接下来,我们要计算两个旋转矩阵的乘积,即中间部分的这个式子

(cos(mθ)−sin(mθ)sin(mθ)cos(mθ))(cos(nθ)sin(nθ)−sin(nθ)cos(nθ))
(
cos

(
𝑚
𝜃
)
sin

(
𝑚
𝜃
)

sin

(
𝑚
𝜃
)
cos

(
𝑚
𝜃
)
)
(
cos

(
𝑛
𝜃
)

sin

(
𝑛
𝜃
)
sin

(
𝑛
𝜃
)
cos

(
𝑛
𝜃
)
)

展开之后,可得

(cos(mθ)cos(nθ)+sin(mθ)sin(nθ)−sin(mθ)cos(nθ)+cos(mθ)sin(nθ)−cos(mθ)sin(nθ)+sin(mθ)cos(nθ)sin(mθ)sin(nθ)+cos(mθ)cos(nθ))
(
cos

(
𝑚
𝜃
)
cos

(
𝑛
𝜃
)
+
sin

(
𝑚
𝜃
)
sin

(
𝑛
𝜃
)

cos

(
𝑚
𝜃
)
sin

(
𝑛
𝜃
)
+
sin

(
𝑚
𝜃
)
cos

(
𝑛
𝜃
)

sin

(
𝑚
𝜃
)
cos

(
𝑛
𝜃
)
+
cos

(
𝑚
𝜃
)
sin

(
𝑛
𝜃
)
sin

(
𝑚
𝜃
)
sin

(
𝑛
𝜃
)
+
cos

(
𝑚
𝜃
)
cos

(
𝑛
𝜃
)
)

从而有

<fq(xm,m),fk(xn,n)>=(q(1)mq(2)m)(cos((m−n)θ)sin((m−n)θ)−sin((m−n)θ)cos((m−n)θ))(k(1)nk(2)n)
<
𝑓
𝑞
(
𝑥
𝑚
,
𝑚
)
,
𝑓
𝑘
(
𝑥
𝑛
,
𝑛
)
>
=
(
𝑞
𝑚
(
1
)
𝑞
𝑚
(
2
)
)
(
cos

(
(
𝑚

𝑛
)
𝜃
)

sin

(
(
𝑚

𝑛
)
𝜃
)
sin

(
(
𝑚

𝑛
)
𝜃
)
cos

(
(
𝑚

𝑛
)
𝜃
)
)
(
𝑘
𝑛
(
1
)
𝑘
𝑛
(
2
)
)

上面都还只是针对词嵌入维度为2的情况,那对于d>=2
𝑑
>=
2
的通用情况呢,将2维推广到任意维度,可以表示如下:

f{q,k}(xm,m)=RdΘ,mW{q,k}xm
𝑓
{
𝑞
,
𝑘
}
(
𝑥
𝑚
,
𝑚
)
=
𝑅
Θ
,
𝑚
𝑑
𝑊
{
𝑞
,
𝑘
}
𝑥
𝑚

内积满足线性叠加性,因此任意偶数维的RoPE,我们都可以表示为二维情形的拼接,即将词嵌入向量元素按照两两一组分组

RdΘ,m=⎛⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜cosmθ0sinmθ000⋮00−sinmθ0cosmθ000⋮0000cosmθ1sinmθ1⋮0000−sinmθ1cosmθ1⋮00⋯⋯⋯⋯⋱⋯⋯0000⋮cosmθd/2−1sinmθd/2−10000⋮−sinmθd/2−1cosmθd/2−1⎞⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟Wm
𝑅
Θ
,
𝑚
𝑑
=
(
cos

𝑚
𝜃
0

sin

𝑚
𝜃
0
0
0

0
0
sin

𝑚
𝜃
0
cos

𝑚
𝜃
0
0
0

0
0
0
0
cos

𝑚
𝜃
1

sin

𝑚
𝜃
1

0
0
0
0
sin

𝑚
𝜃
1
cos

𝑚
𝜃
1

0
0







0
0
0
0

cos

𝑚
𝜃
𝑑
/
2

1

sin

𝑚
𝜃
𝑑
/
2

1
0
0
0
0

sin

𝑚
𝜃
𝑑
/
2

1
cos

𝑚
𝜃
𝑑
/
2

1
)

𝑊
𝑚

每组应用同样的旋转操作且每组的旋转角度计算方式如下:

Θ={θi=10000−2(i−1)/d,i∈[1,2,…,d/2]}
Θ
=
{
𝜃
𝑖
=
10000

2
(
𝑖

1
)
/
𝑑
,
𝑖

[
1
,
2
,

,
𝑑
/
2
]
}

所以简单来说 RoPE 的 self-attention 操作的流程是

对于 token 序列中的每个词嵌入向量,首先计算其对应的 query 和 key 向量
然后对每个 token 位置都计算对应的旋转位置编码
接着对每个 token 位置的 query 和 key 向量的元素按照 两两一组 应用旋转变换
最后再计算 query 和 key 之间的内积得到 self-attention 的计算结果
3.1.2 第二种形式的推导(苏剑林版)
与上面第一种形式的推导类似,为了引入复数,首先假设了在加入位置信息之前,原有的编码向量是二维行向量和,其中和是绝对位置,现在需要构造一个变换,将和引入到和中,即寻找变换: 

qm~=f(q,m),kn~=f(k,n)
𝑞
𝑚
~
=
𝑓
(
𝑞
,
𝑚
)
,
𝑘
𝑛
~
=
𝑓
(
𝑘
,
𝑛
)

也就是说,我们分别为、设计操作、,使得经过该操作后,、就带有了位置、的绝对位置信息
考虑到Attention的核心计算是内积:

Attention(Q,K,V)=softmax(QKTdk√)V
𝐴
𝑡
𝑡
𝑒
𝑛
𝑡
𝑖
𝑜
𝑛
(
𝑄
,
𝐾
,
𝑉
)
=
𝑠
𝑜
𝑓
𝑡
𝑚
𝑎
𝑥
(
𝑄
𝐾
𝑇
𝑑
𝑘
)
𝑉

故我们希望的内积的结果带有相对位置信息,即寻求的这个变换,应该具有特性:

「怎么理解?很简单,当m和n表示了绝对位置之后,m与n在句子中的距离即位置差m-n,就可以表示为相对位置了,且对于复数,内积通常定义为一个复数与另一个复数的共轭的乘积」

为合理的求出该恒等式的一个尽可能简单的解,可以设定一些初始条件,比如、,然后可以先考虑二维情形,然后借助复数来求解
在复数中有,表示取实部的操作(复数  和“ 复数  的共轭即k∗
𝑘

 ”之积仍是一个复数)
因论文100课的群里有学员对该点存在疑问,故借用七月黄老师的回复补充下:这个等式和复数乘法和向量乘积的联系有关
考虑两个复数
q=a+bi
𝑞
=
𝑎
+
𝑏
𝑖

k=c+di
𝑘
=
𝑐
+
𝑑
𝑖
,k
𝑘
的共轭是k∗=c−di
𝑘

=
𝑐

𝑑
𝑖

一方面,对于等式的右边项而言
q和k*的乘积是 qk∗=(a+bi)(c−di)=ac−adi+cbi+bd=(ac+bd)+(cb−ad)i
𝑞
𝑘

=
(
𝑎
+
𝑏
𝑖
)
(
𝑐

𝑑
𝑖
)
=
𝑎
𝑐

𝑎
𝑑
𝑖
+
𝑐
𝑏
𝑖
+
𝑏
𝑑
=
(
𝑎
𝑐
+
𝑏
𝑑
)
+
(
𝑐
𝑏

𝑎
𝑑
)
𝑖

这个结果的实部是 ac+bd
𝑎
𝑐
+
𝑏
𝑑

二方面,对于等式的左边项而言
其对应于q
𝑞
对应的实数向量[a,b]
[
𝑎
,
𝑏
]
和k
𝑘
对应的实数向量[c,d]
[
𝑐
,
𝑑
]
的乘积
[a,b]⋅[c,d]=ac+bd
[
𝑎
,
𝑏
]

[
𝑐
,
𝑑
]
=
𝑎
𝑐
+
𝑏
𝑑

综合以上两点,可知右边项所表示的“复数q和复数k的共轭k*的乘积”,和左边项做表示的“q、k所对应向量的乘积”是一样的

总之,我们需要寻找一种变换,使得

简单起见,我们假设存在复数,使得,然后我们用复数的指数形式,设

那么代入方程后就得到两个方程
方程1:
方程2:Θf(q,m)−Θf(k,n) = Θg(q,k,m−n)

  对于方程1,代入得到(接着,再把和都设为0)

最后一个等号源于初始条件和,所以现在我们可以很简单地设Rf(q,m)=‖q‖
𝑅
𝑓
(
𝑞
,
𝑚
)
=

𝑞

,,即它不依赖于

  至于方程2,同样代入得到
Θf(q,m)−Θf(k,m) = Θg(q,k,0) = Θf(q,0)−Θf(k,0) = Θ(q)−Θ(k)

这里的Θ(q)
Θ
(
𝑞
)
、是、本身的幅角,而最后一个等号同样源于初始条件
根据上式Θf(q,m)−Θf(k,m) = Θ(q)−Θ(k),可得Θf(q,m)−Θ(q)=Θf(k,m)−Θ(k),所以Θf(q,m)−Θ(q)的结果是一个只与m相关、跟q无关的函数,记为φ(m),即Θf(q,m)=Θ(q)+φ(m)
接着令n=m−1代入Θf(q,m)−Θf(k,n) = Θg(q,k,m−n),可以得到 Θf(q,m)−Θf(k,m-1) = Θg(q,k,1)
然后将 Θf(q,m) 和 Θf(k,m-1) 的等式代入Θf(q,m)=Θ(q)+φ(m),我们可以得到 Θ(q) + φ(m) - (Θ(k) + φ(m-1)) = Θg(q,k,1),整理一下就得到
φ(m)−φ(m−1)=Θg(q,k,1)+Θ(k)−Θ(q)
𝜑
(
𝑚
)

𝜑
(
𝑚

1
)
=
Θ
𝑔
(
𝑞
,
𝑘
,
1
)
+
Θ
(
𝑘
)

Θ
(
𝑞
)

即{φ(m)}是等差数列,设右端为θ,那么就解得φ(m)=mθ

综上,我们得到二维情况下用复数表示的RoPE:

所以说,寻求的变换就是,也就是给乘以eimθ
𝑒
𝑖
𝑚
𝜃
,相应地,乘以
做了这样一个变换之后,根据复数的特性,有:〈qm,kn〉=Re[qmk∗n]

𝑞
𝑚
,
𝑘
𝑛

=
𝑅
𝑒
[
𝑞
𝑚
𝑘
𝑛

]
 也就是,如果把二维向量看做复数,那么它们的内积,等于一个复数乘以另一个复数的共轭,得到的结果再取实部,代入上面的变换,也就有:
〈qmeimθ,kneinθ〉=Re[(qmeimθ)(kneinθ)∗]=Re[qmk∗nei(m−n)θ]

𝑞
𝑚
𝑒
𝑖
𝑚
𝜃
,
𝑘
𝑛
𝑒
𝑖
𝑛
𝜃

=
𝑅
𝑒
[
(
𝑞
𝑚
𝑒
𝑖
𝑚
𝜃
)
(
𝑘
𝑛
𝑒
𝑖
𝑛
𝜃
)

]
=
𝑅
𝑒
[
𝑞
𝑚
𝑘
𝑛

𝑒
𝑖
(
𝑚

𝑛
)
𝜃
]

这样一来,内积的结果就只依赖于,也就是相对位置了
换言之,经过这样一番操作,通过给Embedding添加绝对位置信息,可以使得两个token的编码,经过内积变换(self-attn)之后,得到结果是受它们位置的差值,即相对位置影响的
于是,对于任意的位置为的二维向量[x,y]
[
𝑥
,
𝑦
]
,把它看做复数,乘以eimθ
𝑒
𝑖
𝑚
𝜃
,而根据欧拉公式,有:

eimθ=cosmθ+isinmθ
𝑒
𝑖
𝑚
𝜃
=
cos

𝑚
𝜃
+
𝑖
sin

𝑚
𝜃

从而上述的相乘变换也就变成了(过程中注意:i2=−1
𝑖
2
=

1
):

把上述式子写成矩阵形式:

而这个变换的几何意义,就是在二维坐标系下,对向量(q0,q1)
(
𝑞
0
,
𝑞
1
)
进行了旋转,因而这种位置编码方法,被称为旋转位置编码

根据刚才的结论,结合内积的线性叠加性,可以将结论推广到高维的情形。可以理解为,每两个维度一组,进行了上述的“旋转”操作,然后再拼接在一起:

由于矩阵的稀疏性,会造成计算上的浪费,所以在计算时采用逐位相乘再相加的方式进行:

其中⊗

为矩阵逐位相乘操作

欧拉公式

这个公式是著名的欧拉公式(Euler's identity),它是数学中最优美的公式之一,展示了几个基本数学常数之间的深刻联系。公式如下:

eiπ+1=0

欧拉公式连接了五个最重要的数学常数:

  1. 𝑒e - 自然对数的底,约等于 2.71828
  2. 𝑖i - 虚数单位,满足 
  3. 𝜋π - 圆周率,约等于 3.14159。
  4. 1 - 乘法的单位元。
  5. 0 - 加法的单位元

公式的推导

欧拉公式的推导通常基于复数的指数函数表示。一般形式的欧拉公式是:

𝑒𝑖𝑥=cos⁡(𝑥)+𝑖sin⁡(𝑥)eix=cos(x)+isin(x)

当 𝑥=𝜋 时:

𝑒𝑖𝜋=cos⁡(𝜋)+𝑖sin⁡(𝜋)eiπ=cos(π)+isin(π)

因为:

cos⁡(𝜋)=−1cos(π)=−1
sin⁡(𝜋)=0sin(π)=0

所以:

将其代入欧拉公式,我们得到:

欧拉公式的意义

欧拉公式之所以被认为是数学中最美的公式之一,是因为它简洁地将数学中的几何、代数和分析三个领域结合在一起。它展示了复数、指数函数三角函数之间的深刻联系,同时也将五个基本数学常数统一在一个简单的等式中。这种美不仅在于公式的简洁性,还在于它在数学中的广泛应用和深远影响。

详述欧拉公式在旋转位置编码中的推导证明

GPT-4o的机器人图片

GPT-4o

Poe

欧拉公式在旋转位置编码中的应用主要涉及将二维平面上的旋转操作通过复数表示出来。旋转位置编码是一种在计算机图形学和信号处理中常用的技术,用于描述和处理二维平面上的旋转操作。我们可以利用欧拉公式来推导和证明如何通过复数实现旋转位置编码。

欧拉公式的基本形式

欧拉公式的基本形式为:

𝑒𝑖𝜃=cos⁡(𝜃)+𝑖sin⁡(𝜃) eiθ=cos(θ)+isin(θ)

其中,𝜃θ 是一个实数角度,𝑒𝑖𝜃eiθ 表示单位圆上的一个点。

复数表示旋转

在二维平面上,任何一个点都可以表示为一个复数 𝑧=𝑥+𝑦𝑖z=x+yi,其中 𝑥x 和 𝑦y 分别是该点的横坐标和纵坐标。通过复数乘法,可以实现对这个点的旋转

旋转操作

假设我们有一个点 𝑧z 在二维平面上,我们希望将其绕原点旋转一个角度 𝜃θ。根据复数的性质,旋转操作可以通过将 𝑧z 乘以 𝑒𝑖𝜃eiθ 来实现。

 𝑧=𝑥+𝑦𝑖z=x+yi,则旋转后的点 𝑧′z′ 为:

𝑧′=𝑧⋅𝑒𝑖𝜃z′=z⋅eiθ

通过欧拉公式进行推导

我们可以将 𝑒𝑖𝜃eiθ 代入欧拉公式:

𝑧′=(𝑥+𝑦𝑖)⋅(cos⁡(𝜃)+𝑖sin⁡(𝜃))z′=(x+yi)⋅(cos(θ)+isin(θ))

进行复数乘法:

𝑧′=𝑥cos⁡(𝜃)+𝑥𝑖sin⁡(𝜃)+𝑦𝑖cos⁡(𝜃)+𝑦𝑖2sin⁡(𝜃)z′=xcos(θ)+xisin(θ)+yicos(θ)+yi2sin(θ)

由于 𝑖2=−1i2=−1,所以:

𝑧′=𝑥cos⁡(𝜃)+𝑥𝑖sin⁡(𝜃)+𝑦cos⁡(𝜃)𝑖−𝑦sin⁡(𝜃)    z′=xcos(θ)+xisin(θ)+ycos(θ)i−ysin(θ)

将实部和虚部分开:

𝑧′=(𝑥cos⁡(𝜃)−𝑦sin⁡(𝜃))+𝑖(𝑥sin⁡(𝜃)+𝑦cos⁡(𝜃))z′=(xcos(θ)−ysin(θ))+i(xsin(θ)+ycos(θ))

因此,旋转后的点的坐标为:

(𝑥′,𝑦′)=(𝑥cos⁡(𝜃)−𝑦sin⁡(𝜃),𝑥sin⁡(𝜃)+𝑦cos⁡(𝜃))(x′,y′)=(xcos(θ)−ysin(θ),xsin(θ)+ycos(θ))

这个结果正是二维平面上绕原点旋转角度 𝜃θ 的标准旋转矩阵表示:

旋转位置编码

在实际应用中,如图像处理和信号处理,旋转位置编码利用这种复数表示的旋转来简化计算。特别是在卷积神经网络(CNN)中,旋转不变性是一个重要的特性,通过复数乘法和欧拉公式,可以方便地实现旋转不变的特征提取。

(x′y′)=(cos⁡(θ)−sin⁡(θ)sin⁡(θ)cos⁡(θ))(xy)\begin{pmatrix} x' \\ y' \end{pmatrix} = \begin{pmatrix} \cos(\theta) & -\sin(\theta) \\ \sin(\theta) & \cos(\theta) \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix}(x′y′​)=(cos(θ)sin(θ)​−sin(θ)cos(θ)​)(xy​)

总结

利用欧拉公式 eiθ=cos⁡(θ)+isin⁡(θ),我们可以将二维平面上的旋转操作简化为复数乘法。这种表示方法不仅简洁,而且在计算上非常高效,广泛应用于计算机图形学、信号处理和机器学习等领域。通过将旋转表示为复数乘法,可以方便地实现旋转位置编码,从而提高算法的旋转不变性和鲁棒性。

eiθ=cos⁡(θ)+isin⁡(θ)   e^{i\theta} = \cos(\theta) + i\sin(\theta)eiθ=cos(θ)+isin(θ)

x' \\ y' \end{pmatrix} = \begin{pmatrix} \cos(\theta) & -\sin(\theta) \\ \sin(\theta) & \cos(\theta) \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix} \] ### 旋转位置编码 在实际应用中,如图像处理和信号处理,旋转位置编码利用这种复数表示的旋转来简化计算。特别是在卷积神经网络(CNN)中,旋转不变性是一个重要的特性,通过复数乘法和欧拉公式,可以方便地实现旋转不变的特征提取。 ### 总结 利用欧拉公式 \( e^{i\theta} = \cos(\theta) + i\sin(\theta) \),我们可以将二维平面上的旋转操作简化为复数乘法。这种表示方法不仅简洁,而且在计算上非常高效,广泛应用于计算机图形学、信号处理和机器学习等领域。通过将旋转表示为复数乘法,可以方便地实现旋转位置编码,从而提高算法的旋转不变性和鲁棒性。

为什么根据复数的性质,旋转操作可以通过将 z 乘以 𝑒𝑖𝜃来实现

GPT-4o的机器人图片

GPT-4o

Poe

复数在二维平面上的旋转操作通过乘以 𝑒𝑖𝜃eiθ 来实现,这一性质源于复数的极坐标表示和欧拉公式。为了详细解释这一点,我们需要了解复数的几何解释和欧拉公式的作用。

复数的几何解释

复数 𝑧=𝑥+𝑦𝑖z=x+yi 可以在复平面上表示为点 (𝑥,𝑦)(x,y),或者向量 𝑧⃗=(𝑥,𝑦)z=(x,y)。复数的另一个表示形式是极坐标形式,即:

𝑧=𝑟(cos⁡(𝜙)+𝑖sin⁡(𝜙))z=r(cos(ϕ)+isin(ϕ))

其中:

  • 𝑟r 是复数 𝑧z 的模(即向量的长度),𝑟=∣𝑧∣=𝑥2+𝑦2r=∣z∣=x2+y2​。
  • 𝜙ϕ 是复数 𝑧z 的辐角(即向量与实轴正方向的夹角),𝜙=arg⁡(𝑧)ϕ=arg(z)。

欧拉公式与复数旋转

欧拉公式给出了复指数函数的表示:

𝑒𝑖𝜃=cos⁡(𝜃)+𝑖sin⁡(𝜃)eiθ=cos(θ)+isin(θ)

将复数 𝑧z 乘以 𝑒𝑖𝜃eiθ 相当于将 𝑧z 的极坐标形式中的辐角增加 𝜃θ:

𝑧′=𝑧⋅𝑒𝑖𝜃z′=z⋅eiθ

如果 𝑧=𝑟(cos⁡(𝜙)+𝑖sin⁡(𝜙))z=r(cos(ϕ)+isin(ϕ)),则:

𝑧′=𝑟(cos⁡(𝜙)+𝑖sin⁡(𝜙))⋅(cos⁡(𝜃)+𝑖sin⁡(𝜃))z′=r(cos(ϕ)+isin(ϕ))⋅(cos(θ)+isin(θ))

乘法运算的展开

展开复数乘法:

𝑧′=𝑟[cos⁡(𝜙)cos⁡(𝜃)−sin⁡(𝜙)sin⁡(𝜃)+𝑖(cos⁡(𝜙)sin⁡(𝜃)+sin⁡(𝜙)cos⁡(𝜃))]z′=r[cos(ϕ)cos(θ)−sin(ϕ)sin(θ)+i(cos(ϕ)sin(θ)+sin(ϕ)cos(θ))]

利用三角函数的加法公式:

cos⁡(𝜙+𝜃)=cos⁡(𝜙)cos⁡(𝜃)−sin⁡(𝜙)sin⁡(𝜃)cos(ϕ+θ)=cos(ϕ)cos(θ)−sin(ϕ)sin(θ)
sin⁡(𝜙+𝜃)=cos⁡(𝜙)sin⁡(𝜃)+sin⁡(𝜙)cos⁡(𝜃)sin(ϕ+θ)=cos(ϕ)sin(θ)+sin(ϕ)cos(θ)

我们得到:

𝑧′=𝑟[cos⁡(𝜙+𝜃)+𝑖sin⁡(𝜙+𝜃)]z′=r[cos(ϕ+θ)+isin(ϕ+θ)]

这表明 𝑧′z′ 的极坐标形式为 𝑟r 和 𝜙+𝜃ϕ+θ。因此,将 𝑧z 乘以 𝑒𝑖𝜃eiθ 相当于将 𝑧z 的辐角增加 𝜃θ,而模 𝑟r 不变。这正是旋转操作的几何意义:在复平面上绕原点旋转 𝜃θ 角。

总结

通过复数乘以 𝑒𝑖𝜃eiθ 来实现旋转操作的原因在于欧拉公式的本质。欧拉公式 𝑒𝑖𝜃=cos⁡(𝜃)+𝑖sin⁡(𝜃)eiθ=cos(θ)+isin(θ) 使得复数乘法可以自然地表示旋转操作。具体来说:

  • 复数的模保持不变,这是旋转中向量长度不变的性质。
  • 复数的辐角增加 𝜃θ,这是旋转中角度变化的性质。

因此,复数乘以 𝑒𝑖𝜃eiθ 完美地描述了二维平面上的旋转操作。

旋转位置编码为什么可以做位置编码,有什么好处

GPT-4o的机器人图片

GPT-4o

Poe

旋转位置编码(Rotary Position Embedding, RoPE)是一种用于将位置信息注入到神经网络中的技术,特别是在自注意力机制(Self-Attention)中。这种编码方式在处理序列数据时具有重要的优势。以下是详细解释旋转位置编码为什么可以做位置编码,以及它的好处。

旋转位置编码的基本原理

旋转位置编码基于复数和欧拉公式的性质,通过将位置编码实现为特定频率的旋转操作,使得位置编码具有一些独特的优点。具体来说,旋转位置编码将位置 𝑝p 映射为复数平面上的旋转操作:

RoPE(𝑝)=(𝑒𝑖𝜃𝑝,𝑒𝑖𝜃𝑝+1,…,𝑒𝑖𝜃𝑝+𝑑/2)RoPE(p)=(eiθp​,eiθp+1​,…,eiθp+d/2​)

其中 𝜃𝑝θp​ 是与位置 𝑝p 相关的角度,通常设置为线性变化的函数。旋转位置编码的一个关键思想是,通过旋转操作来注入位置信息,使得编码后的向量能够自然地反映序列中的位置关系。

为什么旋转位置编码可以做位置编码

  1. 保留相对位置信息:旋转位置编码能够自然地保留相对位置信息。对于两个位置 𝑝p 和 𝑞q,它们的相对位置可以通过旋转角度的差异反映出来。这对于处理序列数据中的相对位置关系非常重要。

  2. 周期性特点:由于旋转操作具有周期性,旋转位置编码能够捕捉序列中的周期性模式。这在自然语言处理、时间序列分析等领域尤为有用,因为这些数据通常具有周期性特征。

  3. 平滑变化:旋转位置编码让位置之间的变化是连续和平滑的。这种平滑性使得模型在推理过程中能够更好地捕捉和利用位置之间的关系。

旋转位置编码的好处

  1. 增强模型的表达能力:通过引入旋转位置编码,模型能够更好地捕捉输入序列中的位置信息,从而增强模型的表达能力。特别是在自注意力机制中,位置编码可以帮助模型理解位置之间的依赖关系。

  2. 提高模型的泛化能力:旋转位置编码能够处理不同长度的序列,并且能够推广到未见过的序列长度。这是因为旋转位置编码是基于频率的,相对位置关系不会因序列长度的变化而改变。

  3. 减少计算复杂度:相比于其他位置编码方法(如绝对位置编码或相对位置编码),旋转位置编码在计算上更为简洁和高效。这对于大型模型的训练和推理非常有利,能够显著减少计算开销。

  4. 更自然地处理周期性数据:由于旋转位置编码的周期性特征,它在处理具有周期性模式的数据时表现尤为出色。这使得它在时间序列预测、周期性事件检测等任务中具有显著优势。

总结

旋转位置编码通过复数的旋转操作将位置信息注入到神经网络中,具有保留相对位置信息处理周期性数据、平滑变化等优势。它能够增强模型的表达能力和泛化能力,同时减少计算复杂度。正因为这些优点,旋转位置编码在自然语言处理、时间序列分析等领域得到了广泛应用,并显示出显著的效果。

为什么说旋转位置编码基于频率,而不是角度,频率做什么解释

GPT-4o的机器人图片

GPT-4o

Poe

旋转位置编码(Rotary Position Embedding, RoPE)的核心思想是通过频率来编码位置信息,而频率的变化反映在角度的变化上。这种编码方式通过频率调制实现了位置编码的目标。让我们深入解释一下为什么旋转位置编码基于频率以及如何理解频率的作用。

频率与旋转位置编码

在旋转位置编码中,频率指的是位置编码中角度变化的速率。高频率意味着角度变化得更快,低频率意味着角度变化得更慢。频率在这里起到了将位置信息映射到不同“旋转速度”上的作用。

具体来说,旋转位置编码可以表示为:

𝑒𝑖𝜃𝑘𝑝eiθk​p

其中:

  • 𝜃𝑘θk​ 是与频率 𝑘k 相关的角度步长(通常与位置 𝑝p 和特定频率 𝑘k 有关)。
  • 𝑝p 是位置索引。

频率的作用

频率在旋转位置编码中起到了以下几个关键作用:

  1. 捕捉不同尺度的信息:通过使用不同的频率,我们可以捕捉到输入序列中不同尺度的信息。低频率捕捉全局模式高频率捕捉局部细节。这种多尺度的信息捕捉对于理解复杂的序列数据非常重要。

  2. 相对位置关系:频率调制的角度变化能够自然地保留相对位置关系。例如,对于两个位置 𝑝p 和 𝑞q,它们在某一频率下的相对位置关系可以通过 的差异来反映。

  3. 周期性特征:频率本身具有周期性,这意味着旋转位置编码能够自然地处理具有周期性特征的数据。例如,时间序列数据中的周期性模式可以通过适当选择频率来捕捉。

数学解释

假设我们有一个位置 𝑝p,我们希望对其进行编码。旋转位置编码会给每个位置一个基于频率的旋转角度:

RoPE(𝑝)=(𝑒𝑖𝜃1𝑝,𝑒𝑖𝜃2𝑝,…,𝑒𝑖𝜃𝑑𝑝) RoPE(p)=(eiθ1​p,eiθ2​p,…,eiθd​p)

其中 𝜃𝑘θk​ 是与频率 𝑘k 相关的角度步长。这个表达式表示位置 𝑝p 的编码是通过对不同频率下的角度进行旋转操作得到的。

实际应用

在实践中,旋转位置编码常用于自注意力机制中。自注意力机制需要了解序列中各个位置之间的关系,而旋转位置编码通过频率调制的角度变化为每个位置提供了独特的编码,从而帮助模型更好地理解和处理序列数据。

为什么基于频率而不是角度

虽然角度在旋转位置编码中起到了直接作用,但频率才是其背后的驱动力。频率决定了角度变化的速率和模式,不同频率可以捕捉到不同尺度的信息。因此,频率是旋转位置编码的核心概念,而角度是频率调制的结果

总结

旋转位置编码基于频率,因为频率决定了位置编码中角度变化的速率和模式。通过使用不同频率,旋转位置编码能够捕捉到输入序列中的多尺度信息、保留相对位置关系,并处理周期性特征。频率调制的角度变化是实现这些目标的关键,因此频率是旋转位置编码的核心概念。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/784601.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【密钥使用介绍及通用流程】

密钥使用介绍及通用流程 为了实现对数据机密性、完整性等保护&#xff0c;可使用生成/导入的密钥&#xff0c;对数据进行密钥操作&#xff0c;比如&#xff1a; [加密解密][签名验签][密钥协商][密钥派生]开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin…

前端面试题28(Vue3的Teleport功能在什么场景下特别有用?能给个例子吗?)

Vue 3 的 Teleport 功能在需要将组件的渲染结果放置在 DOM 树中与当前组件位置无关的任意位置时特别有用。这通常涉及到需要将某些UI元素&#xff08;如模态框、弹出菜单、通知、工具提示等&#xff09;从其逻辑上的父级组件中“提取”出来&#xff0c;放置到页面的更高层级或完…

OpenAI Gym Atari on Windows

题意&#xff1a;在Windows系统上使用OpenAI Gym的Atari环境 问题背景&#xff1a; Im having issues installing OpenAI Gym Atari environment on Windows 10. I have successfully installed and used OpenAI Gym already on the same system. It keeps tripping up when t…

2024已过半,还没试过在vue3中使用ioc容器吗?

Vue3 已经非常强大和灵活了&#xff0c;为什么还要引入 IOC 容器呢&#xff1f;IOC 容器离不开 Class&#xff0c;那么我们就从 Class 谈起 Class的应用场景 一提起 Class&#xff0c;大家一定会想到这是 Vue 官方不再推荐的代码范式。其实&#xff0c;更确切的说&#xff0c…

SSO单点登录-1-同浏览器进行单点登录

前端同域 客户端前端同域&#xff0c;则cookie可以存在相同的域名或顶级域名下&#xff0c;一个客户端登录成功后&#xff0c;将token信息保存到域名下的cookie中其他不同客户端访问时&#xff0c;因为域名或者顶级域名相同&#xff0c;也能取到域名下的cookie中的token信息并…

动态粒子发射特效404网站HTML源码

源码介绍 动态粒子发射404网站HTML源码&#xff0c;粒子内容可以进行修改&#xff0c;默认是4&#xff0c;0数字还有一个页面不存在英文&#xff0c;可以自行修改&#xff0c;喜欢的朋友可以拿去使用&#xff0c;源码是html&#xff0c;记事本打开修改即可&#xff0c;鼠标双击…

大模型应用元年,到底有哪些场景可以实际落地场景?

很多企业和个人都号称自己打造了AI大模型实际落地场景&#xff0c;其中有噱头、蹭热点&#xff0c;也有真实落地应用的。下面我将聊聊有哪些应用是真实落地可执行的。 大模型写作 生成式大语言大模型的看家本领非写作莫属。大模型输出logits的基础上加上top_p、top_k、temper…

昇思MindSpore学习笔记5-02生成式--RNN实现情感分类

摘要&#xff1a; 记录MindSpore AI框架使用RNN网络对自然语言进行情感分类的过程、步骤和方法。 包括环境准备、下载数据集、数据集加载和预处理、构建模型、模型训练、模型测试等。 一、概念 情感分类。 RNN网络模型 实现效果&#xff1a; 输入: This film is terrible 正…

Tomcat的负载均衡、动静分离

一、如何tomcat和nginx负载均衡及动静分离&#xff1a;2台tomcat&#xff0c;3台nginx来实现 1.首先设置tomcat1和tomcat2服务器 关闭两台tomcat的防火墙及安全机制&#xff1a;systemctl stop filwalld setenforce 0 进入tomcat目录的webapps中&#xff0c;创建test 2.配…

PI 接口日志设置

一、全局设置 SAP NetWeaver Administrator ---> 配置 ---> 基础架构 ---> Java系统属性 ---> 选择服务页签 ---> 选择 "XPI Adapter:XI"服务进行设置。 1760915 - FAQ: Staging and Logging in PI 7.3 and higher 2518441 - The tablespace PSAPSR…

亿康源精英盛宴暨亿康源启动成功举办

&#xff08;本台记者报&#xff09;2024年7月7日下午&#xff0c;亿康源精英盛宴暨启动仪式在杭州市中维歌德大酒店盛大举行。此次盛会不仅吸引了行业内的专业人才、著名投资界大咖和科技领域的杰出企业家&#xff0c;还汇聚了众多关注大健康产业的各界人士&#xff0c;共同见…

【Linux】进程间通信——匿名管道

为什么要进行进程间通信&#xff1f; 1.数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程&#xff0c;比如我们有两个进程&#xff0c;一个负责获取数据&#xff0c;另一个负责处理数据&#xff0c;这时第一个进程就要将获取到的数据交给第二个进程 2.资源共享&…

永磁同步电机无速度算法--滑模观测器(反正切、反余弦)

一、原理介绍 在永磁同步电机滑模观测器控制中&#xff0c;转子的位置和转速信息与反动电势密切相关。滑模观测器控制基本设计思路是&#xff1a;利用永磁同步电机的电压、电流信息&#xff0c;通过永磁同步电机数学模型&#xff0c;估算出电机在两相静止坐标系中的反电动势信…

(十) Docker compose 本地部署 apollo

文章目录 1、apollo2、数据库准备3、启动后会用到的几个地址4、docker-compose运行 apollo方式一&#xff1a;使用容器 hostName 作为网络媒介apollo 客户端通过宿主机端口 拉取配置(推荐)apollo 客户端通过 自定义hostName 拉取配置 方式二&#xff1a;使用端口映射固定 ip 作…

transformer网络学习

Transformer encoder-decoder模型之间共享的是Encoder最后一层输出的hidden-state。 GitHub - huggingface/transformers: &#x1f917; Transformers: State-of-the-art Machine Learning for Pytorch, TensorFlow, and JAX. Bert2Bert中&#xff0c;Encoder的hidden-state同…

阿里开源语音理解和语音生成大模型FunAudioLLM

近年来&#xff0c;人工智能&#xff08;AI&#xff09;的进步极大地改变了人类与机器的互动方式&#xff0c;例如GPT-4o和Gemin-1.5等。这种转变在语音处理领域尤为明显&#xff0c;其中高精度的语音识别、情绪识别和语音生成等能力为更直观、更类人的交互铺平了道路。阿里开源…

JAVA Tesseract OCR引擎

Tess4j是一个基于Tesseract OCR引擎的Java库, Tesseract库最初由惠普实验室于1985年开发&#xff0c;后来被Google收购并于2006年开源。识别效果不好&#xff0c;速度还慢&#xff0c;但是好早好早了。 一、POM依赖 <!--OCR识别https://digi.bib.uni-mannheim.de/tesserac…

library source does not match the bytecode for class SpringApplication

library source does not match the bytecode for class SpringApplication 问题描述&#xff1a;springboot源码点进去然后download source后提示标题内容。spring版本5.2.8.RELEASE&#xff0c;springboot版本2.7.18 解决方法&#xff1a;把spring版本改为与boot版本对应的6.…

昇思25天学习打卡营第5天|MindSpore网络模型构建

打卡 目录 打卡 模型类 模型网络&#xff1a;定义与使用 模型层级分解 nn.Flatten 张量转换-演示查看 nn.Dense 全连接层-演示查看 nn.ReLU 非线性激活层-演示查看 nn.SequentialCell 有序网络容器 nn.Softmax 多分类概率预测 模型参数 前置感受&#xff1a;总的来说…

前端面试题25(css常用的预处理器)

在前端开发领域&#xff0c;CSS预处理器在面试中经常被提及&#xff0c;其中最流行的三种预处理器是Sass、LESS和Stylus。下面分别介绍它们的特点和优势&#xff1a; 1. Sass&#xff08;Syntactically Awesome Style Sheets&#xff09; 优势&#xff1a; 变量&#xff1a;允…