RoPE通俗讲解

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


图1.png

一、背景

attention计算如下所示,详情查看《Attention Is All You Need》算法详解
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)}
\boldsymbol{o}_m = \sum_{n=1}^{N} a_{m,n} \boldsymbol{v}_n

attention的计算示例图如下所示


图2.png

记住这里的两个维度(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这种相对位置编码的关系。

\langle f_q(x_m, m), f_k(x_n, n) \rangle = g(x_m, x_n, m - n)

作者给出了一种满足上式的情况,假设当前d=2.
\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*}
其中Re[\cdot]表示取实部,(W_k x_n)^* 星号代表(W_k x_n)的复共轭

这里e^{i m \theta}表示的是将向量进行角度m\theta的旋转。 如下图所示

图3.png

上面是欧拉公式的视角,我们知道欧拉公式可以用矩阵形式表示
(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}

所以把f_q, f_k写成矩阵形式为(实际计算也是利用下式来做的)
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}
其中(x_m^{(1)}, x_m^{(2)})表示二维向量x_m中的两个标量值。

上面是维度为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位置了。

具体的对于同一个位置的不同维度的计算方式如下:
\theta_t = 1/10000^{2t/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}

可以看出对于同一个时序位置来说,在d维度上,不同的位置角频率\theta_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),每对分组根据不同的旋转角频\theta_t旋转,如图中绿色对、红色对等的旋转,而不同的feature又是根据不同的位置m计算总旋转角m\theta_t(如图中不同的feature对应的旋转向量用不同的颜色表示)。其中t就是d维度的索引,m就是图中不同feature的位置,即图中彩色的1,2,3,4,5,6。

图4.png

最后这里贴一下多维度时的计算公式,也可以看出是在d维度上两两分组,通过对分组好的向量进行旋转来达到引入位置编码的目的。
f_{\{q,k\}}(\boldsymbol{x}_m, m) = R_{\Theta,m}^d W_{\{q,k\}} \boldsymbol{x}_m

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}

三、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分配如下图所示


图5.png

那具体是怎么计算2D RoPE的呢?

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


图6.png

角频率计算方式还是
\theta_t = 1/10000^{2t/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。示例图如下:


图7.png

3.3 扩展

毕竟训练的时候是video,image,text混合成一条时序信息计算的,那这个时候image和text的位置id怎么算呢?

  1. 所有的模态的id都是三维的(i,j,k)
  2. 对于文本来说i=j=k且是上一个token的id+1
  3. 对于image来说j和k同之前2D RoPE分配方式,根据切块来分配的基础上,最小值是上一个token的id+1。

具体的,假设输入的数据格式为video-text-text-image-text,video由两个视频帧组成,video的视频帧和image都被划分成3x3大小的patch,该数据位置id示意图如下


图8.png

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


图9.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容