Skip to content

Rotary Position Embedding,旋转位置编码 —— 通过旋转向量编码位置信息,使注意力自然感知 token 的相对距离。

为什么需要位置编码

注意力分数只看向量内容,不知道 token 顺序。"我爱猫"和"猫爱我"的 Q/K 值一样,但含义完全不同。如果不注入位置信息,模型无法区分词序。

核心原理

RoPE 将 Q/K 向量按维度拆成若干对,每对做二维旋转:

位置 0: 向量旋转 0°
位置 1: 向量旋转 θ°
位置 2: 向量旋转 2θ°
位置 n: 向量旋转 nθ°
高频分量(前面维度对,θ 大): 精确区分相邻位置 —— "放大镜"
低频分量(后面维度对,θ 小): 感知远距离关系 —— "广角镜"

关键性质:点积只依赖相对距离。不管绝对位置在哪,距离相同的 token 对有相同的旋转差:

Q_m · K_n = f(m - n)

这意味着注意力天然编码相对位置,不需要额外的位置参数。

在 ds4.c 中的实现

c
// RoPE 核心旋转(ds4.c 约 4574 行)
for (uint32_t i = 0; i < n_rot; i += 2) {
    const float c = cosf(theta) * mscale;
    const float s = sin_sign * sinf(theta) * mscale;
    const float x0 = tail[i + 0];
    const float x1 = tail[i + 1];
    tail[i + 0] = x0 * c - x1 * s;    // 二维旋转公式
    tail[i + 1] = x0 * s + x1 * c;
    theta_extrap *= theta_scale;        // θ 递减,产生不同频率
}

YaRN 长上下文扩展:当位置超过训练长度(65536)时,低频分量切换到内插(缩放角度),高频分量保持外推。DS4_ROPE_SCALE_FACTOR = 16.0 将上下文从 64K 扩展到 100 万 token。

相关概念

  • kv-cache — K 在进入缓存前需先经 RoPE 旋转
  • softmax — 旋转后的 Q·K 点积经 softmax 归一化为注意力权重
  • moe — 注意力(含 RoPE)和 MoE 在每层中串联

详见 Part 4 — RoPE 与推理循环LLM 核心架构概念 的 RoPE 章节。