模型架构 进阶

RoPE

别名:旋转位置编码 / Rotary Position Embedding

用旋转矩阵把位置写进注意力的 Query/Key,让模型感知相对距离。

更新于 2026/11/08
位置编码Attention长上下文

一句话定义

RoPE 不把位置向量加到词向量上,而是按位置角度旋转 Query 和 Key 的每一对维度,使注意力分数自然带上相对位置信息。

为什么需要它

注意力本身是排列无关的:打乱 token 顺序,计算结果不变。模型必须额外知道谁在前谁在后。早期做法是绝对位置编码,把位置向量直接加到 Embedding 上;RoPE 则把位置编码进内积,让「相对距离」成为注意力打分的一部分。

关键机制

  • 把 Q/K 的维度两两分组,每组看成一个二维向量。
  • 按位置乘以不同频率的旋转角,位置越靠后,旋转越大。
  • 两个位置的内积只取决于它们的相对差值,因此天然表达相对位置。
  • 不同维度使用不同频率,低维变化慢、高维变化快,形成多尺度位置感知。
  • 旋转不改变向量长度,只改变方向,所以点积仍能反映相似度。
  • 这也是 RoPE 能直接用在标准注意力里的原因,不需要改模型结构。

RoPE:按位置旋转 Q/K,内积只依赖相对位置差

长上下文与外推

模型训练时的上下文长度有限,直接外推到更长序列会出现位置分布偏移。常见补救方式包括位置插值、调整旋转频率底数(如 NTK 缩放)以及 YaRN 一类方法。它们的目标都是让模型在更长距离上仍然保持可区分的位置信号;频率底数决定长距离的分辨率。

用在哪里

  • 所有使用 RoPE 的 Transformer;理解长上下文外推、位置插值的前提。
  • 需要扩展上下文长度时,调整频率/插值,而不是只改配置里的最大长度。

常见误区

  • RoPE 不是加在输入 Embedding 上的,而是作用在注意力的 Q/K 上。
  • 标称上下文变长,不代表模型真的能同等有效地利用每个位置。
  • 位置编码只解决「顺序」,不解决「该关注谁」。

相关概念