· liyu · ai · 9 min read
大模型位置编码核心解析:从绝对位置编码到 RoPE 旋转位置编码
一文搞懂 Transformer 位置编码的本质:为什么需要位置编码?从 APE 的加法注入到 RoPE 的复数旋转几何证明,再到长上下文扩展(PI、NTK、YaRN、Base 缩放)演进全貌。
“我打你”与“你打我”词汇完全相同,但语序决定了语义。
Transformer 的自注意力机制具有天然的置换不变性(Permutation Invariance):如果不显式注入位置信息,打乱输入句子的所有词序,模型计算出的注意力分数完全一样。
位置编码(Positional Encoding) 就是赋予 Token “空间坐标与顺序感知”的核心模块。
一、 绝对位置编码(APE):加法注入
在早期模型(如 BERT、GPT-2、原始 Transformer)中,采用的是最直接的绝对位置编码(Absolute Positional Embedding, APE)。
1. 核心机制
为每个绝对位置分配一个固定或可学习的位置向量,直接与词向量相加:
输入向量: [ x₀ ] [ x₁ ] [ x₂ ] ... [ xₛ ]
+ + + +
位置向量: [ p₀ ] [ p₁ ] [ p₂ ] ... [ pₛ ]
│ │ │ │
▼ ▼ ▼ ▼
合成向量: [ x₀+p₀] [ x₁+p₁] [ x₂+p₂] ... [ xₛ+pₛ]2. APE 的致命短板
- 缺乏显式相对位置感知:语言理解关注的是“两词相距多远”,而不是“词在整段文字的第几千位”。加法注入要求模型花费大量参数隐式拟合相对距离。
- 无法长度外推:若预训练长度为 2048,当输入出现第 2049 个 Token 时,模型完全没有对应的坐标向量,推理立即崩溃。
二、 旋转位置编码(RoPE):乘法旋转
为了解决 APE 的缺陷,苏剑林等人在 2021 年提出了 RoPE(Rotary Position Embedding),现已成为 LLaMA、Mistral、Qwen、DeepSeek 等主流开源大模型的标配。
1. 核心思想(灵魂)
在前向计算时,按各 Token 的绝对位置分别施加正交旋转;但在两两做注意力点积时,绝对位置自动抵消,天然只剩下相对位置差!
⟨ f(q, m), f(k, n) ⟩ = g(q, k, m - n)2. 二维复数旋转与几何直观
在二维平面上,向量可表示为复数 q = |q| eⁱᵠ。对其赋予位置 m,只需乘以旋转因子 eⁱᵐᶿ(相当于逆时针旋转 m·θ 角度):
q_rotated = q × eⁱᵐᶿ = |q| e^(i·(φ_q + m·θ))
k_rotated = k × eⁱⁿᶿ = |k| e^(i·(φ_k + n·θ))当 Query 与 Key 计算点积(内积)时,惊艳的数学抵消出现了:
点积 ⟨ qₘ, kₙ ⟩ = Re( (q eⁱᵐᶿ)* × (k eⁱⁿᶿ) )
= |q| · |k| · cos( (φ_k - φ_q) + (n - m)·θ ) y ▲
│ q (旋转了 m·θ)
│ /
│ /
│ / ) 相对夹角 Δθ = (n - m)·θ
│ / /
│ / / k (旋转了 n·θ)
│ / / /
└──┴─┴───┴───────► x
原点 ORoPE 的两大核心数学性质:
- 模长守恒:正交旋转只改变向量方向,完全不改变向量的模长(
|qₘ| = |q|),不破坏语义特征的能量。 - 相对位置内生:注意力打分只取决于向量原始夹角与相对距离
(n - m),天然感知语序距离。
3. 高维向量扩展与极简实现
大模型单头特征维度 d(如 64 或 128)为偶数,RoPE 将其拆分为 d / 2 个二维平面,每个平面分配不同旋转频率(θᵢ = 10000⁻²ⁱᐟᵈ,其中平面索引 i ∈ [0, d/2 - 1]):
import torch
def apply_rotary_pos_emb(x: torch.Tensor, cos: torch.Tensor, sin: torch.Tensor) -> torch.Tensor:
"""
x: [Batch, Head, Seq_Len, Dim]
cos, sin: [1, 1, Seq_Len, Dim]
"""
# 将特征两两配对切分: [-x2, x1, -x4, x3, ...]
def rotate_half(x):
x1 = x[..., : x.shape[-1] // 2]
x2 = x[..., x.shape[-1] // 2 :]
return torch.cat((-x2, x1), dim=-1)
# 核心向量化公式
return (x * cos) + (rotate_half(x) * sin)三、 APE vs RoPE 极简对比
| 对比维度 | 绝对位置编码 (APE) | 旋转位置编码 (RoPE) |
|---|---|---|
| 注入阶段 | 最底层 Embedding 层 | Attention 内部计算 Q, K 时 |
| 计算方式 | 加法相加 (x + p) | 乘法正交旋转 (Rₘ × q) |
| 相对位置感知 | 弱(依靠模型隐式学习) | 极强(数学内生 n - m 相对差) |
| 模长影响 | 破坏原有词向量范数 | 保持模长完全不变 |
| 长文本扩展 | 极差(超出训练长度即失效) | 极佳(支持内插与基频外推扩展) |
| 代表模型 | BERT, GPT-2 | LLaMA 1/2/3, Mistral, Qwen, DeepSeek |
四、 RoPE 长上下文扩展技术演进
当推理长度大幅超出预训练长度(如 4K ➔ 32K/128K)时,旋转角度超出训练分布会导致注意力紊乱。业界在推理期扩展与预训练底频调整两个维度上发展出了丰富的技术方案:
┌───────────────────────── 常见长上下文扩展技术方案 ─────────────────────────┐
│ │
│ 1. 推理期 / 微调扩展 (Post-training & Extrapolation) │
│ ├── 位置内插 (PI, 2023) ────────► 简单线性压缩,全频无差别缩放 │
│ ├── NTK-Aware RoPE (2023) ──────► 依据高低频特性非线性缩放 (免微调/微调) │
│ └── YaRN (2023) ────────────────► 分频三段论 + 注意力温度补偿 (进阶方案) │
│ │
│ 2. 预训练 / 增量训练直接适配 (Pre-training Strategy) │
│ └── Base 底频暴力增大 ──────────► LLaMA 3/3.1 (500,000)、Qwen2 (1,000,000)│
│ │
└────────────────────────────────────────────────────────────────────────────┘- 位置内插(PI, Position Interpolation):
- 核心思想:通过将坐标
m线性压缩为m / s(如扩展 4 倍则s = 4),将长序列位置强行映射回预训练区间。 - 优缺点:只需少量步数微调即可迅速收敛,但由于高频分辨率被无差别压缩,会轻微损伤局部精细语义的表达。
- 核心思想:通过将坐标
- NTK-Aware RoPE(非线性缩放):
- 核心思想:借鉴神经正切核(NTK)特性,高频保局部精细度(尽量不压缩),低频扩全局视野(充分压缩)。
- 优缺点:在 2~4 倍适度扩展场景下具备优秀的**免微调(Training-Free)**直接外推能力;但在极大扩展倍数或复杂长程任务中,未经针对性微调仍存在性能衰减。
- YaRN(Yet another RoPE extensioN):
- 核心思想:在 NTK 思想的基础上进一步精细化——将频率划分为“高频不插值”、“中频平滑过渡”、“低频完全插值”三段区间,并引入注意力温度修正因子(Attention Scale)。
- 优缺点:在更少的数据微调下即可实现 8x~32x 以上的高质量上下文扩展,是长文本微调的主流方案之一。
- Base 频率直接放大(现代预训练标配):
- 核心思想:在预训练或继续预训练阶段,直接将底频参数
rope_theta(即基数base)大幅提升(如 LLaMA 3 / 3.1 设为 500,000,Qwen2 设为 1,000,000)。 - 优缺点:使最低频维度的周期直接覆盖数百万 Token,模型原生具备 128K 超长窗口能力,无需复杂的推理期动态计算。
- 核心思想:在预训练或继续预训练阶段,直接将底频参数
五、 3 句话总结
- 为什么需要:自注意力具有置换不变性,必须引入位置编码打破词袋对称性。
- RoPE 的本质:给 Q 和 K 乘以绝对位置旋转矩阵,做点积时绝对坐标抵消,天然内生相对位置差且模长守恒。
- 长上下文扩展:推理与微调侧通过分频内插(NTK / YaRN)适配长序列,预训练侧通过增大 Base 底频原生支持 128K+ 上下文。