Appearance
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。
相关概念
详见 Part 4 — RoPE 与推理循环 和 LLM 核心架构概念 的 RoPE 章节。