Skip to content

RoPE (Rotary Position Embedding) 是 llama.cpp 支持的位置编码方案,通过旋转矩阵将位置信息注入 Q 和 K 向量。

为什么需要 rope

Transformer 本身没有位置感知能力,需要位置编码来区分不同位置的 token。RoPE 通过在注意力计算中自然地引入相对位置信息,效果优于绝对位置编码。

核心原理

RoPE 将 Q 和 K 的相邻维度组成二维子空间,施加旋转:

对于位置 pos 和维度对 (2i, 2i+1):
θ_i = pos / 10000^(2i/d)

RoPE(x_{2i}, x_{2i+1}, pos) = [
    x_{2i}   × cos(θ_i) - x_{2i+1} × sin(θ_i),
    x_{2i}   × sin(θ_i) + x_{2i+1} × cos(θ_i)
]

关键性质:<RoPE(Q,m), RoPE(K,n)> 只依赖于 Q, K 和相对位置 m-n

变体:

  • LLaMA RoPE — 标准实现
  • RoPE Neox — 调整频率基准 (base)
  • mRoPE — 多维 RoPE(多模态模型)
  • LongRoPE — 支持更长上下文的外推

在源码中的实现

  • ggml/src/ggml.cggml_rope 操作实现
  • ggml/src/ggml-cpu/ — CPU RoPE kernel
  • ggml/src/ggml-cuda/rope.cu — CUDA RoPE kernel
  • src/llama-model.cpp — forward pass 中调用 RoPE

相关概念

  • ggml — RoPE 作为 GGML 操作实现
  • compute-graph — RoPE 在计算图中的位置
  • kv-cache — RoPE 位置与 KV Cache 的关系