前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >博采众长式的旋转位置编码

博采众长式的旋转位置编码

作者头像
mathor
发布2021-05-20 15:04:10
1.6K0
发布2021-05-20 15:04:10
举报
文章被收录于专栏:mathormathor

上一篇文章中,我们对原始的Sinusoidal位置编码做了较为详细的推导和理解,总的感觉是Sinusoidal位置编码是一种"想要成为相对位置编码的绝对位置编码"。

本文将会介绍追一科技自研Rotary Transformer(RoFormer)模型,它的主要改动是引用了苏剑林大佬构思的"旋转式位置编码(Rotary Position Embedding,RoPE)",这是一种配合Attention机制能达到"绝对位置编码的方式实现相对位置编码的设计"。而也正因为这种设计,它还是目前唯一一种可用于线性Attention的相对位置编码

基本思路

我们假设通过下述运算来给\boldsymbol{q},\boldsymbol{k} 添加绝对位置信息:

\begin{equation}\tilde{\boldsymbol{q}}_m = \boldsymbol{f}(\boldsymbol{q}, m), \quad\tilde{\boldsymbol{k}}_n = \boldsymbol{f}(\boldsymbol{k}, n)\tag{1}\end{equation}

也就是说,我们分别为\boldsymbol{q},\boldsymbol{k} 设计操作\boldsymbol{f}(\cdot, m),\boldsymbol{f}(\cdot, n) ,使得经过该操作后,\tilde{\boldsymbol{q}}_m,\tilde{\boldsymbol{k}}_n 就带有了位置m,n 的绝对位置信息。Attention的核心运算是内积,所以我们希望内积的结果带有相对位置信息,因此假设存在恒等关系:

\begin{equation}\langle\boldsymbol{f}(\boldsymbol{q}, m), \boldsymbol{f}(\boldsymbol{k}, n)\rangle = g(\boldsymbol{q},\boldsymbol{k},m-n)\tag{2}\end{equation}

所以我们要求出该恒等式的一个(尽可能简单的)解。求解过程还需要一些初始条件,显然我们可以合理地设f(\boldsymbol{q},0)=\boldsymbol{q}f(\boldsymbol{k},0)=\boldsymbol{k}

求解过程

同上一篇思路一样,我们先考虑二维情形,然后借助复数来求解。在复数中有\langle\boldsymbol{q},\boldsymbol{k}\rangle=\text{Re}[\boldsymbol{q}\boldsymbol{k}^*]\text{Re}[] 代表复数的实部,我们希望存在某个函数g ,使其能够包含相对位置信息,即:

\begin{equation}\text{Re}[\boldsymbol{f}(\boldsymbol{q}, m)\boldsymbol{f}^*(\boldsymbol{k}, n)] = g(\boldsymbol{q},\boldsymbol{k},m-n)\tag{3}\end{equation}

简单起见,我们假设存在复数g(\boldsymbol{q},\boldsymbol{k},m-n) ,使得\boldsymbol{f}(\boldsymbol{q}, m)\boldsymbol{f}^*(\boldsymbol{k}, n) = \boldsymbol{g}(\boldsymbol{q},\boldsymbol{k},m-n) ,然后我们用复数的指数形式,设

\begin{equation}\begin{aligned} \boldsymbol{f}(\boldsymbol{q}, m) =&\, R_f (\boldsymbol{q}, m)e^{\text{i}\Theta_f(\boldsymbol{q}, m)} \\ \boldsymbol{f}(\boldsymbol{k}, n) =&\, R_f (\boldsymbol{k}, n)e^{\text{i}\Theta_f(\boldsymbol{k}, n)} \\ \boldsymbol{g}(\boldsymbol{q}, \boldsymbol{k}, m-n) =&\, R_g (\boldsymbol{q}, \boldsymbol{k}, m-n)e^{\text{i}\Theta_g(\boldsymbol{q}, \boldsymbol{k}, m-n)} \\ \end{aligned}\tag{4}\end{equation}

