最终,在 NLP 这个 RPE 的"原产地",酝酿出了一种新的范式:

有没有一种位置编码,既不修改注意力公式,也不引入额外参数,却能让 QK 点积本身就"感知"到相对位置?

2021 年的论文:RoFormer: Enhanced Transformer with Rotary Position Embedding 给出了答案。
它不仅解决了这个问题,还直接奠定了现代大模型中位置编码的事实标准,今天几乎所有主流开源大模型(LLaMA、Mistral、Qwen、GLM……)都在使用它。

这套方案就是 旋转位置编码 RoPE(Rotary Position Embedding)。

1. RoPE 的核心思路#

我们再再再看一遍标准的自注意力:

Attention(�,�,�)=softmax(����)�

这里 ��� 中的每个元素 ��⋅�� ,衡量的就是 token � 和 � 的内容相关性。

一直以来的问题都是:这个点积本身不知道任何位置信息。 比如同一个词出现在位置 1 和位置 100,只要内容相同,点积结果就完全相同。

而之前提到过的 RPE 方案都是在"补救"这个问题,它们的共同特点是:

位置信息是通过种种逻辑"后加"到注意力分数上的,Q、K本身的语义仍然不变。

RoPE 的想法刚好相反:

不在注意力公式上做任何加法,而是让 Q 和 K 的向量表示本身就携带位置信息。

具体怎么做的?就是旋转。

假设现在有一个 2 维向量 �=(�1,�2),我们让它绕原点旋转一个角度 �:

[�1′�2′]=[cos⁡�−sin⁡�sin⁡�cos⁡�][�1�2]

这就是一个标准的二维旋转矩阵 �(�),现在,我们定义一个函数,用这个矩阵对二维向量进行旋转,那就是:

�(�)=�(�)�

在这个基础上,我们再加入位置参数,看看如果我们对位置 � 的 Q 旋转 ��,对位置 � 的 K 旋转 ��,它们的点积会是什么?

�(�,�)=�(��)�,�(�,�)=�(��)�

�(�,�)��(�,�)=���(��)��(��)�

根据正交矩阵的转置等于逆和三角函数性质,我们得到:

�(��)��(��)=�(−��)�(��)=�((�−�)�)

最终结果如下:

�(�,�)��(�,�)=���((�−�)�)�

你会发现:点积结果只依赖于 �−�,即相对位置。
这一段推导下来说明的是什么?

如果我们用一个和位置相关的旋转函数对两个位置的 � 和 � 进行旋转,那么二者的点积结果,也就是注意力分数就会受到它们之间的相对位置影响。

a8c60bb6-adb7-429f-8a01-bfce983cf6a4.png

这便是 RoPE 的核心思路。

2. RoPE 的具体逻辑#

2.1 高维空间推广问题#

二维旋转给了我们启发,但实际中向量维度 � 通常几百上千。
现在,一个很自然的想法就是:

直接对整个高维向量做一次整体旋转。

但这里会带来一个严重问题:

整体旋转造成大规模的信息耦合,导致优化困难。

首先,训练后,无论是词向量,还是经过线性变换后的 � 和 �,本质上都已经处于一个训练好的高维特征空间中。

虽然我们很难精确说:“第几维一定表示什么语义”。但模型已经通过大量训练,学会了不同维度间的语义关系、结构。
如果此时用一个矩阵直接对整个高维向量进行一次全局旋转,那么新的每个维度都是由所有原始维度大规模混合得到,破坏了原有的语义结构。
例如:

�1′=0.3�1+0.7�18−0.2�93+…

你可能会问:

通过反向传播,我们训练出来的语义空间本身不就是适应旋转操作的语义空间吗?

这句话本身是完全没有问题的,但是这时:一个维度会依赖大量其它维度、局部修改会影响整体结构、特征分工会变得困难、梯度传播会更加复杂。
因此,这种全局耦合会让优化会变得非常困难。

因此,问题就变成了:

如何最小入侵式地把位置信息注入到语义空间中?

RoPE 的答案是:

不对整个高维向量做一次整体旋转,而是把高维向量拆成多个二维子空间,每两个维度组成一组,在各自的小平面内独立旋转。

例如对于一个向量:

�=(�1,�2,�3,�4,�5,�6)

RoPE 会拆成:

(�1,�2),(�3,�4),(�5,�6)

然后分别进行二维旋转:

�(�1),�(�2),�(�3)

于是整个变换过程可以写成:

RoPE(�,�)=[�(��1)000�(��2)000�(��3)]�

这样:每个二维旋转块,只会影响自己对应的两个维度。
例如 (�1,�2) 只会在自身内部发生变化:

[�1′�2′]=�(�)[�1�2]

具体展开就是这样:

�1′=�1cos⁡�−�2sin⁡�

�2′=�1sin⁡�+�2cos⁡�

现在, 特征只会在两个维度间进行局部混合,不会像之前一样发生全局混合。
这样,原本的大尺度语义结构仍然保留,特征之间的稳定关系就不会被整体破坏,优化也更容易进行。

值得一提的是,为了合理应用 RoPE 和其他相关技术,我们会刻意设计模型输入维度为偶数,如果出现了奇数情况,那么最后一维不旋转。

除此之外,旋转本身还有一个极其重要的性质:

旋转矩阵是正交矩阵,应用只会改变向量方向,而不会改变长度。

这相比之前的直接修改特征值或额外叠加位置特征,RoPE 更接近在原有语义结构上,施加一种轻量级的几何变化。

9da96c7d-d5b1-450f-8634-a7dec2ca5ced.png

到这里,我们先初步解决了高维向量的旋转带来的优化问题,下面才是旋转在语义逻辑中的真实应用。

2.2 不同频率的旋转#

在之前的 T5 中,我们就提到过可学习编码相对固定编码的优势:适应能力,但这也让其失去了外推能力。
而 RoPE 以一种及其巧妙的方式几乎实现了二者兼得,我们来具体展开:

首先,如果所有二维子空间都使用同一个角度 � 旋转,那么位置 � 的旋转就是:

�(��)

你会发现这时位置 � 所在 token 的所有维度都会以完全同步的方式旋转。这会导致一个严重问题:整个高维空间实际上只拥有一种位置变化模式。

这样模型能够表达的位置关系非常有限。 因为不同的距离会被混在同一种旋转节奏中,很容易出现 “不同 token 间:我正好比你多转一个周期,咱们俩是一样的” 这种情况,这就会混淆模型对近距离和远距离的感知。

所以,RoPE 同样给出了解决方案:

不同二维子空间使用不同旋转频率。

即不同维度拥有不同的 ��,通常定义为:

��=10000−2��

这样,低维部分更高频,对位置变化更敏感,高维部分更低频,更适合远距离关系。
我们举一个简单的实例,假设现在只有两个二维子空间:

更多推荐