现有的attention结构如下图所示,输入的N长度的features之间在计算attention的时候是没有位置关系的。但是在不管是文本、图片还是视频两个feature之前是有先后、远近关系的。为了让模型能够学到这种关系,现在有大量的文章提出位置编码相关的内容。其中RoPE是比较常用的一种位置编码,包括后续一系列改进的位置编码都是在RoPE基础上做的,例如Qwen用于多模态的MD-RoPE可外推的Yarn。

一、背景
attention计算如下所示,详情查看《Attention Is All You Need》算法详解
attention的计算示例图如下所示

记住这里的两个维度(N,d),后面都是在这两个维度上做计算和解释的,其中N是features数量,d为每个feature的维度。
二、1D RoPE
从上面的attention公式看是通过内积计算的,现在文章想需要通过内积的方式将位置信息编码进去。且希望能找到一种方式,通过绝对位置编码的方式实现相对位置编码。
即绝对位置编码函数f(q,m),f(k, n)把位置信息m和n引入q和k中。通过函数g可以计算出q和k的相对位置。
于是作者构建了如下的函数,满足利用绝对位置通过内积实现相对位置的功能。即q的m位置feature和k的n位置feature通过引入绝对位置编码并内积后,能够体现m-n这种相对位置编码的关系。
作者给出了一种满足上式的情况,假设当前d=2.
其中表示取实部,
星号代表
的复共轭
这里表示的是将向量进行角度
的旋转。 如下图所示

上面是欧拉公式的视角,我们知道欧拉公式可以用矩阵形式表示
所以把写成矩阵形式为(实际计算也是利用下式来做的)
其中表示二维向量
中的两个标量值。
上面是维度为2的向量,即d=2。
一般feature是高维的,可以两两为一组进行旋转。但你可能会想,因为旋转是周期的,如果m位置和n位置都是旋转一周不就区分不了了吗?所以两个不同位置的feature,在不同组之间可以让他们角频率不一样。
例如d=4,可以分两组,(0,1)(2,3),当m位置(0,1)组向量转1/2圈的时候,n位置(0,1)组向量转1又1/2圈的时候,他们位置相同,但是(3,4)向量对应的角频率越小,旋转慢,m和n的(3,4)分别转的位置就不一样了,这样就能区分m和n位置了。
具体的对于同一个位置的不同维度的计算方式如下:
可以看出对于同一个时序位置来说,在d维度上,不同的位置角频率是不一样的,而且只与t有关。上式中的i就是对应时序的位置(如上述例子中的m和n)。2t中的2就是每两个d维度的值为一组,t从0开始,d=2t,例如d=4(0,1,2,3),t取值为0,1。
所以RoPE位置编码由两个维度决定,时序维度决定绝对位置,d维度决定同一个位置上不同维度的向量旋转角频率大小,间接影响相对位置。
那d扩展到d>2的维度是怎么计算的,同一个位置的feature(如图中enchaned对应的第一条feature),每对分组根据不同的旋转角频旋转,如图中绿色对、红色对等的旋转,而不同的feature又是根据不同的位置m计算总旋转角
(如图中不同的feature对应的旋转向量用不同的颜色表示)。其中t就是d维度的索引,m就是图中不同feature的位置,即图中彩色的1,2,3,4,5,6。

最后这里贴一下多维度时的计算公式,也可以看出是在d维度上两两分组,通过对分组好的向量进行旋转来达到引入位置编码的目的。
三、M-RoPE
3.1 2D RoPE
这里的1D\2D甚至3D位置编码指的位置id的分配以及后续通道维度的分配,即上述m的计算方法。这里要注意上面1D Rope的时候两两分组计算的,但2就是旋转位置编码要用到的维度,和2D RoPE中的2要区分。即使是2D甚至MD,旋转维度还是两两分组来做的。
下面详细介绍一下2D RoPE中m值(N维度)是怎么分配的。
对于一张图来说,不同于文本,它是二维的,所以在分配位置的时候需要在x和y两个维度的位置都有对应的id表示。假设一张图切为3x3的patch大小,每个patch经过vit后,生成一个图片feature。每个patch对应的id分配如下图所示

那具体是怎么计算2D RoPE的呢?
先给图片中每个patch分配对应的二维id,如上图所示。然后对一个(i,j)维度的feature来说,再从d维度一分为二,d/2分配给i计算位置编码,d/2分配给j计算位置编码。示例图如下表示了1D RoPE和2D RoPE d维度的分配方式:

角频率计算方式还是
只是这时候的d'=d/2了。
相当于2D RoPE就是在d维基础上分出一半给到width维度计算位置编码,另一半给到height维度计算位置编码。
3.2 M-RoPE
为了支持视频输入的位置编码计算,Qwen2VL引入了M-RoPE概念,它其实是3D-RoPE。从1D-RoPE扩展到2D-RoPE我们可以知道是在d维度从不切分到切为两份,那扩展到3D-RoPE就是把d维分成三份,一份给时间维度,一份给width,一份给height。示例图如下:

3.3 扩展
毕竟训练的时候是video,image,text混合成一条时序信息计算的,那这个时候image和text的位置id怎么算呢?
- 所有的模态的id都是三维的(i,j,k)
- 对于文本来说i=j=k且是上一个token的id+1
- 对于image来说j和k同之前2D RoPE分配方式,根据切块来分配的基础上,最小值是上一个token的id+1。
具体的,假设输入的数据格式为video-text-text-image-text,video由两个视频帧组成,video的视频帧和image都被划分成3x3大小的patch,该数据位置id示意图如下

上述根据维度d直接三等分分配给time、width、height,不太合理,这样会导致time都是低维度的,对应的角频率都较大,而width和height较小,不利于模型学习不同维度的位置关系。为了更为合理的分配,qwen3vl提出的Interleaved MRoPE的改进,即交错的给不同的维度分配向量。下面是原始的MRoPE和Interleaved MRoPE的对比示意图。