那么带入方程后就得到方程组

\begin{equation}\begin{aligned} R_f (\boldsymbol{q}, m) R_f (\boldsymbol{k}, n) =&\, R_g (\boldsymbol{q}, \boldsymbol{k}, m-n) \\ \Theta_f (\boldsymbol{q}, m) - \Theta_f (\boldsymbol{k}, n) =&\, \Theta_g (\boldsymbol{q}, \boldsymbol{k}, m-n) \end{aligned}\tag{5}\end{equation}

对于第一个方程,带入m=n=0 得到

\begin{equation}R_f (\boldsymbol{q}, m) R_f (\boldsymbol{k}, m) = R_g (\boldsymbol{q}, \boldsymbol{k}, 0) = R_f (\boldsymbol{q}, 0) R_f (\boldsymbol{k}, 0) = \Vert \boldsymbol{q}\Vert \Vert \boldsymbol{k}\Vert\tag{6}\end{equation}

最后一个等号源于初始条件\boldsymbol{f}(\boldsymbol{q}, 0)=\boldsymbol{q}\boldsymbol{f}(\boldsymbol{k}, 0)=\boldsymbol{k} 。所以现在我们可以很简单地设R_f (\boldsymbol{q}, m)=\Vert \boldsymbol{q}\Vert, R_f (\boldsymbol{k}, m)=\Vert \boldsymbol{k}\Vert ,即它不依赖于m 。至于第二个方程,同样带入m=n=0 得到

\begin{equation}\Theta_f (\boldsymbol{q}, m) - \Theta_f (\boldsymbol{k}, m) = \Theta_g (\boldsymbol{q}, \boldsymbol{k}, 0) = \Theta_f (\boldsymbol{q}, 0) - \Theta_f (\boldsymbol{k}, 0) = \Theta (\boldsymbol{q}) - \Theta (\boldsymbol{k})\tag{7}\end{equation}

这里的\Theta(\boldsymbol{q}),\Theta(\boldsymbol{k})\boldsymbol{q},\boldsymbol{k} 本身的幅角,最后一个等号同样源于初始条件。根据上式得到\Theta_f (\boldsymbol{q}, m) - \Theta (\boldsymbol{q}) = \Theta_f (\boldsymbol{k}, m) - \Theta (\boldsymbol{k}) ,所以\Theta_f (\boldsymbol{q}, m) - \Theta (\boldsymbol{q}) 应该是一个只与m 相关,跟\boldsymbol{q} 无关的函数,记为\varphi(m) ,即\Theta_f (\boldsymbol{q}, m) = \Theta (\boldsymbol{q}) + \varphi(m) 。接着带入n=m-1 ,整理得到

\begin{equation}\varphi(m) - \varphi(m-1) = \Theta_g (\boldsymbol{q}, \boldsymbol{k}, 1) + \Theta (\boldsymbol{k}) - \Theta (\boldsymbol{q})\tag{8}\end{equation}

