简要介绍rotary positional encoding (RoPE)的原理,主要参考RoFormer
经典的(用sinusoidal的)positional encoding直接把positional encoding向量加到输入x上,然后再分别乘各自权重变成qkv。这是一种绝对位置编码,后来也有人将其魔改为相对位置编码(即qk点积的值只和相对距离有关(即paper中的m-n))。
但RoPE直接从“相对位置”这条约束出发,构造了一个只与相对距离有关的变换方式

当然这个地方的推导只针对都是2d向量(“二元”的普通复数)的情形,对于高维输入直接两两分组,分别使用旋转矩阵即可,因此完整矩阵形式中的R就是一个分块对角矩阵。如果高维输入是奇数,可以直接抛弃某一维(指这一维只乘1,相当于旋转0度)
需要注意的细节:
- 经典的positional encoding是加在输入x上的,而RoPE是乘在qkv上而非输入x上的
- 不同2d子空间对应的转角是完全可以不同的,这个值可以自行选取,所以原作者直接借用了sinusoidal的方式。原则上当然也可以训练得到,但以sinusoidal形式定初值后训练中变化不大,因此就直接定为固定值了。
- 分块对角矩阵太稀疏,实际实现时一定要优化成点积和的形式

RoPE更详细的介绍可以直接参考原作者的blog。RoFormer文章前半段和blog的内容基本上是一样的。