深度解析RoPE位置编码及其变体:从原理到演进

RoPE(Rotary Position Embedding)已经成为现代大模型位置编码的事实标准——从Llama到Qwen,从Mistral到DeepSeek,几乎清一色地选择了RoPE。它到底好在哪?本文从数学原理到工程实现,带你彻底理解RoPE及其重要变体。 一、为什么需要位置编码 Transformer的自注意力机制本身是排列不变的——打乱输入顺序,输出不变。要让模型感知序列中token的位置,就必须注入位置信息。 位置编码经历了三个阶段: 绝对位置编码(Learned/Absolute):每个位置一个可学习向量。问题:无法外推到训练长度之外。 相对位置编码(ALiBi/Relative):编码token间的相对距离。问题:计算复杂度高或表达力受限。 旋转位置编码(RoPE):巧妙地将绝对位置信息以旋转方式融入,但最终效果是相对的。两全其美。 二、RoPE的数学原理 2.1 核心思想 RoPE的核心洞察:通过旋转操作,使得query和key的点积自然地成为它们相对位置的函数。 给定query向量 q 和key向量 k,我们希望找到一种变换 f,使得: <f(q, m), f(k, n)> = g(q, k, m-n) 其中 m, n 是绝对位置,m-n 是相对位置。也就是说,内积的结果只依赖于相对位置。 2.2 二维情形推导 先看最简单的二维情况。将 q = (q₁, q₂) 旋转角度 mθ: f(q, m) = [q₁·cos(mθ) - q₂·sin(mθ), q₁·sin(mθ) + q₂·cos(mθ)] 同理,k 旋转角度 nθ。则它们的内积: <f(q,m), f(k,n)> = (q₁k₁ + q₂k₂)cos((m-n)θ) + (q₁k₂ - q₂k₁)sin((m-n)θ) 可以看到,内积确实只依赖于 (m-n),即相对位置!而且结果中既包含了 q·k 的原始信息(通过cos项),也包含了旋转引入的位置信息(通过sin项)。 2.3 高维推广 将d维向量两两分组,每对应用不同频率的旋转: 对于维度对 (q_{2i}, q_{2i+1}),旋转角度为 m·θ_i 其中 θ_i = base^(-2i/d),base通常取10000 这样不同维度对对应不同的旋转频率,低维度变化快(捕捉局部位置关系),高维度变化慢(捕捉全局位置关系)。 ...

2026-07-13 · 3 min · 450 words · 硅基 AGI 探索者
RoPE旋转位置编码

RoPE旋转位置编码原理与改进

位置编码的困境 Transformer的自注意力机制本身是排列不变的——它不知道"猫追老鼠"和"老鼠追猫"的区别。位置编码是赋予模型位置感知能力的关键组件。 从绝对位置编码(正弦编码、可学习编码)到相对位置编码(T5 Bias、ALiBi),位置编码经历了多代演进。2021年Jianlin Su提出的RoPE(Rotary Position Embedding)巧妙地统一了绝对和相对位置编码,成为2026年主流大模型(LLaMA、Qwen、Mistral等)的标配。 RoPE的核心数学 基本思想 RoPE的核心思想是:通过对Query和Key施加旋转操作,使得它们的内积自然地编码相对位置信息。 给定位置 m 的Query向量 q 和位置 n 的Key向量 k,RoPE希望满足: <ROPE(q, m), ROPE(k, n)> = g(q, k, m-n) 即旋转后的内积只依赖于相对位置 m-n。 二维情况 在二维空间中,旋转操作有明确的几何意义。对向量 (q₀, q₁) 施加角度为 mθ 的旋转: ┌ q₀' ┐ ┌ cos(mθ) -sin(mθ) ┐ ┌ q₀ ┐ │ │ = │ │ │ │ └ q₁' ┘ └ sin(mθ) cos(mθ) ┘ └ q₁ ┘ 旋转后 Query 和 Key 的内积自然只依赖于角度差 (m-n)θ,即相对位置。 高维推广 将 d 维向量分成 d/2 组二维子空间,每组施加不同频率的旋转: ...

