一句话定义
RoPE 不把位置向量加到词向量上,而是按位置角度旋转 Query 和 Key 的每一对维度,使注意力分数自然带上相对位置信息。
为什么需要它
注意力本身是排列无关的:打乱 token 顺序,计算结果不变。模型必须额外知道谁在前谁在后。早期做法是绝对位置编码,把位置向量直接加到 Embedding 上;RoPE 则把位置编码进内积,让「相对距离」成为注意力打分的一部分。
关键机制
- 把 Q/K 的维度两两分组,每组看成一个二维向量。
- 按位置乘以不同频率的旋转角,位置越靠后,旋转越大。
- 两个位置的内积只取决于它们的相对差值,因此天然表达相对位置。
- 不同维度使用不同频率,低维变化慢、高维变化快,形成多尺度位置感知。
- 旋转不改变向量长度,只改变方向,所以点积仍能反映相似度。
- 这也是 RoPE 能直接用在标准注意力里的原因,不需要改模型结构。
长上下文与外推
模型训练时的上下文长度有限,直接外推到更长序列会出现位置分布偏移。常见补救方式包括位置插值、调整旋转频率底数(如 NTK 缩放)以及 YaRN 一类方法。它们的目标都是让模型在更长距离上仍然保持可区分的位置信号;频率底数决定长距离的分辨率。
用在哪里
- 所有使用 RoPE 的 Transformer;理解长上下文外推、位置插值的前提。
- 需要扩展上下文长度时,调整频率/插值,而不是只改配置里的最大长度。
常见误区
- RoPE 不是加在输入 Embedding 上的,而是作用在注意力的 Q/K 上。
- 标称上下文变长,不代表模型真的能同等有效地利用每个位置。
- 位置编码只解决「顺序」,不解决「该关注谁」。
相关概念
- Attention:RoPE 作用的位置。
- 上下文窗口:位置外推要服务的上限。
- Transformer:使用 RoPE 的主流架构。