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

一、背景
attention计算如下所示,详情查看《Attention Is All You Need》算法详解
a m , n = exp ( q m ⊤ k n d ) ∑ j = 1 N exp ( q m ⊤ k j d ) a_{m,n} = \frac{\exp\left(\dfrac{\boldsymbol{q}_m^\top \boldsymbol{k}n}{\sqrt{d}}\right)}{\sum{j=1}^{N} \exp\left(\dfrac{\boldsymbol{q}_m^\top \boldsymbol{k}_j}{\sqrt{d}}\right)} am,n=∑j=1Nexp(d qm⊤kj)exp(d qm⊤kn)
o m = ∑ n = 1 N a m , n v n \boldsymbol{o}m = \sum{n=1}^{N} a_{m,n} \boldsymbol{v}_n om=n=1∑Nam,nvn
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这种相对位置编码的关系。
⟨ f q ( x m , m ) , f k ( x n , n ) ⟩ = g ( x m , x n , m − n ) \langle f_q(x_m, m), f_k(x_n, n) \rangle = g(x_m, x_n, m - n) ⟨fq(xm,m),fk(xn,n)⟩=g(xm,xn,m−n)
作者给出了一种满足上式的情况,假设当前d=2.
f q ( x m , m ) = ( W q x m ) e i m θ f k ( x n , n ) = ( W k x n ) e i n θ g ( x m , x n , m − n ) = Re ( W q x m ) ( W k x n ) ∗ e i ( m − n ) θ \begin{align*} f_q(x_m, m) &= (W_q x_m) e^{i m \theta} \\ f_k(x_n, n) &= (W_k x_n) e^{i n \theta} \\ g(x_m, x_n, m - n) &= \operatorname{Re}\left\\,(W_q x_m)(W_k x_n)\^\* e\^{i(m-n)\\theta}\\,\\right \end{align*} fq(xm,m)fk(xn,n)g(xm,xn,m−n)=(Wqxm)eimθ=(Wkxn)einθ=Re(Wqxm)(Wkxn)∗ei(m−n)θ
其中 R e ⋅ Re\\cdot Re⋅表示取实部, ( W k x n ) ∗ (W_k x_n)^* (Wkxn)∗ 星号代表 ( W k x n ) (W_k x_n) (Wkxn)的复共轭
这里 e i m θ e^{i m \theta} eimθ表示的是将向量进行角度 m θ m\theta mθ的旋转。 如下图所示