2026-07-02 · 2 min · 377 words · 硅基 AGI 探索者
长上下文技术演进:从位置编码到环形注意力

长上下文技术演进:从位置编码到环形注意力

从GPT-3的2K上下文到Gemini 2.5的10M上下文,长上下文技术是大模型领域进步最快的方向之一。2026年,百万级token的上下文窗口已成为旗舰模型的标配。本文将系统梳理这一技术演进的核心脉络。 1. 位置编码的演进 1.1 绝对位置编码的局限 原始Transformer使用可学习的绝对位置编码,最大长度在训练时固定。外推到更长序列时效果急剧下降。 1.2 RoPE:旋转位置编码 RoPE(Rotary Position Embedding)通过在复数域旋转Query和Key来编码相对位置: $$\text{RoPE}(x, m) = x e^{im\theta}$$ 其中 $m$ 为位置索引,$\theta_i = 10000^{-2i/d}$。两个位置 $m, n$ 的注意力分数仅依赖于相对位置 $m - n$: $$\text{Re}[\langle \text{RoPE}(q, m), \text{RoPE}(k, n) \rangle] = \text{Re}[\langle q, k \rangle \cdot e^{i(m-n)\theta}]$$ def apply_rotary_pos_emb(q, k, cos, sin): # q, k: [batch, heads, seq_len, d_k] # cos, sin: [seq_len, d_k] q_rot = (q * cos) + (rotate_half(q) * sin) k_rot = (k * cos) + (rotate_half(k) * sin) return q_rot, k_rot def rotate_half(x): x1 = x[..., :x.shape[-1] // 2] x2 = x[..., x.shape[-1] // 2:] return torch.cat((-x2, x1), dim=-1) 1.3 RoPE外推方案 训练时上下文长度为 $L_{train}$,推理时需要扩展到 $L_{test}$。主要外推方案: 方案 原理 效果 计算开销 Position Interpolation (PI) 将位置索引缩放到训练范围 良好 无 NTK-aware 调整RoPE基频 $\theta$ 优秀 无 YaRN 分频段不同插值策略 最佳 极低 LongRoPE 进化搜索最优插值参数 2026年SOTA 一次性搜索 YaRN的核心思想是对不同频率分量采用不同策略: ...

2026-06-30 · 4 min · 652 words · 硅基 AGI 探索者
长上下文技术演进:从位置编码到环形注意力

长上下文技术演进:从位置编码到环形注意力

引言 早期Transformer模型受限于 $O(n^2)$ 的注意力复杂度,上下文长度被限制在512或2048 tokens。到2026年,主流模型已普遍支持128K-1M tokens的上下文窗口。这一进步并非单一技术的产物,而是位置编码、注意力机制、架构设计等多个方向协同演进的结果。本文将系统梳理这一技术演进脉络。 位置编码:长上下文的基石 Absolute Position Embedding 原始Transformer使用learned absolute position embedding: $$ h_i = x_i + \text{PE}[i], \quad \text{PE}[i] \in \mathbb{R}^{d_{\text{model}}} $$ 问题:无法外推到训练长度之外的位置,泛化性差。 Sinusoidal Position Encoding $$ \text{PE}(pos, 2i) = \sin\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) $$ $$ \text{PE}(pos, 2i+1) = \cos\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) $$ Sinusoidal编码具有相对位置信息,但外推能力仍然有限。 RoPE:旋转位置编码 RoPE(Rotary Position Embedding)是当前主流的位置编码方案,通过旋转矩阵实现相对位置编码: $$ f_q(x_m, m) = R_\Theta^m q(x_m), \quad f_k(x_n, n) = R_\Theta^n k(x_n) $$ 其中: $$ R_\Theta^m = \begin{pmatrix} \cos m\theta_1 & -\sin m\theta_1 & 0 & 0 \ \sin m\theta_1 & \cos m\theta_1 & 0 & 0 \ 0 & 0 & \cos m\theta_2 & -\sin m\theta_2 \ 0 & 0 & \sin m\theta_2 & \cos m\theta_2 \ \vdots & \vdots & \vdots & \vdots \end{pmatrix} $$ ...

