Appearance
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.c—ggml_rope操作实现ggml/src/ggml-cpu/— CPU RoPE kernelggml/src/ggml-cuda/rope.cu— CUDA RoPE kernelsrc/llama-model.cpp— forward pass 中调用 RoPE
相关概念
- ggml — RoPE 作为 GGML 操作实现
- compute-graph — RoPE 在计算图中的位置
- kv-cache — RoPE 位置与 KV Cache 的关系