位置编码速通:从 ROPE 到 Yarn
本文详细介绍长文本大模型中从 ROPE 到 Yarn 的位置编码技术。从 Qwen2.5 到 Deepseek V3,Yarn 几乎已经是各家 LLM 做长文本外推的标配组件(相比 Pretrain 微乎其微的资源消耗获得至少 16 倍的长度外推)。然而目前大家对长文本的认知还停留在 ROPE 的时代。本文尝试用一条通用公式,带你以最简洁的方式彻底理解 ROPE 及其演化的变种逻辑,梳理以下长文本外推的方法本质:
- ROPE
- Position Interpolation
- NTK-Aware Interpolation
- Dynamic NTK Interpolation
- NTK-by-parts Interpolation
- Yarn
1. 位置编码的通用公式
无论是 ROPE 还是它的所有变种,本质上都可以被以下公式所统一:
$$\text{Output} = \text{Transform}(x_i, \theta(i))$$
这里:
- $x$ 是输入向量。
- $i$ 是位置索引。
- $\theta$ 是频率参数。
- $f$ 和 $g$ 是可调整函数,分别描述位置和频率的变换逻辑。
在原始 Transformer Self-Attention 中,通用公式中的输出表示将输入向量 $x$ 和位置相关信息($i$ 和 $\theta$)结合后,进行的进一步变换。具体来说:
$$\text{Output} = W_O (x_i + PE(i))$$
这里:
- $x$: 输入向量。
- $PE$: 位置编码,具体由 $f$ 和 $g$ 构成,基于 $i$ 和 $\theta$ 计算。
- $W_O$: 线性投影矩阵,用于变换向量。
因此,$\text{Output}$ 具体对应的是将位置编码 $PE$ 加到输入向量 $x$,再通过投影矩阵 $W_O$ 处理后,输入 self-attention 经典公式前的部分。
这条公式背后隐藏的逻辑是:如何通过适配 $f$ 和 $g$ 来在固定上下文长度的限制下延展语言模型的能力。接下来,我们基于这条公式逐一拆解各个变种。
2. ROPE:一切的起点
在 Transformer 模型中,位置编码是连接输入序列与模型结构的重要桥梁。Rotary Position Embedding (ROPE) 是一种基于旋转变换的相对位置编码方法,它以极其优雅的方式将位置索引转化为模型内部的旋转信息。其核心数学公式如下:
ROPE 的定义可以直接映射到通用公式:
$$\text{RoPE}(x_i, i) = R_{\theta(i)} x_i$$
因此,ROPE 的具体实现为(这里求简只考虑二维情况):
$$\begin{bmatrix} x'_0 \ x'_1 \end{bmatrix} = \begin{bmatrix} \cos(\theta_i) & -\sin(\theta_i) \ \sin(\theta_i) & \cos(\theta_i) \end{bmatrix} \begin{bmatrix} x_0 \ x_1 \end{bmatrix}$$
其中:
- $x$ 是输入向量。
- $i$ 是输入向量的位置索引。
- $\theta$ 是频率参数,定义为 $\theta_m = 10000^{-2m/d}$。
- $R$ 是映射矩阵,将输入向量投影到高维空间。
2.1 复数空间的直观解释
为了更直观地理解这个公式,ROPE 的旋转可以被视为复数域上的变换:
$$z' = z \cdot e^{i\theta_i}$$
其中,$e^{i\theta_i}$ 是复数域中的旋转操作,$W_Q$ 和 $W_K$ 是将输入向量投影到查询(query)和键(key)空间的权重矩阵。
在这种表示方式下,两个位置 $i$ 和 $j$ 的点积形式为:
$$\langle q_i, k_j \rangle = \langle q_0, k_0 \rangle \cos(\theta(j-i)) + \dots$$
注意,点积中与位置 $i$ 和 $j$ 相关的部分仅依赖于它们的相对距离 $j-i$。这意味着,ROPE 天然具有对相对位置的敏感性,无需额外编码绝对位置。
2.2 数学推导中的频率参数
(注意这部分是理解后续各种 ROPE 变体的基础,所以在这里单独列了一个章节来讲述)


