我们之前的位置编码方式为在旧的向量上加一个位置向量,从而形成携带了位置信息的新向量,但这种方式污染了原向量的语义,在最终的向量中无法推出原向量内容是什么、位置向量是什么。

那么有没有一种方法,能够标名位置,又不改变词向量原本的模长呢,接下来就看RoPE的编码方式。

首先看一下整个旋转矩阵:

当这个矩阵右乘一个向量X,则表示在保持向量X的向量长度不变的基础上,将向量X逆时针旋转α度。

接下来我我们假设   向量“我”是q,向量“你”是k,加上位置编码后的“我”是q',“你”是k'(假设q的位置是m,k的位置是n),那么这两个向量做点积就是

然而我们发现,R(a)^{T}=R(-a),我们带入原式:
 

此时,我们看到q' 和k' 的点积加入了旋转的 相对位置R((n-m)\theta )也就是RoPE通过绝对的位置编码(旋转矩阵)实现了相对的位置编码((n-m)倍的θ)。

🆗,这就是RoPE的主体思想,上面探讨了二维坐标的情况,那么对于高维向量应该怎么旋转呢?

RoPE的作者使用了分治法,例如:假如词向量是4096维度,那就把这4096维两两分组,变成2048个组,各个组自行进行旋转。从而实现了高维的位置编码。

还有一个问题就是,如果一个句子很长,超过一定的值,会导致某一个位置是需要旋转360度以上,比如旋转10度和旋转370度是在同一个位置,那这样的话不就会导致和前面的句子位置重叠吗?

作者的解决方案是使不同的分组分配不同大小的θ,组的维数越大,θ就越小,转的也就越慢。

低维度就像是秒针跑的很快,高维度就像是时针转的很慢。

恭喜你,已经拿下了RoPE编码

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