首先将n=m-1 带入式(5)的第二个式子,得到 \begin{aligned} \Theta_f (\boldsymbol{q}, m) - \Theta_f (\boldsymbol{k}, m-1) =\, \Theta_g (\boldsymbol{q}, \boldsymbol{k}, 1) \end{aligned} 上式两边同减\Theta(\boldsymbol{q})\begin{aligned} \Theta_f (\boldsymbol{q}, m) - \Theta(\boldsymbol{q}) - \Theta_f (\boldsymbol{k}, m-1) =\, \Theta_g (\boldsymbol{q}, \boldsymbol{k}, 1) - \Theta(\boldsymbol{q}) \end{aligned} 因为\Theta_f (\boldsymbol{q}, m) - \Theta(\boldsymbol{q})=\varphi(m) ,所以 \begin{aligned} \varphi(m) - \Theta_f (\boldsymbol{k}, m-1) =\, \Theta_g (\boldsymbol{q}, \boldsymbol{k}, 1) - \Theta(\boldsymbol{q}) \end{aligned} 上式两边同加\Theta(\boldsymbol{k}) \begin{aligned} \varphi(m) + \Theta(\boldsymbol{k}) - \Theta_f (\boldsymbol{k}, m-1) =\, \Theta_g (\boldsymbol{q}, \boldsymbol{k}, 1) + \Theta(\boldsymbol{k}) - \Theta(\boldsymbol{q}) \end{aligned} 因为\Theta (\boldsymbol{q}) - \Theta_f (\boldsymbol{q}, m) = \Theta (\boldsymbol{k}) - \Theta_f (\boldsymbol{k}, m) ,所以 \begin{aligned} \varphi(m) + \Theta (\boldsymbol{q}) - \Theta_f (\boldsymbol{q}, m-1) =\, \Theta_g (\boldsymbol{q}, \boldsymbol{k}, 1) + \Theta(\boldsymbol{k}) - \Theta(\boldsymbol{q}) \end{aligned} 最后因为\Theta_f (\boldsymbol{q}, m-1) - \Theta(\boldsymbol{q})=\varphi(m-1) ,所以

\begin{equation}\varphi(m) - \varphi(m-1) = \Theta_g (\boldsymbol{q}, \boldsymbol{k}, 1) + \Theta (\boldsymbol{k}) - \Theta (\boldsymbol{q})\end{equation}

说了这么多,就是为了证明\{\varphi(m)\} 是等差数列,设右端为\theta ,那么就解得\varphi(m)=m\theta

编码形式

综上,我们得到二维情况下用复数表示的RoPE:

\boldsymbol{f}(\boldsymbol{q},m)=R_f(\boldsymbol{q},m)e^{\text{i}\Theta_f(\boldsymbol{q},m)}=\Vert q\Vert e^{\text{i}(\Theta(q)+m\theta)}=\boldsymbol{q}e^{\text{i}m\theta}\tag{9}

\begin{aligned} \Vert q\Vert e^{\text{i}(\Theta(q)+m\theta)}&=\Vert q\Vert (e^{\text{i}\Theta(\boldsymbol{q})}\cdot e^{\text{i}m\theta}) \\ &= (\Vert q\Vert e^{\text{i}\Theta(\boldsymbol{q})} )e^{\text{i}m\theta}\\ &=\boldsymbol{q}e^{\text{i}m\theta} \end{aligned}

根据复数乘法的几何意义,该变换实际上对应着向量的旋转,所以我们称之为"旋转式位置编码",它还可以写成矩阵形式:

\begin{equation} \boldsymbol{f}(\boldsymbol{q}, m) =\begin{pmatrix}\cos m\theta & -\sin m\theta\\ \sin m\theta & \cos m\theta\end{pmatrix} \begin{pmatrix}q_0 \\ q_1\end{pmatrix}\tag{10}\end{equation}

为什么旋转对应矩阵相乘,可以看这篇文章:旋转之一 - 复数与2D旋转,或者大家直接搜复数乘法与向量旋转

由于内积满足线性叠加性,因此任意偶数维的RoPE,我们都可以表示为二维情形的拼接,即

\begin{equation}\scriptsize{\underbrace{\begin{pmatrix} \cos m\theta_0 & -\sin m\theta_0 & 0 & 0 & \cdots & 0 & 0 \\ \sin m\theta_0 & \cos m\theta_0 & 0 & 0 & \cdots & 0 & 0 \\ 0 & 0 & \cos m\theta_1 & -\sin m\theta_1 & \cdots & 0 & 0 \\ 0 & 0 & \sin m\theta_1 & \cos m\theta_1 & \cdots & 0 & 0 \\ \vdots & \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & 0 & 0 & 0 & \cdots & \cos m\theta_{d/2-1} & -\sin m\theta_{d/2-1} \\ 0 & 0 & 0 & 0 & \cdots & \sin m\theta_{d/2-1} & \cos m\theta_{d/2-1} \\ \end{pmatrix}}_{\boldsymbol{\mathcal{R}}_m} \begin{pmatrix}q_0 \\ q_1 \\ q_2 \\ q_3 \\ \vdots \\ q_{d-2} \\ q_{d-1}\end{pmatrix}}\tag{11}\end{equation}

