RoPE / RoFormer: Enhanced Transformer with Rotary Position Embedding


RoPE / RoFormer: Enhanced Transformer with Rotary Position Embedding

本文是论文 RoFormer: Enhanced Transformer with Rotary Position Embedding 的阅读笔记和个人理解.

Recommended

与往常不同, 在本文开头先给出推荐.

首先苏神博客看RoPE整个系列的文章(RoPE的论文就是出自这些博客的集成):

本文中穿插的内容也有少量由苏神博客中延伸.

如果想看比较简单一点的, 强烈推荐直接看抱抱脸推出的Blog设计位置编码, 从一个比较简单易懂的角度解释了RoPE的由来.

代码方面, 也推荐看看LLaMA对RoPE的实现:

如果希望看形象一点的, 有图描述的, 推荐看:

本文是对RoPE论文的记录.

Background and Related Work

位置编码的主要作用是为了保证同样的Token输入到模型中是可以区分的, 从而可以编码它们的位置关系. 一个显然的例子, “我吃饭”和”饭吃我”明显因主宾语的位置不同而具有不同的含义.

熟悉的Position Embedding的本小节可以跳过.

Preliminary

对于长度为N 的句子SN , 将其中所有Token组成的Embedding序列EN, xiRdEN 中第i 个位置上的d 维Embedding.

当Transformer中的Self - Attention在忽略位置信息的情况下, 其Attention Score的计算方式如下:

qm=fq(xm,m)kn=fk(xn,n)vn=fv(xn,n)

其中qm, kn,vn 分别为第m,n 位置通过fq,fk,fv 获得的Query, Key, Value.

接着计算Scaled Dot-Product Attention:

am,n=exp(qmknd)j=1Nexp(qmkjd)om=n=1Nam,nvn

am,nm,n Token之间的Attention Score, om为第m 个Token的计算完Self - Attention后的表示.

Absolute Position Embedding

最经典的ft:t{q,k,v}() 的方法是直接将Embedding xi 与位置信息pi 直接相加, 再通过一个线性投影Wt:t{q,k,v} 直接得到:

ft:t{q,k,v}(xi,i):=Wt:t{q,k,v}(xi+pi)

而在Transformer的原论文中, 作者通过正余弦函数来生成pi:

{pi,2t=sin(k/100002t/d) pi,2t+1=cos(k/100002t/d)

pi,2t,pi,2t+1 分别为piRd 的奇数维和偶数维.

当然, 在BERT, ViT等论文中也有直接使用Learnable的绝对位置编码, 直接将绝对位置设定为一个可学习的参数让网络自己学.

Relative Position Embedding

由于绝对位置编码不能编码两个Token之间的相对位置关系, 一些工作中也通过相对位置的建模, 将相对位置信息作为位置编码:

fq(xm):=Wqxmfk(xn,n):=Wk(xn+p~rk)fv(xn,n):=Wv(xn+p~rv)

p~rk,p~rvRd 为可学习的相对位置编码.

其中, rm,n 之间的相对位置, 用r=clip(mn,rmin,rmax) 得到. 这假设了超出一定距离限制的位置信息是不太重要的. 此时直接采用最远距离的相对位置编码即可.

一些工作(TransformerXL / XLNet)直接沿用这个形式将它们按项拆分:

qmkn=xmWqWkxn+xmWqWkpn+pmWqWkxn+pmWqWkpn

进一步的, 由于投影矩阵 Wk 有时候会对Content-based Key xn 做投影, 有时候会对Position-based Key pn 做投影, 这显然不合理对吧? 所以可以额外加一个矩阵W~k 让它来编码pn:

qmkn=xmWqWkxn+xmWqW~kp~mn+uWqWkxn+vWqW~kp~mn

这玩意看起来太麻烦了, 我们要的其实不就是一项位置信息和一项内容信息吗? 于是一些工作(T5)直接将位置信息内容信息解耦, 直接将相对位置变为一个Learnable bias term bi,j:

qmkn=xmWqWkxn+bi,j

用两个Projection进一步分别编码pm,pn, 即相对位置, 似乎是更合理的:

qmkn=xmWqWkxn+pmUqUkpn+bi,j

也有一些工作(DeBERTa)基于绝对位置的形式, 认为简单的将绝对位置pn,pm 替换为相对位置p~mn就可以:

qmkn=xmWqWkxn+xmWqWkp~mn+p~mnWqWkxn

RoPE

用下图可以概括RoPE的核心思想:

为什么要叫Rotary Position Embedding呢? 正如它的名字一样, 它是通过旋转来区分不同位置的. 上图举了一个d=2 时的简单例子, 对于绝对位置m, RoPE将向量在极坐标系中通过旋转能够代表m 的角度来表征它们的位置.

但RoPE是以表征相对位置闻名的, 因为它可以借助一些巧妙的性质, 使得计算Self-Attention的内积时能将相对位置信息注入到其中. 下面就来看看RoPE是怎么做到这一点的.

Formulation

结合前面的分析可知, 想要融入Token之间的相对位置关系, 只需要将qmkn 建模为能注入相对位置mn 的函数g:

fq(xm,m),fk(xn,n)=g(xm,xn,mn)

所以目标就是找到满足g 性质的fq(xm,m),fk(xn,n).

Rotary Position Embedding

Derivation of RoPE under 2D

在本节中先讨论简单的二维情况.

SDPA(Scaled Dot-Product Attention)是两向量的内积.

如果实数运算规则不好找到函数g, 有没有其他的运算规则能帮助我们求解? 比如思考实数内积复数内积有什么关系吗? 刚刚好, 两向量的内积等于一个复数与另一个复数的共轭的乘积的实部.

例如, 对于任意两个实数向量a=(a1,a2),b=(b1,b2), 它们的内积定义为:

ab=a1b1+a2b2

当我们将a,b 看成复数时, 有复数za=a1+a2i, 其共轭为za=a1a2i, 同理对于复数zb=b1+b2i 有共轭zb=b1b2i. 什么叫”求一个复数与另一个复数的共轭的乘积的实部”? 计算za,zb 之间的内积:

zazb=(a1+a2i)(b1b2i)=a1b1+a1(b2i)+a2ib1+a2i(b2i)=a1b1+a2b2+i(a2b1a1b2)

实部a1b1+a2b2 恰好就是a,b 在实数域内积的值.

好, 有了上面的性质, 下面开始今天的正题. 先往上小节说的Formulation上靠拢呗.

如果想要表征绝对位置信息, 需要使得qm,kn 仅依赖于它们的绝对位置m,n:

qm=fq(xq,m)kn=fk(xk,n)

利用实数内积与复数内积的关联, 我们假设有利用复数运算的函数g 能够在二者做内积的时候编码它们的相对位置关系, 使得其内积依赖于相对位置mn, 以此在内积上表征二者的相对位置信息:

qmkn=fq(xm,m),fk(xn,n)=g(xm,xn,nm)

同时, 这种编码方式还应该保证在初始状态下不编码位置信息:

q=fq(xq,0)k=fk(xk,0)

首先, 用复数的指数形式(都学过极坐标系中表示复数吧), 将fq(xm,m),fk(xn,n) 表征为:

fq(xq,m)=Rq(xq,m)eiΘq(xq,m)fk(xk,n)=Rk(xk,n)eiΘk(xk,n)g(xq,xk,nm)=Rg(xq,xk,nm)eiΘg(xq,xk,nm)

其中, Rf,Rg,Θf,Θg 分别为f{q,k}g 的幅度(模)和角度. f 的意思是f{q,k}, 代表q,k.

不难发现, 代入到qm,kn 中, 当二者做内积时, 得到幅度R 和角度Θ 之间的关系:

Rq(xq,m)Rk(xk,n)=Rg(xq,xk,nm)Θk(xk,n)Θq(xq,m)=Θg(xq,xk,nm)

此时, 它在初始条件(看成是不表征位置信息)的情况下, 应满足:

q=qeiθq=Rq(xq,0)eiΘq(xq,0)k=keiθk=Rk(xk,0)eiΘk(xk,0)

其中, q,kθq,θk 分别为q,k 在二维平面上的幅值(模)和角度.

接着将相同的位置m=n 带入到幅度R 和角度Θ 的关系式中, 分别得到:

Rq(xq,m)Rk(xk,m)=Rg(xq,xk,0)=Rq(xq,0)Rk(xk,0)=qkΘk(xk,m)Θq(xq,m)=Θg(xq,xk,0)=Θk(xk,0)Θq(xq,0)=θkθq

此时, 幅值Rf 的一个显然解为:

Rq(xq,m)=Rq(xq,0)=qRk(xk,n)=Rk(xk,0)=kRg(xq,xk,nm)=Rg(xq,xk,0)=qk

它显然不依赖位置信息, 即满足q=fq(xq,0),k=fk(xk,0).

那么角度Θ 的解呢?

当位置相同时, 不应该编码任何位置信息. 令Θf:=Θq=Θk, 根据Θq(xq,m)θq=Θk(xk,m)θk, 此时明显两侧是相同的函数. 由此, 可以推断出Θf(x{q,k},m)θ{q,k} 是与位置m 相关, 与Word Embedding x{q,k} 无关的函数, 可设Θf(x{q,k},m)θ{q,k}=ϕ(m), 得到:

Θf(x{q,k},m)=ϕ(m)+θ{q,k}

n=m+1, 将上式代入到角度关系式当中, 可以得到:

ϕ(m+1)ϕ(m)=Θg(xq,xk,1)+θqθk

上式中右侧的常数项与绝对位置m 是无关的, 所以令上式右端整体为θ, ϕ(m) 就是一个等差数列:

ϕ(m)=mθ+γ

其中γR 为常数(首项), θ 非零, 绝对位置m 在这个式子中也是公差.

通过对幅值Rf 和角度Θf 的求解, 整理一下上面的式子, 可以得到:

fq(xq,m)=qei(θq+mθ+γ)=qei(mθ+γ)fk(xk,n)=kei(θk+nθ+γ)=kei(nθ+γ)

通常q=fq(xm,0),k=fk(xn,0) 是直接由一层投影得到的:

q=fq(xm,0)=Wqxnk=fk(xn,0)=Wkxn

方便起见, 直接设定γ=0, 因此得到最终的RoPE形式:

fq(xm,m)=(Wqxm)eimθfk(xn,n)=(Wkxn)einθ

所以, 我们在二维情况下, 最后找到的函数g 为:

g(xm,xn,mn)=Re[(Wqxm)(Wkxn)ei(mn)θ]

其中Re() 为取复数的实部, (Wkxn)(Wkxn) 的共轭复数, θR 为预设好的非零常数(基波长, 沿用Transformer的原论文, 经常设为10000, 底数的选择可以参考这里).

进一步写出二维情况下fq,k 的表达式:

f{q,k}(xm,m)=(cosmθsinmθsinmθcosmθ)(W{q,k}(11)W{q,k}(12)W{q,k}(21)W{q,k}(22))(xm(1)xm(2))=(cosmθsinmθsinmθcosmθ)({q,k}m(1){q,k}m(2))

它就是{q,k}m 乘了一个旋转矩阵, 对应着空间中的向量旋转操作, 这才是RoPE(Rotary Position Embedding)名字的由来.

General form

更为普遍的, 将上节得到的二维情况扩展到任意偶数维度d. 将RoPE应用于xiRd:

f{q,k}(xm,m)=RΘ,mdW{q,k}xm

非常自然的思路就是将d 维拆成d/2 个的二维子空间, 所以RΘ,md 为:

RΘ,md=(cosmθ1sinmθ10000sinmθ1cosmθ1000000cosmθ2sinmθ20000sinmθ2cosmθ2000000cosmθd/2sinmθd/20000sinmθd/2cosmθd/2)

其中, Θ={θi=100002(i1)/d,i[1,2,,d/2]}. 所以i 越大, θi 越小, 即下标越大的维度旋转速度越慢.

这篇文章提供了一个非常有意思的角度, 不同角速度的维度就像时针分针秒针一样, 通过不同的快慢角速度来组合表征一个位置信息.

将RoPE直接作用于Self-Attention, 可得:

qmkn=(RΘ,mdWqxm)(RΘ,ndWkxn)=xWqRΘ,nmdWkxn

其中, RΘ,nmd=(RΘ,md)RΘ,nd. 由于RΘd 是一个正交矩阵, 所以它在编码位置信息的时候是相对稳定的.

RoPE相较于之前位置编码的最大不同, 在于它是乘性的, 而不是加性的, 因此它在编码的相对位置信息可以天然的融入到Self-Attention的内积中.

Properties of RoPE

RoPE有一些优良的性质.

首先, RoPE具有长程衰减, 和最早版本的Transformer一样, RoPE设定θi=100002i/d, 底数θ 越大长程衰减越慢.

其次, RoPE在Linear Attention当中可以使得Self-Attention被更一般的形式重写.

例如, 常规的SDPA可以写成:

Attention(Q,K,V)m=n=1Nsim(qm,kn)vnn=1Nsim(qm,kn)

Self-Attention中采用的是sim(qm,kn)=exp(qmkn/d), 它具有O(N2) 的复杂度.

Linear Attention的复杂度是比SDPA更低的线性复杂度, 形式如下:

Attention(Q,K,V)m=n=1Nϕ(qm)φ(kn)vnn=1Nϕ(qm)φ(kn)

其中ϕ(),φ() 通常是非负函数, 例如ϕ(x)=φ(x)=elu(x)+1, 或者ϕ(qi)=softmax(qi),φ(kj)=exp(kj).

由于RoPE的存在, 可以使得Hidden State的范数不变, 因此可以将RoPE直接乘, 从而无缝集成到Linear Attention中, 从而不增加Linear Attention的复杂度:

Attention(Q,K,V)m=n=1N(RΘ,mdϕ(qm))(RΘ,ndφ(kn))vnn=1Nϕ(qm)φ(kn)

Theoretical Explanation

Computational efficient realization of rotary matrix multiplication

由于RΘ,md 是一个稀疏矩阵, 所以它的计算效率很低. 下式可以化简计算:

RΘ,mdx=(x1x2x3x4xd1xd)(cosmθ1cosmθ1cosmθ2cosmθ2cosmθd/2cosmθd/2)+(x2x1x4x3xdxd1)(sinmθ1sinmθ1sinmθ2sinmθ2sinmθd/2sinmθd/2)

其中 为逐元素点乘.

Long-term decay of RoPE

在RoPE的作用下, 将向量q=Wqxm,k=Wkxn 两维两维的分组成对, 其内积可以写成:

(RΘ,mdWqxm)(RΘ,ndWkxn)=Re[i=0d/21q[2i:2i+1]k[2i:2i+1]ei(mn)θi]

其中q[2i:2i+1] 代表q 中的第2i 到第2i+1 个元素, k 同理.

hi=q[2i:2i+1]k[2i:2i+1],Sj=i=0j1ei(mn)θi, 同时设hd/2=0,S0=0, 由Abel变换可以得到:

i=0d/21q[2i:2i+1]k[2i:2i+1]ei(mn)θi=i=0d/21hi(Si+1Si)=i=0d/21Si+1(hi+1hi)

因此有:

|i=0d/21q[2i:2i+1]k[2i:2i+1]ei(mn)θi|=|i=0d/21Si+1(hi+1hi)|i=0d/21|Si+1||(hi+1hi)|(maxi|hi+1hi|)i=0d/21|Si+1|

即当相对位置mn 增大时, 在θi=100002i/d的设定下, 1d/2i=1d/2|Si| 的值是逐渐减小的, 如下图所示:

Experiments and Evaluations

详细的实验参数设置和模型参数设置请参考原论文.

Machine Translation

作者将RoFormer与Vallina Transformer在WMT 2014 English-German(450w平行语料)上对比:

RoFormer略高于Vallina Transformer.

Pre-training Language Modeling

接着, 在BookCorpus和Wikipedia这两个常用的语料上做预训练, 与BERT做对比, 结果如下:

RoFormer明显的比BERT要收敛更快一些, 而且从曲线上来看它的训练看起来更加稳定.

Fine-tuning on GLUE tasks

在GLUE上做Finetune, 继续与BERT对比:

RoFormer在MRPC, STS-B, QQP上有显著优势, 它们都是偏语义类的任务, 在SST-2和QNLI, MNLI中表现弱于BERT.

Performer with RoPE

上文中提到了RoPE在Linear Attention中的优势, 因此测试与使用Linear Attention的Performer做个结合:

RoPE能够在维持原复杂度不变的条件下加速收敛.

Evaluation on Chinese Data

除了在英文数据上进行评估, 还要在中文数据上进行评估.

在本实验中, 作者将自己提出的WoBERT的绝对位置编码替换为RoPE:

并在34G的语料上进行不同参数的多阶段训练, 以适应不同的输入长度:

随着序列长度的增加, RoFormer总是能取得更好的性能, 说明RoFormer在长度外推设置下表现较好.

CAIL2019-SCM(一个语义相似任务)上来测试RoFormer的长文本能力, 表现如下:

  • 当RoFormer输入长为512时, 能够略优于BERT和WoBERT.
  • 当RoFormer的最大输入长度扩展到1024的时候, 显著优于BERT和WoBERT.

此外, 还能观察到在中文场景下, 词建模的WoBERT要优于字建模的BERT. 我以前也有类似的观点, 更大的优势是词建模如果用到生成类任务中能带来更快的推理速度.

Summary

与其说RoPE简洁旦优雅, 不如说RoPE简洁甚至优雅. RoPE用绝对位置编码实现了相对位置编码, 并且能够丝滑无缝的融入到Self-Attention当中.

由于我硕士期间是做信息抽取的, 所以我印象中RoPE最早在信息抽取里面运用的非常广泛, 其中可能原因有两个:

  • 其一是因为相对位置对信息抽取的Span抽取影响比较大, 因为每个Span的都是通过起止边界位置确定的, 在Universal Information发展后期, 基本都是要带上RoPE.
  • 另外可能是因为信息抽取抽取Span的大多都是通过一个乘积计算得到得分, 与内积形式一致, 这与RoPE给Self-Attention设计的形式恰恰好是一致的, 所以RoPE表现好也不奇怪.

RoPE早期在其他领域似乎没有得到特别多的关注. 但是随着PaLM, LLaMA等LLM采用了RoPE, RoPE便渐渐的在LLM里面成为一项标准的配置, 所以RoPE甚至也被人誉为LLM时代的ResNet.

在更长的上下文场景下, RoPE的续作是ReRoPE, 超过了NTK-RoPE, 感兴趣的可以继续深入.

虽然论文本身不是苏神自己写的, 但最后在文末也不得不感叹, 苏神真强啊.


文章作者: DaNing
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 DaNing !
评论
0 comments here
 上一篇
DDIM: Denoising Diffusion Implicit Models DDIM: Denoising Diffusion Implicit Models
本文前置知识: DDPM: DDPM: Denoising Diffusion Probabilistic Model. Denoising Diffusion Implicit Models 论文: Denoising Diffu
2025-03-21
下一篇 
CLAP: Large-scale Contrastive Language-Audio Pretraining with Feature Fusion and Keyword-to-Caption Augmentation CLAP: Large-scale Contrastive Language-Audio Pretraining with Feature Fusion and Keyword-to-Caption Augmentation
Large-scale Contrastive Language-Audio Pretraining with Feature Fusion and Keyword-to-Caption Augmentation本文是论文Large-Sca
2025-02-07