上面是欧拉公式的视角,我们知道欧拉公式可以用矩阵形式表示
( a + i b ) ⋅ e i m θ ⟺ cos ( m θ ) − sin ( m θ ) sin ( m θ ) cos ( m θ ) a b (a + ib)\cdot e^{i m\theta} \iff \begin{bmatrix}\cos(m\theta) & -\sin(m\theta)\\\sin(m\theta) & \cos(m\theta)\end{bmatrix} \begin{bmatrix}a\\b\end{bmatrix} (a+ib)⋅eimθ⟺cos(mθ)sin(mθ)−sin(mθ)cos(mθ)ab
所以把 f q , f k f_q, f_k fq,fk写成矩阵形式为(实际计算也是利用下式来做的)
f { q , k } ( x m , m ) = ( cos m θ − sin m θ sin m θ cos m θ ) ( W { q , k } ( 11 ) W { q , k } ( 12 ) W { q , k } ( 21 ) W { q , k } ( 22 ) ) ( x m ( 1 ) x m ( 2 ) ) f_{\{q,k\}}(x_m, m) = \begin{pmatrix} \cos m\theta & -\sin m\theta \\ \sin m\theta & \cos m\theta \end{pmatrix} \begin{pmatrix} W_{\{q,k\}}^{(11)} & W_{\{q,k\}}^{(12)} \\ W_{\{q,k\}}^{(21)} & W_{\{q,k\}}^{(22)} \end{pmatrix} \begin{pmatrix} x_m^{(1)} \\ x_m^{(2)} \end{pmatrix} f{q,k}(xm,m)=(cosmθsinmθ−sinmθcosmθ)(W{q,k}(11)W{q,k}(21)W{q,k}(12)W{q,k}(22))(xm(1)xm(2))
其中 ( x m ( 1 ) , x m ( 2 ) ) (x_m^{(1)}, x_m^{(2)}) (xm(1),xm(2))表示二维向量 x m x_m xm中的两个标量值。
上面是维度为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位置了。
具体的对于同一个位置的不同维度的计算方式如下:
θ t = 1 / 10000 2 t / d \theta_t = 1/10000^{2t/d} θt=1/100002t/d
{ p i , 2 t = sin ( i / 10000 2 t / d ) p i , 2 t + 1 = cos ( i / 10000 2 t / d ) \begin{cases} p_{i,2t} = \sin\bigl(i / 10000^{2t/d}\bigr) \\ p_{i,2t+1} = \cos\bigl(i / 10000^{2t/d}\bigr) \end{cases} {pi,2t=sin(i/100002t/d)pi,2t+1=cos(i/100002t/d)
可以看出对于同一个时序位置来说,在d维度上,不同的位置角频率 θ t \theta_t θt是不一样的,而且只与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),每对分组根据不同的旋转角频 θ t \theta_t θt旋转,如图中绿色对、红色对等的旋转,而不同的feature又是根据不同的位置m计算总旋转角 m θ t m\theta_t mθt(如图中不同的feature对应的旋转向量用不同的颜色表示)。其中t就是d维度的索引,m就是图中不同feature的位置,即图中彩色的1,2,3,4,5,6。

最后这里贴一下多维度时的计算公式,也可以看出是在d维度上两两分组,通过对分组好的向量进行旋转来达到引入位置编码的目的。
f { q , k } ( x m , m ) = R Θ , m d W { q , k } x m f_{\{q,k\}}(\boldsymbol{x}m, m) = R{\Theta,m}^d W_{\{q,k\}} \boldsymbol{x}_m f{q,k}(xm,m)=RΘ,mdW{q,k}xm
R Θ , m d = ( cos m θ 1 − sin m θ 1 0 0 ⋯ 0 0 sin m θ 1 cos m θ 1 0 0 ⋯ 0 0 0 0 cos m θ 2 − sin m θ 2 ⋯ 0 0 0 0 sin m θ 2 cos m θ 2 ⋯ 0 0 ⋮ ⋮ ⋮ ⋮ ⋱ ⋮ ⋮ 0 0 0 0 ⋯ cos m θ d / 2 − sin m θ d / 2 0 0 0 0 ⋯ sin m θ d / 2 cos m θ d / 2 ) R_{\Theta,m}^d = \begin{pmatrix} \cos m\theta_1 & -\sin m\theta_1 & 0 & 0 & \cdots & 0 & 0 \\ \sin m\theta_1 & \cos m\theta_1 & 0 & 0 & \cdots & 0 & 0 \\ 0 & 0 & \cos m\theta_2 & -\sin m\theta_2 & \cdots & 0 & 0 \\ 0 & 0 & \sin m\theta_2 & \cos m\theta_2 & \cdots & 0 & 0 \\ \vdots & \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & 0 & 0 & 0 & \cdots & \cos m\theta_{d/2} & -\sin m\theta_{d/2} \\ 0 & 0 & 0 & 0 & \cdots & \sin m\theta_{d/2} & \cos m\theta_{d/2} \end{pmatrix} RΘ,md= cosmθ1sinmθ100⋮00−sinmθ1cosmθ100⋮0000cosmθ2sinmθ2⋮0000−sinmθ2cosmθ2⋮00⋯⋯⋯⋯⋱⋯⋯0000⋮cosmθd/2sinmθd/20000⋮−sinmθd/2cosmθd/2
三、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维度的分配方式:

角频率计算方式还是
θ t = 1 / 10000 2 t / d ′ \theta_t = 1/10000^{2t/d'} θt=1/100002t/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的对比示意图。