也就是说,给位置为m 的向量\boldsymbol{q} 乘上矩阵\boldsymbol{R}_m ,位置为n 的向量\boldsymbol{k} 乘上矩阵\boldsymbol{R}_n ,用变换后的\boldsymbol{Q},\boldsymbol{K} 序列做Attention,那么Attention就自动包含相对位置信息了,因为下列等式恒成立:

\begin{equation}(\boldsymbol{\mathcal{R}}_m \boldsymbol{q})^{\top}(\boldsymbol{\mathcal{R}}_n \boldsymbol{k}) = \boldsymbol{q}^{\top} \boldsymbol{\mathcal{R}}_m^{\top}\boldsymbol{\mathcal{R}}_n \boldsymbol{k} = \boldsymbol{q}^{\top} \boldsymbol{\mathcal{R}}_{n-m} \boldsymbol{k}\tag{12}\end{equation}

总可以利用积化和差公式,使得\cos 或者\sin 中带有(m-n)

值得指出的是,\boldsymbol{R}_m 是一个正交矩阵,它不会改变向量的模长,因此通常来说它不会改变原模型的稳定性

由于\boldsymbol{R}_m 的稀疏性,所以直接用矩阵乘法来实现会很浪费算力,推荐通过使用下述方式来实现RoPE:

\begin{equation}\begin{pmatrix}q_0 \\ q_1 \\ q_2 \\ q_3 \\ \vdots \\ q_{d-2} \\ q_{d-1} \end{pmatrix}\otimes\begin{pmatrix}\cos m\theta_0 \\ \cos m\theta_0 \\ \cos m\theta_1 \\ \cos m\theta_1 \\ \vdots \\ \cos m\theta_{d/2-1} \\ \cos m\theta_{d/2-1} \end{pmatrix} + \begin{pmatrix}-q_1 \\ q_0 \\ -q_3 \\ q_2 \\ \vdots \\ -q_{d-1} \\ q_{d-2} \end{pmatrix}\otimes\begin{pmatrix}\sin m\theta_0 \\ \sin m\theta_0 \\ \sin m\theta_1 \\ \sin m\theta_1 \\ \vdots \\ \sin m\theta_{d/2-1} \\ \sin m\theta_{d/2-1} \end{pmatrix}\tag{13}\end{equation}

其中\otimes 是逐位对应相乘,即Numpy、Tensorflow、PyTorch等计算框架中的* 运算。从这个实现角度也可以看到,RoPE可以视为是乘性位置编码的变体

远程衰减

可以看到,RoPE形式上和Sinusoidal位置编码有点相似,只不过Sinusoidal位置编码是加性的,而RoPE可以视为乘性的。在\theta_i 的选择上,我们同样沿用了Sinusoidal位置编码的方案,即\theta_i=10000^{−2i/d} ,它可以带来一定的远程衰减性

具体证明如下:将\boldsymbol{q},\boldsymbol{k} 两两分组后,它们加上RoPE后的内积可以用复数乘法表示为

\begin{equation} (\boldsymbol{\mathcal{R}}_m \boldsymbol{q})^{\top}(\boldsymbol{\mathcal{R}}_n \boldsymbol{k}) = \text{Re}\left[\sum_{i=0}^{d/2-1}\boldsymbol{q}_{[2i:2i+1]}\boldsymbol{k}_{[2i:2i+1]}^* e^{\text{i}(m-n)\theta_i}\right]\tag{14}\end{equation}

式(14)主要是由式(12)变形得到

