赞
踩
对于两个复数, z 1 = a + b i z_1=a+bi z1=a+bi和 z 2 = c + d i z_2=c+di z2=c+di,计算 z 1 z 2 z_1z_2 z1z2
目标:对q和k分别添加绝对位置信息,在做完点乘之后,具有相对位置信息。即q和k的位置分别是m,n,点乘之后,位置信息只与m-n有关
其中,
e
i
x
=
cos
x
+
i
sin
x
e^{ix}=\cos x+i\sin x
eix=cosx+isinx
W
q
,
W
k
W_q,W_k
Wq,Wk是quey和key对应的可学习矩阵,假设输入的query和key是
d
m
d_m
dm维的,那么
x
m
,
x
n
∈
R
d
m
×
1
x_m,x_n\in\mathcal{R}^{d_m\times1}
xm,xn∈Rdm×1,使用
W
q
,
W
k
W_q,W_k
Wq,Wk进行变换,变换之后的结果是
R
d
m
×
1
\mathcal{R}^{d_m\times1}
Rdm×1,这里我们只考虑2维的情况。
记
x
m
,
x
n
x_m,x_n
xm,xn变换之后的向量是
q
m
,
k
n
∈
R
2
×
1
q_m,k_n\in\mathcal{R}^{2\times1}
qm,kn∈R2×1。
q
m
e
i
m
θ
q_me^{im\theta}
qmeimθ是一个向量乘以一个复数,二维向量可以看成一个复数,那么上式可以看成两个复数相乘,那么根据第二部分的知识,两个复数的乘积等于:幅角相加,模长相乘。而
e
i
m
θ
e^{im\theta}
eimθ的模长是1,即相乘之后的模长不变,只进行了旋转,即把
q
m
q_m
qm向量旋转了
m
θ
m\theta
mθ角度。根据第一部分的知识,旋转就是乘上一个旋转矩阵,即
f
q
(
x
m
,
m
)
=
[
cos
m
θ
−
sin
m
θ
sin
m
θ
cos
m
θ
]
[
q
m
1
q
m
2
]
f_q(x_m,m)=
f
k
(
x
n
,
n
)
=
[
cos
n
θ
−
sin
n
θ
sin
n
θ
cos
n
θ
]
[
k
n
1
k
n
2
]
f_k(x_n,n)=
对于
q
m
k
n
∗
e
i
(
m
−
n
)
θ
q_mk_n^*e^{i(m-n)\theta}
qmkn∗ei(m−n)θ,前面的
q
m
k
n
∗
q_mk_n^*
qmkn∗可以看成两个复数相乘,可以转化为复数的矩阵形式,即
q
m
k
n
∗
=
[
q
m
1
−
q
m
2
q
m
2
q
m
1
]
[
k
n
1
−
k
n
2
]
=
[
q
m
1
k
n
1
+
q
m
2
k
n
2
q
m
2
k
n
1
−
q
m
1
k
n
2
]
再乘上
e
i
(
m
−
n
)
θ
e^{i(m-n)\theta}
ei(m−n)θ,相当于把上述的2维向量旋转了
(
m
−
n
)
θ
(m-n)\theta
(m−n)θ,乘上一个旋转矩阵即可,即
q
m
k
n
∗
e
i
(
m
−
n
)
θ
=
[
cos
(
m
−
n
)
θ
−
sin
(
m
−
n
)
θ
sin
(
m
−
n
)
θ
cos
(
m
−
n
)
θ
]
[
q
m
1
k
n
1
+
q
m
2
k
n
2
q
m
2
k
n
1
−
q
m
1
k
n
2
]
只取实数部分,即
g
(
x
m
,
x
n
,
m
−
n
)
=
(
q
m
1
k
n
1
+
q
m
2
k
n
2
)
(
cos
(
m
−
n
)
θ
)
−
(
q
m
2
k
n
1
−
q
m
1
k
n
2
)
(
sin
(
m
−
n
)
θ
)
对于
<
f
q
(
x
m
,
m
)
,
f
k
(
x
n
,
n
)
>
<f_q(x_m,m), f_k(x_n,n)>
<fq(xm,m),fk(xn,n)>,可以计算:
<
f
q
(
x
m
,
m
)
,
f
k
(
x
n
,
n
)
>
=
(
[
cos
m
θ
−
sin
m
θ
sin
m
θ
cos
m
θ
]
[
q
m
1
q
m
2
]
)
T
(
[
cos
n
θ
−
sin
n
θ
sin
n
θ
cos
n
θ
]
[
k
n
1
k
n
2
]
)
=
g
(
x
m
,
x
n
,
m
−
n
)
根据上述的内容,我们可以发现,实现很容易,对query和key分别乘以一个旋转矩阵就可以了。对于多维的情况,两两分组即可。
上述的矩阵过于稀疏,计算效率不高。因此有如下的高效实现
另外,transformers库中的实现与论文有点区别,高维的情况,不是相邻两个一组。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。