RoPE每次都要重新看,每次都记不住,说明之前没体会到灵魂。之前一直不理解高维情况怎么处理的,现在算是理解了。
动机
用绝对位置编码的方式,实现相对位置编码。指数函数相乘时,乘变成加,利用这个性质,可以让qk之间乘上之后,位置编码的相乘结果只和相对位置有关。
考虑x=[x1,x2],视为复平面上的点zx=x1+ix2。对于位置m,乘以旋转因子eimω。
f(x,m)=x⋅eimω
落实到向量上,就是乘上旋转矩阵:
q^=[cosmωsinmω−sinmωcosmω]q
计算m、n两个位置的qk的点积时:
q⋅k=q1k1+q2k2
对应复数的乘法:
zqzk∗=(q1+iq2)(k1−ik2)=(q1k1+q2k2)+i(q2k1−q1k2)
所以其实就是
q^⋅k^=Re[⟨f(q,m),f(k,n)∗⟩]=Re[qk∗ei(m−n)ω]
只和位置差m−n有关。ω取个比较小的数,决定了能处理多长的序列。
推广
这一思路可以推广到高维向量。
将x=[x1,x2,…,xn]按照奇偶分为两组,或者说,每两个维度组成一个复数
zk=x2k+ix2k+1
每个维度使用不同频率的旋转因子:
zk→zkeimωk
m表示位置,k表示向量中的位置。
ωk=(100001)d2k
由于k表示元素在向量中的位置,所以取值是[0,2d],小k意味着频率低(远处和近处的注意力差不多),大k意味着频率高(远处的注意力衰减速度很快),实现不同维度感知不同尺度的相对距离。这里设计来自transformer原文的sinusoial
pe。10000是个任意的大数,决定了能区分的最大相对距离(见下一小节)。但是毕竟浮点数精度有限,取特别大也没有多少意义。
对于每一组,都按照上一节的方式处理,向量点积的时候自然就只和位置差有关。
RoPE能区分的最大相对距离
已知eiθ=eiθ+2π,因此反推最大距离差d=m−n,可得
dω=2π
即有
d=ω2π≥ωmin2π
我们知道ωmin=ωd/2=10000−1。因此上一小节中的大数决定了RoPE能感知的最大相对距离。所以模型的context
length实际上和这个有一定关联。
2D RoPE
把特征的维度d继续等分,对于位置(x,y),前d/2维度按照x的位置旋转,后d/2维度按照y的位置旋转。以此实现一个位置(x,y)上对应唯一的位置编码。