h_i = \boldsymbol{q}_{[2i:2i+1]}\boldsymbol{k}_{[2i:2i+1]}^*, S_j = \sum\limits_{i=0}^{j-1} e^{\text{i}(m-n)\theta_i} ,并约定h_{d/2}=0,S_0=0 ,那么有:

\begin{equation}\sum_{i=0}^{d/2-1}\boldsymbol{q}_{[2i:2i+1]}\boldsymbol{k}_{[2i:2i+1]}^* e^{\text{i}(m-n)\theta_i} = \sum_{i=0}^{d/2-1} h_i (S_{i +1} - S_i) = -\sum_{i=0}^{d/2-1} S_{i+1}(h_{i+1} - h_i)\tag{15}\end{equation}

式(15)的第二个等式主要由Abel分部求和法得到(令d/2=n ): \begin{aligned} \sum_{i=0}^{n-1} h_i (S_{i +1} - S_i)&=-0+h_{n-1}S_n-h_{n-1}S_{n-1}+h_{n-2}S_{n-1}-h_{n-2}S_{n-2}\cdots +h_0S_1-h_0S_0\\ &=-h_{n}S_n+h_{n-1}S_n+\cdots +h_0S_1-h_0S_0\\ &=\sum_{i=0}^{n-1}S_{i+1}(h_i-h_{i+1})\\ &=-\sum_{i=0}^{n-1}S_{i+1}(h_{i+1}-h_i) \end{aligned}

所以

\begin{equation}\begin{aligned} \left|\sum_{i=0}^{d/2-1}\boldsymbol{q}_{[2i:2i+1]}\boldsymbol{k}_{[2i:2i+1]}^* e^{\text{i}(m-n)\theta_i}\right| =&\, \left|\sum_{i=0}^{d/2-1} S_{i+1}(h_{i+1} - h_i)\right| \\ \leq&\, \sum_{i=0}^{d/2-1} |S_{i+1}| |h_{i+1} - h_i| \\ \leq&\, \left(\max_i |h_{i+1} - h_i|\right)\sum_{i=0}^{d/2-1} |S_{i+1}| \end{aligned}\tag{16}\end{equation}

因此我们可以考察\frac{1}{d/2}\sum\limits_{i=1}^{d/2} |S_i| 随着相对距离变化的情况作为衰减性的体现,Mathematica代码如下

d = 128;
\[Theta][t_] = 10000^(-2*t/d);
f[m_] = Sum[
    Norm[Sum[Exp[I*m*\[Theta][i]], {i, 0, j}]], {j, 0, d/2 - 1}]/(d/2);
Plot[f[m], {m, 0, 256}, AxesLabel -> {相对距离, 相对大小}]

结果如下图:

从途中我们可以看到,随着相对距离的变大,内积结果有衰减趋势的出现。因此,选择\theta_i=10000^{-2i/d} ,确实能带来一定的远程衰减性。当然,同上一篇文章说的一样,能带来远程衰减性的不止这个选择,几乎任意的光滑单调函数都可以,这里只是沿用了已有的选择而已。苏剑林大佬还试过以\theta_i=10000^{-2i/d} 为初始化,将\theta_i 视为可训练参数,然后训练一段时间后发现\theta_i 并没有显著更新,因此干脆就直接固定\theta_i=10000^{-2i/d}

线性场景

最后,我们指出,RoPE是目前唯一一种可以用于线性Attention的相对位置编码。这是因为其他的相对位置编码,都是直接基于Attention矩阵进行操作的,但是线性Attention并没有事先算出Attention矩阵,因此也就不存在操作Attention矩阵的做法,所以其他的方案无法应用到线性Attention中。而对于RoPE来说,它是用绝对位置编码的方式来实现相关位置编码,不需要操作Attention矩阵,因此有了应用到线性Attention的可能性

关于线性Attention的介绍,这里不再重复,有需要的读者请参考《去掉 Attention 的 Softmax,复杂度降为 O (n)》。线性Attention的常见形式是:

\begin{equation}Attention(\boldsymbol{Q},\boldsymbol{K},\boldsymbol{V})_i = \frac{\sum\limits_{j=1}^n \text{sim}(\boldsymbol{q}_i, \boldsymbol{k}_j)\boldsymbol{v}_j}{\sum\limits_{j=1}^n \text{sim}(\boldsymbol{q}_i, \boldsymbol{k}_j)} = \frac{\sum\limits_{j=1}^n \phi(\boldsymbol{q}_i)^{\top} \varphi(\boldsymbol{k}_j)\boldsymbol{v}_j}{\sum\limits_{j=1}^n \phi(\boldsymbol{q}_i)^{\top} \varphi(\boldsymbol{k}_j)}\tag{17}\end{equation}

其中\phi,\varphi 是值域非负的激活函数。可以看到,线性Attention也是基于内积的,所以很自然的想法是将RoPE插入到内积中:

\begin{equation}\frac{\sum\limits_{j=1}^n [\boldsymbol{\mathcal{R}}_i\phi(\boldsymbol{q}_i)]^{\top} [\boldsymbol{\mathcal{R}}_j\varphi(\boldsymbol{k}_j)]\boldsymbol{v}_j}{\sum\limits_{j=1}^n [\boldsymbol{\mathcal{R}}_i\phi(\boldsymbol{q}_i)]^{\top} [\boldsymbol{\mathcal{R}}_j\varphi(\boldsymbol{k}_j)]}\tag{18}\end{equation}

但这样存在的问题是,[\boldsymbol{\mathcal{R}}_i\phi(\boldsymbol{q}_i)]^{\top} [\boldsymbol{\mathcal{R}}_j\varphi(\boldsymbol{k}_j)] 可能为负数,因此它不再是常规的概率注意力,而且分母有0的风险,可能会带来优化上的不稳定,考虑到\boldsymbol{R}_i,\boldsymbol{R}_j 都是正交矩阵,它不改变向量的模长,因此我们可以抛弃常规的概率归一化要求,使用如下运算作为一种新的线性Attention:

\begin{equation}\frac{\sum\limits_{j=1}^n [\boldsymbol{\mathcal{R}}_i\phi(\boldsymbol{q}_i)]^{\top} [\boldsymbol{\mathcal{R}}_j\varphi(\boldsymbol{k}_j)]\boldsymbol{v}_j}{\sum\limits_{j=1}^n \phi(\boldsymbol{q}_i)^{\top} \varphi(\boldsymbol{k}_j)}\tag{19}\end{equation}

也就是说,RoPE只插入分子中,而分母则不改变,这样的注意力不再是基于概率的(注意力矩阵不再满足归一性),但它某种意义上来说也是一个归一化方案,而且也没有证据表明非概率式的注意力就不好(比如Nyströmformer也算是没有严格依据概率分布的方式构筑注意力),所以我们将它作为候选方案之一进行实验,而我们初步的实验结果显示这样的线性Attention也是有效的

此外,苏剑林大佬在《去掉 Attention 的 Softmax,复杂度降为 O (n)》中还提出过另外一种线性Attention方案:

\text{sim}(\boldsymbol{q}_i, \boldsymbol{k}_j) = 1 + \left( \frac{\boldsymbol{q}_i}{\Vert \boldsymbol{q}_i\Vert}\right)^{\top}\left(\frac{\boldsymbol{k}_j}{\Vert \boldsymbol{k}_j\Vert}\right)\tag{20}

它不依赖于值域的非负性,而RoPE也不改变模长,因此RoPE可以直接应用于此类线性Attention,并且不改变它的概率意义

模型开源

关于模型开源部分请查看文章开头部分的Rotary Transformer(RoFormer)

Reference
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基本思路
  • 求解过程
  • 编码形式
  • 远程衰减
  • 线性场景
  • 模型开源
  • Reference
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档