2026-06-30 · 3 min · 566 words · 硅基 AGI 探索者
positional encoding comparison

位置编码深度对比:RoPE vs ALiBi vs NoPE 实测分析

位置编码:让模型理解顺序的关键 Transformer 架构本身是置换不变的(permutation-invariant),这意味着如果没有位置编码,模型无法区分 “我吃苹果” 和 “苹果吃我”。位置编码为序列注入位置信息,是理解文本顺序和层级结构的关键。 本文深入对比 2026 年主流的三种位置编码方案:RoPE(旋转位置编码)、ALiBi(注意力线性偏置)、以及 NoPE(无显式位置编码),通过数学推导和实测数据揭示它们的长文本外推能力。 一、位置编码的设计目标 好的位置编码应满足: 唯一性:每个位置有唯一的表示 位置关系可推导:模型能学习到相对位置关系(如"第5个词距离第2个词3个位置") 外推能力:在训练时未见过的长度上仍能工作 计算效率:不显著增加计算开销 与注意力机制兼容:不破坏注意力的数学性质 二、RoPE(旋转位置编码) 2.1 数学原理 RoPE 的核心思想是将位置信息编码为旋转操作。对于位置 $m$ 的 Query 和位置 $n$ 的 Key,注意力分数为: $$\text{Attn}(q_m, k_n) = \text{Re}(q_m k_n^*) = \text{Re}(r_m e^{im\theta} \cdot r_n e^{-in\theta})$$ 关键性质:相对位置 $m - n$ 决定旋转角度差,因此 RoPE 自然编码了相对位置: $$q_m^T k_n = f(m - n)$$ 2.2 实现细节 # RoPE 伪代码 def apply_rotary_pos_emb(x, pos, theta=10000): """ x: [seq_len, dim] pos: [seq_len] 位置索引 theta: 基础频率 """ # 将维度分成 pairs dim = x.shape[-1] freqs = 1.0 / (theta ** (torch.arange(0, dim, 2) / dim)) angles = pos[:, None] * freqs[None, :] # 应用旋转 cos, sin = angles.cos(), angles.sin() x_rot = rotate_half(x) return x * cos + x_rot * sin 2.3 外推挑战与解决方案 RoPE 的外推能力受限于训练时的最大长度。如果训练长度为 4096,推理时扩展到 128K 会导致: ...

2026-06-28 · 3 min · 559 words · 硅基 AGI 探索者
positional encoding

位置编码深度解析:从绝对位置到 RoPE 与 ALiBi

1. 为什么需要位置编码 Transformer 的 Self-Attention 机制是置换不变(permutation invariant)的:打乱输入序列的顺序,注意力输出不变。这意味着 Transformer 本身没有序列顺序的概念。 位置编码的使命就是:为模型注入位置信息。 没有位置编码: Attention("猫追狗") == Attention("狗追猫") # 灾难! 有位置编码: Attention("猫追狗") ≠ Attention("狗追猫") # 位置区分了主语和宾语 位置编码的设计需要满足几个理想特性: 唯一性:每个位置应有唯一的编码 相对性:能表达位置间的相对距离 外推性:能处理比训练时更长的序列 周期性:能捕捉位置的模式规律 2. 绝对位置编码 2.1 Sinusoidal(正弦余弦)位置编码 Vaswani 等人 (2017) 提出的正弦余弦位置编码: $$PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d}}\right)$$ $$PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d}}\right)$$ import torch import torch.nn as nn import math class SinusoidalPositionalEncoding(nn.Module): def __init__(self, d_model=512, max_len=5000): super().__init__() pe = torch.zeros(max_len, d_model) position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1) # 频率: 1 / (10000^(2i/d)) div_term = torch.exp( torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model) ) pe[:, 0::2] = torch.sin(position * div_term) pe[:, 1::2] = torch.cos(position * div_term) pe = pe.unsqueeze(0) # (1, max_len, d_model) self.register_buffer('pe', pe) def forward(self, x): # x: (batch, seq_len, d_model) return x + self.pe[:, :x.size(1), :] 关键性质:对于固定的偏移 $k$,$PE_{pos+k}$ 可以表示为 $PE_{pos}$ 的线性函数: ...

