RoFormer: Enhanced Transformer with Rotary Position Embedding
Jianlin Su, Yu Lu, Shengfeng Pan, Ahmed Murtadha, Bo Wen, Yunfeng Liu — Neurocomputing 2024 (Zhuiyi Technology)
RoPE(Rotary Position Embedding)是一种把位置编码写进注意力计算本身的方法。它不再把位置向量直接加到 token 表示上,而是让 query 和 key 在不同位置按不同角度旋转;当二者做点积时,绝对位置会自然合成为相对位置。
这篇笔记关注 RoPE 最核心的数学直觉:为什么「旋转」可以保留语义向量的模长,又能让注意力分数只依赖 m−n 这样的相对距离。
研究动机
Transformer 早期常用正余弦绝对位置编码,把位置向量 Pm 直接加到 token 表示 Xm 上,再投影得到 query 和 key:
Q=Wq(Xm+Pm)
K=Wk(Xn+Pn)
为了看清问题,可以先忽略投影矩阵,只观察点积形式:
Score=(Xm+Pm)(Xn+Pn)T=(Xm+Pm)(XnT+PnT)=XmXnT+XmPnT+PmXnT+PmPnT
其中四项含义分别是:
- XmXnT:纯语义相似度。
- PmPnT:纯位置关系。
- XmPnT+PmXnT:语义与位置的交叉项,会把本应分开的信息混在一起。
RoPE 的目标是构造特殊的 fq 和 fk,使得编码位置后的点积结果只依赖 token 表示和相对距离:
⟨fq(xm,m),fk(xn,n)⟩=g(xm,xn,m−n)
也就是说,模型仍然可以使用绝对位置 m,n,但最终注意力分数要以相对位置的形式出现。
核心方法/模型架构
RoPE 的核心做法很简单:不同位置的 token 向量按不同角度旋转。位置越靠后,旋转角度越大;不同维度对使用不同频率,因此可以覆盖不同尺度的位置关系。

形式上,RoPE 先对 query 和 key 做普通线性投影,再把位置 m 或 n 写成旋转矩阵:
fq(xm,m)=RΘ,mdWqxm
fk(xn,n)=RΘ,ndWkxn
关键不是「旋转矩阵」这个名字,而是它满足一个非常有用的性质:两个不同位置的旋转矩阵在点积里相乘后,会合并成只依赖位置差的旋转矩阵。
组件详解
二维旋转:位置变成角度
先从二维向量开始。对二维坐标 (x,y) 旋转角度 θ 后得到:
(x′,y′)=(xcosθ−ysinθ, xsinθ+ycosθ)
矩阵形式为:
[x′y′]=[cosθsinθ−sinθcosθ][xy]

旋转不会改变向量模长,因此语义信息的强度不会因为位置编码而被直接放大或缩小。位置只是变成了方向上的相位差。
相对位置如何从点积里出现
令旋转矩阵为 R(θ)。位置 m 的 query 和位置 n 的 key 分别旋转:
q′=R(mθ)q
k′=R(nθ)k
注意力分数为:
Score=(q′)Tk′=(R(mθ)q)T(R(nθ)k)=qTR(mθ)TR(nθ)k
二维旋转矩阵的转置等于反向旋转。把 R(α) 展开后可以直接看到这一点:
R(α)T=[cosαsinα−sinαcosα]T=[cosα−sinαsinαcosα]=[cos(−α)sin(−α)−sin(−α)cos(−α)]=R(−α)
因此:
Score=qTR(−mθ)R(nθ)k
两个旋转矩阵相乘,角度会相加:
R(−mθ)R(nθ)=R((n−m)θ)
最终得到:
Score=qTR((n−m)θ)k

这就是 RoPE 最关键的地方:query 和 key 各自编码的是绝对位置,但点积之后只剩下相对位置 n−m。
高维扩展:块对角旋转矩阵
真实模型中的注意力头不是二维向量,而是 d 维向量。RoPE 的高维扩展方式是把 d 维空间两两划分为 d/2 个独立二维子空间,每个子空间各自旋转。
例如一个 head 的向量是:
[x0,x1,x2,x3,x4,x5]
RoPE 会拆成三组二维坐标:
- (x0,x1)
- (x2,x3)
- (x4,x5)
然后每一组都使用对应频率做二维旋转。

对应的高维旋转矩阵是块对角矩阵:
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
这里 Θ 是所有频率的集合:
Θ={θi=10000−2(i−1)/d, i∈[1,2,⋯,d/2]}
应用到 self-attention 后:
qmTkn=(RΘ,mdWqxm)T(RΘ,ndWkxn)
由于每个二维块都满足同样的旋转合成性质,整体也可以写成只依赖相对位置的形式:
(Rmxm)T(Rnxn)=xmTRmTRnxn=xmTRn−mxn
为什么要乘 θi
如果只用位置 m 当角度,所有二维维度对都会按同一个频率旋转:
cos(m), sin(m)
这意味着每往后一个 token,所有维度对都转同样大的角度。这样的表达能力不够,因为模型需要同时捕捉不同尺度的位置关系:
- 有些维度适合表示短距离变化,角度变化要更快。
- 有些维度适合表示长距离变化,角度变化要更慢。
因此第 i 个二维子空间会有自己的频率 θi。位置 m 在这一对维度上的总旋转角是:
mθi
对于第 i 个二维子空间,常见写法是从 i=0 开始:
θi=10000−2i/d
等价地写成:
θi=100002i/d1
直观理解是:位置 m 表示走了多少步,θi 表示每一步在该维度对上转多少角度,二者相乘才是总相位。
实验结果
RoFormer 论文在长文本分类等任务上验证了 RoPE 的有效性。相较于直接使用绝对位置编码的 baseline,RoPE 的优势主要体现在三个方面:
| 特性 | 含义 |
|---|
| 相对位置建模 | 点积结果显式依赖 n−m,更贴合注意力中 token-token 关系的需求 |
| 长度外推灵活性 | 位置通过旋转相位进入模型,比固定长度的位置表更容易扩展到更长序列 |
| 与线性注意力兼容 | RoPE 可以在保持线性注意力复杂度的同时引入相对位置编码 |
这篇笔记没有展开论文中的完整 benchmark 表格,因为 RoPE 后来更重要的影响是成为 LLaMA 等大语言模型的基础位置编码方案。理解它的数学形式,比记住某个分类任务上的具体分数更关键。
总结
RoPE 的核心贡献可以压缩成一句话:把位置从「加到向量上的额外特征」变成「作用在 query/key 上的旋转相位」。
这种设计同时满足三件事:
- 旋转保持向量模长,尽量不破坏语义表示本身。
- query 和 key 各自编码绝对位置,但点积后自然合成为相对位置。
- 高维向量按二维子空间分组,不同频率负责不同尺度的位置关系。
因此 RoPE 不是一个孤立的小技巧,而是把位置编码、点积注意力和相对位置建模统一到同一个线性代数结构中。
参考文献