旋转位置编码
Transformer升级之路:2、博采众长的旋转式位置编码 - 科学空间|Scientific Spaces
旋转矩阵
旋转位置编码的关键就在于对q,k向量额外乘一个旋转矩阵。旋转矩阵是单位正交阵,正交意味着它的转置等于它的逆,也意味着两个向量点乘的结果不会有改变,单位则意味着向量的模长不会变。这两个特性让旋转矩阵可以让高维向量/形状旋转
原文对位置编码这个任务进行了形式化
对q,k向量进行一个操作,让q和k带上绝对的位置信息。因为是旋转位置编码,这里的操作f就表示让q向量旋转角度m,让k向量旋转角度n
按照注意力的计算方式对加入了绝对位置信息的q,k点乘,点乘结果只和相对位置信息有关。这里相对位置信息就是m-n,即q,k之间旋转角度的差值,如果m-n=0,意思就是q,k旋转了相同的角度,结果一样。
只要满足上面两个条件,就满足了用绝对位置信息搞相对位置编码的要求了。另外为了方便,还可以假设
通过二维旋转矩阵引入位置信息
原文先假设q,k是二维向量,然后通过复数来推导。因为复数乘法有旋转的几何含义(上面的第一个式子)。同时复数相乘取实部(或者虚部)有点乘的效果(第二个式子),所以可以用来简化推导。(但是当时看的时候稍微有点困惑)
接下来,对更高维度的q,k,我们可以对向量两两分组,每一组用不同的旋转矩阵进行旋转(即
但是这里似乎用完全相同的
上面的
其实只要能满足下面这个式子就可以了
下面还可以将乘一个旋转矩阵改成这种逐个位置相加的形式。这也是为什么我们不选择其他旋转矩阵的原因——因为这样的稀疏的分块对角的旋转矩阵实现更简单。
角度设置
最后,文章讲了如何选择
首先,虽然当m-n=0时,q,k使用相同的旋转矩阵,不会改变点积的结果,但是m-n比较大时,就会改变点积结果。
假设q,k是相同的二维向量,相距m,点积结果为
(因为某个向量多旋转了
那么假设旋转角度
但是
上面作者选择
上面的分析只是说了为什么对每个分块旋转矩阵要选择不同的旋转角度,为什么距离较远的向量旋转编码后点积结果会小,以及最小旋转角度可能和最大序列长度有关。并没有说明为啥要
附:Transformer升级之路:18、RoPE的底数设计原则 - 科学空间|Scientific Spaces 从语义聚合的角度对
扩展上下文
选择
下图是位置编码的示意图,横坐标为i,表示了q,k向量不同的维度,纵坐标为m,表示了相对位置。颜色表示
(实际图上每一列是
看上去很像二进制,因为每一列都是不同的周期函数,在-1~1之间变动
实际上这个位置编码可以理解为
与实际的x进制的区别在于幅值只在-1~1而不是0~x-1
这个函数的周期为
线性内插
位置m一般取0,1,2,3,4…但是如果让它取0,0.5,1,1.5…呢?我们只需要把角度
对应到图上,就是把那张图竖着等比例拉长一倍。这样周期就变为
每列周期等比例伸长,但是相邻列周期比例
NTK-aware scaled RoPE
另一种思路是改变
实验表明这种效果更好
参考:Transformer升级之路:10、RoPE是一种β进制编码 - 科学空间|Scientific Spaces
其它
二维旋转位置编码
Transformer升级之路:4、二维位置的旋转式位置编码 - 科学空间|Scientific Spaces
一维的情况,找到满足
二维的情况,找到满足
同时对输入坐标(x,y)有可逆性,即给定x,y唯一确定一个矩阵
最后位置信息还是体现在点乘结果上