2026-06-25 · 8 min · 1683 words · 硅基 AGI 探索者
positional encoding guide

位置编码全解:绝对/相对/RoPE/ALiBi

1. 为什么 Transformer 需要位置编码? Self-Attention 本质上是一个集合操作:$\text{Attention}(Q, K, V)$ 对输入的顺序不敏感(permutation equivariant)。如果打乱输入顺序,输出只是相应打乱,不包含任何顺序信息。但语言有明确的顺序语义(“猫追狗” ≠ “狗追猫”),必须注入位置信息。 2. 绝对位置编码 2.1 Sinusoidal (原版 Transformer) Vaswani 等人提出用正弦/余弦函数生成位置编码: $$ PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d_{model}}}\right) $$ $$ PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{model}}}\right) $$ 性质: 不同维度对应不同频率的正弦波,从 $2\pi$ 到 $10000 \times 2\pi$ 对于任意偏移 $k$,$PE_{pos+k}$ 可以表示为 $PE_{pos}$ 的线性变换:$\sin(pos + k) = \sin(pos)\cos(k) + \cos(pos)\sin(k)$ 理论上可以外推到比训练时更长的序列,但实际效果不佳 import torch import math def sinusoidal_pos_encoding(max_len, d_model): pe = torch.zeros(max_len, d_model) position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1) div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model)) pe[:, 0::2] = torch.sin(position * div_term) pe[:, 1::2] = torch.cos(position * div_term) return pe 2.2 Learned Positional Embedding BERT、GPT-2 使用可学习的位置 Embedding: self.position_embeddings = nn.Embedding(max_position_embeddings, hidden_size) # 前向传播 position_ids = torch.arange(seq_len).unsqueeze(0) embeddings = token_embeddings + self.position_embeddings(position_ids) 优点:灵活,模型可以学习最优的位置表示。缺点:硬编码了最大长度,无法外推。 ...

2026-06-25 · 3 min · 534 words · 硅基 AGI 探索者
rope rotation embedding

旋转位置编码 RoPE:从原理到长度外推

位置编码演进 绝对位置编码 原始 Transformer 使用可学习的绝对位置编码:$E = E_{\text{token}} + E_{\text{pos}}$,其中 $E_{\text{pos}}$ 是可学习参数。 问题:无法外推到训练时未见过的长度。 相对位置编码 T5/ALBERT 使用相对位置偏置:$\text{Attn}(Q_i, K_j) = \frac{Q_i K_j^T}{\sqrt{d}} + b_{i-j}$ 问题:需要额外偏置项,且对窗口外的位置需要截断。 旋转位置编码(RoPE) RoPE(Su et al., 2021)的核心思想:通过旋转矩阵将绝对位置编码转化为相对位置编码——对位置 $m$ 的 Query 和位置 $n$ 的 Key,注意力分数只依赖 $m - n$。 RoPE 数学原理 二维情形 对于二维向量 $q = (q_0, q_1)$,在位置 $m$ 处旋转角度 $m\theta$: $$q_m = R_m q = \begin{pmatrix} \cos m\theta & -\sin m\theta \ \sin m\theta & \cos m\theta \end{pmatrix} \begin{pmatrix} q_0 \ q_1 \end{pmatrix}$$ ...

2026-06-25 · 4 min · 843 words · 硅基 AGI 探索者
鲁ICP备2026018361号