从 2017 年 Transformer 的正弦位置编码出发,经过 RoPE,ALiBi,NoPE,PI,YaRN,一直走到 2025 年的 DroPE——这条演进路线的背后,其实是一个反复被追问的同一个问题:怎么让模型既知道位置,又不被位置限制住?
从第一性原理出发,把每一步改进背后的动机和局限都讲清楚,最终理解 DroPE 的核心洞察:位置编码只是训练时的“脚手架”,不是模型推理时的必需品。
为什么 Attention 看不到顺序
在正式介绍位置编码之前,先想清楚一件事:Attention 本身为什么不知道顺序?
Self-attention 的计算本质上是:对序列中的每一个 token,计算它与其他所有 token 的相似度,然后加权求和。具体来说,给定输入序列 \(h_1, h_2, \ldots, h_T\),注意力分数和输出是:
\[s_{ij} = \frac{1}{\sqrt{d_k}} q_i^\top k_j, \quad \alpha_{ij} = \text{softmax}(s_{i1}, \ldots, s_{ii})_j, \quad z_i = \sum_{j \leq i} \alpha_{ij} v_j\]
注意这里 \(q_i = W_Q h_i\),\(k_j = W_K h_j\),\(v_j = W_V h_j\),这些都是对 token 本身的线性变换,与 token 在序列中的位置无关。
也就是说,把 “I love you” 的词序打乱成 “you love I”,只要每个词对应的 embedding 不变,Attention 计算出来的注意力矩阵就和原来完全一样。对 Attention 而言,序列是一个无序集合,而不是一条有顺序的链条。
这在机器翻译、问答这类任务里是灾难性的:语言的含义高度依赖词序,“猫吃了鱼”和“鱼吃了猫”意思截然相反。所以 Transformer 必须显式地把位置信息“注入”进去。
第一个答案:正弦位置编码
论文:Attention Is All You Need(Vaswani et al。, NeurIPS 2017)
Transformer 原论文给出的方案很直接:在 token embedding 的基础上,加上一个只依赖位置的向量。
正弦公式
\[PE_{(pos, 2i)} = \sin\!\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right), \quad PE_{(pos, 2i+1)} = \cos\!\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right)\]
其中 \(pos\) 是 token 在序列中的位置(从 0 开始),\(i\) 是 embedding 的维度索引,\(d_{\text{model}}\) 是整体 embedding 的维度。
它是怎么被使用的
位置编码的使用方式非常简单:把 \(PE_{pos}\) 这个向量直接加到 token embedding 上,得到送入 Transformer 的最终输入:
\[\tilde{h}_{pos} = \text{Embedding}(\text{token}) + PE_{pos}\]
之后所有的 Query,Key,Value 都从 \(\tilde{h}_{pos}\) 线性投影得到:
\[q_{pos} = W_Q \tilde{h}_{pos}, \quad k_{pos} = W_K \tilde{h}_{pos}, \quad v_{pos} = W_V \tilde{h}_{pos}\]
注意力分数因此变成了:
\[s_{ij} = \frac{1}{\sqrt{d_k}} q_i^\top k_j = \frac{1}{\sqrt{d_k}} (W_Q \tilde{h}_i)^\top (W_K \tilde{h}_j)\]
展开后包含四项:token 内容与内容的交互、内容与位置的交互、位置与内容的交互、位置与位置的交互。位置信息就是通过这四项“渗入”注意力分数的,模型需要自己从这个混合信号里学会利用位置信息。
这个设计有一个漂亮的直觉:把每个位置想象成一个“时钟”,不同维度的时钟转速不同。低维(\(i\) 小)的时钟转得慢,对应粗粒度的位置区分;高维(\(i\) 大)的时钟转得快,对应细粒度的位置区分。整套编码构成一个从 \(2\pi\) 到 \(10000 \cdot 2\pi\) 的几何级数,理论上可以无限扩展。
作者还指出,对于任意固定的偏移量 \(k\),\(PE_{pos+k}\) 都可以表示成 \(PE_{pos}\) 的一个线性变换。这意味着模型理论上可以通过学习线性变换来捕捉相对位置关系。
正弦编码的局限
正弦位置编码有两个根本性的问题:
第一,它是绝对位置编码。每个 token 只被告知“我在第 \(pos\) 个位置”,而不是“我和旁边的 token 相距多远”。在语言理解中,相对距离往往比绝对位置更重要,“主语”和“谓语”之间的关系,不管它们在句子的哪个位置,本质都是一样的。
第二,它无法外推到训练时未见过的长度。虽然正弦函数本身可以无限延伸,但超出训练长度后,模型从未在这些位置上训练过,性能会急剧下降。
这两个问题促使研究者去寻找更好的位置编码方式。
走向相对位置:RoPE
论文:RoFormer: Enhanced Transformer with Rotary Position Embedding(Su et al。, 2021)
正弦位置编码的问题在于,它把位置信息和 token 内容信息通过加法混合在一起,然后模型要自己从这个混合信号里把相对位置关系学出来。有没有更直接的方式,让注意力分数天然地只依赖相对位置?
这正是 RoPE(Rotary Position Embedding,旋转位置嵌入)的出发点。
核心思想
RoPE 的目标是:设计一种对 query 和 key 的变换方式,使得变换后的内积只依赖相对位置 \(m - n\),而不依赖绝对位置 \(m\) 和 \(n\):
\[\tilde{q}_m^\top \tilde{k}_n = f(q, k, m-n)\]
实现这一目标的方式是对每个 query 和 key 施加旋转变换:把 \(q_m\) 旋转 \(m\theta\) 角,把 \(k_n\) 旋转 \(n\theta\) 角,然后取内积:
\[\tilde{q}_m^\top \tilde{k}_n = (R_{\theta, m} q_m)^\top (R_{\theta, n} k_n) = q_m^\top R_{\theta, m}^\top R_{\theta, n} k_n = q_m^\top R_{\theta, m-n} k_n\]
最后一步用到了旋转矩阵的性质:\(R_{\theta, m}^\top R_{\theta, n} = R_{\theta, n-m}\)。这样内积里就只剩下 \(m - n\),绝对位置被消掉了。
为什么偏偏是“旋转”?直觉上可以这样理解:两个向量做内积,结果只依赖它们之间的夹角,而不依赖它们各自转了多少圈的绝对角度。把 \(q_m\) 转了 \(m\theta\),\(k_n\) 转了 \(n\theta\),两者的内积就等价于原始向量之间转了 \((m-n)\theta\) 的夹角,就像时钟上两根指针,你只需要知道它们的相对夹角是多少,不需要知道它们各自转过了几整圈。这一特性是旋转变换独有的,简单的加法做不到。
旋转矩阵的具体形式
对于 \(d_k\) 维的 query/key,RoPE 将其分成 \(d_k / 2\) 对维度,每对独立地做 2D 平面旋转:
\[R_{\theta, m} = \begin{pmatrix} \cos m\omega_1 & -\sin m\omega_1 & & & \\ \sin m\omega_1 & \cos m\omega_1 & & & \\ & & \cos m\omega_2 & -\sin m\omega_2 & \\ & & \sin m\omega_2 & \cos m\omega_2 & \\ & & & & \ddots \end{pmatrix}\]
其中每对维度的旋转频率为 \(\omega_d = b^{-2(d-1)/d_k}\),\(b = 10000\)。不同的维度对应不同的旋转频率,低维度旋转慢(低频),高维度旋转快(高频)。
在实现层面,不需要显式构造这个稀疏矩阵。对 \(q_m = (q_1, q_2, \ldots, q_{d_k})\),旋转操作可以写成:
\[\tilde{q}_m = \begin{pmatrix} q_1 \cos m\omega_1 - q_2 \sin m\omega_1 \\ q_1 \sin m\omega_1 + q_2 \cos m\omega_1 \\ \vdots \end{pmatrix}\]
这个操作在每一层 Transformer 的 Attention 计算前都会做,而不是只在输入端加一次。
RoPE 的优点与致命弱点
RoPE 被几乎所有现代主流 LLM(LLaMA,Qwen,Mistral,Gemma)采用,原因是:
- 天然编码相对位置,不需要模型自己学习相对关系
- 内积随相对距离增大而衰减(距离越远的 token 影响越小)
- 可以在每一层的 Q/K 上独立施加,与 FlashAttention 等工程优化兼容
然而,RoPE 有一个无法回避的问题:训练时的 context 长度是固定的。假设训练时 context 长度 \(C_{\text{train}} = 2048\),那么所有旋转角度 \(m\omega_d\) 都在 \([0, 2048 \cdot \omega_d]\) 范围内。一旦推理时出现 \(m > 2048\) 的位置,对应的旋转角度就超出了训练时见过的范围,模型完全不知道该如何处理——性能急剧下降。
长上下文泛化问题,就此成为 RoPE 最棘手的挑战。
与正弦 PE 的本质差异
回顾一下正弦 PE 的做法:把位置向量加到 embedding 上,之后 Q/K/V 统一从混合向量投影。注意力分数展开后包含内容×内容,内容×位置,位置×内容,位置×位置四类交叉项,绝对位置信息和 token 内容信息被混合在一起,模型需要自己从中学出相对位置关系。
RoPE 的做法截然不同:不动 embedding,而是在每一层计算注意力时,直接对 Q 和 K 施加旋转变换,并利用旋转矩阵的消去性质,使内积结果只含相对位置 \(m-n\),绝对位置在数学上被消掉了。
| 正弦 PE | RoPE | |
|---|---|---|
| 位置注入位置 | 输入端,加到 embedding,只做一次 | 每一层的 Q/K 上,每层都做 |
| 注意力分数包含 | 内容×内容 + 内容×位置 + 位置×位置(混合) | 只含相对位置 \(m-n\)(绝对位置消去) |
| 模型的学习负担 | 需自己从混合信号中提取相对位置关系 | 相对位置天然内嵌,无需额外学习 |
| 外推能力 | 超出训练长度后性能急剧下降 | 同样受训练长度限制(OOD 问题) |
两种方法在外推能力上都存在问题,但 RoPE 在表达相对位置这件事上要干净得多——这正是它成为现代 LLM 标配的根本原因。
另一条路:ALiBi
论文:Train Short,Test Long: Attention with Linear Biases Enables Input Length Extrapolation(Press et al。, ICLR 2022)
在 RoPE 大行其道的同时,还有一种不同思路的方案值得了解:ALiBi(Attention with Linear Biases)。
直接惩罚距离
ALiBi 不引入任何位置 embedding,而是在计算注意力分数时,对距离较远的 key 直接施加一个线性惩罚:
\[s_{ij} = \frac{q_i^\top k_j}{\sqrt{d_k}} + m \cdot (j - i)\]
其中 \(j - i \leq 0\)(\(j\) 是 key 的位置,\(i\) 是 query 的位置,causal mask 保证 \(j \leq i\)),\(m\) 是每个 attention head 预先分配的固定斜率,按几何级数设置:\(\frac{1}{2}, \frac{1}{4}, \frac{1}{8}, \ldots\)
不同 head 的斜率不同,让不同 head 负责不同尺度的距离感知:斜率大的 head 更关注近邻,斜率小的 head 能看得更远。
ALiBi 的外推能力
ALiBi 最大的优势是外推:由于线性惩罚的公式对任意距离都成立(不受训练长度限制),在训练长度 512 上训练的模型,可以直接外推到 2048 甚至更长,而不需要任何微调。
但代价是表达能力受限:强制的线性衰减意味着“远处的 token 一定不如近处重要”,但实际上语言中有很多长距离依赖(比如代词和它指代的名词可能相距很远)。这个硬性约束让 ALiBi 在绝对性能上弱于 RoPE,也是它没有被主流 LLM 采用的根本原因。
ALiBi 的价值更多在于它提供了一个思路:也许我们不需要把位置信息编码成向量,而是可以通过更简单的方式让注意力感知距离。顺着这个思路,研究者开始问一个更激进的问题:如果连这个偏置都不加,模型还能感知位置吗?
一个反直觉的发现:NoPE
论文: - Transformer Language Models without Positional Encodings Still Learn Positional Information(Haviv et al., 2022) - The Impact of Positional Encoding on Length Generalization in Transformers(Kazemnejad et al., NeurIPS 2023)
2022 年,Haviv 等人做了一个看起来很离谱的实验:把 GPT 风格的 causal LM 里所有的位置编码全部移除,看模型还能不能正常工作。
结果是:能,而且比预期好得多。
在继续之前,先澄清一个可能的困惑:
这和前面“Attention 看不到顺序”不矛盾吗?
不矛盾,但需要仔细区分。前面说的是:Attention 的计算本身(即 \(q_i^\top k_j\) 这个操作)对 token 的排列顺序是完全无感的,你把词序打乱,这个内积的结果不变。这是 Attention 作为一个数学操作的固有性质,与有没有 PE 无关。
NoPE 说的不是“Attention 突然能感知顺序了”,而是:在 GPT/decoder-only 架构里,除了 Attention 计算本身之外,还存在另一个隐式的位置信息来源,causal mask。 NoPE 只去掉了显式的位置编码向量,causal mask 这个结构性约束依然存在,而它恰好可以承担位置感知的功能。
Causal Mask 的隐藏作用
为什么 causal mask 能充当位置信息的来源?原因如下。
在 GPT 风格的 decoder 中,每个 token 只能看到它之前的 token(causal mask 把“未来”屏蔽掉)。这意味着:处于位置 \(i\) 的 token 能看到 \(i\) 个 token(包括自己),而位置 \(j < i\) 的 token 只能看到 \(j\) 个 token。能看到的 token 数量本身,就是绝对位置的一个代理指标。
举个具体的例子。假设句子是 “The cat sat”,没有任何位置编码:
- “The”(pos=0):只能 attend 自己,第一层的输出完全等于自身 embedding 的变换
- “cat”(pos=1):能 attend “The” 和自己,第一层的输出是两个 token 的加权平均
- “sat”(pos=2):能 attend 三个 token,第一层的输出是三者的加权平均
没有 PE 时,第一层的权重是均匀的(softmax 后各 \(1/i\)),所以 “The” 的输出完全来自自己,“sat” 的输出是三个 token 的均值。这三个输出本质上不同,模型的后续层可以从这个“能看到几个 token”的差异中恢复出位置信息。Kazemnejad(2023)通过理论证明,causal mask 使得 NoPE 模型的第一层 attention 就能完美重建序列位置。
NoPE 在长度泛化上的优势
更有趣的是,NoPE 在长度泛化任务上的表现超过了所有显式位置编码方案,包括 RoPE,ALiBi,Sinusoidal 和 T5 的相对位置编码。
直觉上可以这样理解:显式位置编码给了模型一个“拐杖”,让它快速学会利用绝对位置。但这也让模型形成了对特定位置模式的依赖,训练时见过的长度范围内表现好,超出这个范围就失效。NoPE 没有这根拐杖,模型必须学会更本质的结构规律,反而泛化能力更强。
NoPE 的代价
然而,NoPE 不是免费的午餐:
- 训练收敛慢。没有位置归纳偏置,模型在训练初期很难建立起位置感知,梯度信号弱,收敛比 RoPE 慢很多。
- 绝对性能弱于 RoPE。在同等训练 token 数下,NoPE 的困惑度高于 RoPE,无法替代 RoPE 成为主流 LLM 的选择。
NoPE 的故事在这里留下了一个悬念:既然位置编码不是推理时的必需品,那能不能训练时用 RoPE 快速收敛,推理时把 RoPE 去掉实现长度泛化?
扩展 RoPE 上下文的三次尝试
论文: - Extending Context Window of Large Language Models via Positional Interpolation(Chen et al., 2023) - NTK-Aware Scaled RoPE(bloc97,2023) - YaRN: Efficient Context Window Extension of Large Language Models(Peng et al., 2023)
主流还是 RoPE,但长上下文需求越来越迫切(RAG、长文档理解、代码补全……)。研究者开始探索:能不能在不重新训练的前提下,让 RoPE 模型处理更长的序列?
问题的本质
设训练时 context 长度为 \(C_{\text{train}}\),推理时目标长度为 \(C_{\text{test}}\),扩展因子 \(s = C_{\text{test}} / C_{\text{train}}\)。
RoPE 的旋转频率为 \(\omega_m = b^{-2(m-1)/d_k}\)(\(b=10000\))。超出训练长度时,不同频率维度的“受损程度”差异极大,原因如下:
高频维度(\(\omega_m \approx 1\)):在训练长度 \(C_{\text{train}}=2048\) 内,最大旋转角度约为 \(2048 \times 1 \approx 2048\) 弧度,远远超过 \(2\pi\),相当于转了 300 多圈。推理时超出训练长度,只是多转几圈而已,新角度在训练中都曾出现过,不会 OOD。
低频维度(\(\omega_m \ll 1\),比如最低频的 \(\omega_m \approx 10^{-4}\)):在 \(C_{\text{train}}=2048\) 内,最大旋转角度约为 \(2048 \times 10^{-4} \approx 0.2\) 弧度,连半圈都没转到。一旦 \(pos > C_{\text{train}}\),旋转角度进入了 \([0.2, ...]\) 的范围,而这个角度在训练中从未出现过,严重 OOD。
用时钟打比方:秒针(高频)每分钟转一圈,多转几圈没什么问题;时针(低频)一天才转两圈,如果训练只见过它转到 1/3 圈的位置,推理时它转到 2/3 圈就完全陌生了。
所有的 RoPE 上下文扩展方案,本质上都在做同一件事:对 RoPE 的频率进行重新缩放,用一个缩放因子 \(\gamma_m\) 把原始频率 \(\omega_m\) 替换成 \(\omega_m' = \gamma_m \omega_m\),让超长位置的旋转角度重新落回训练见过的范围。
\[s_{ij} = \frac{1}{\sqrt{d_k}} (R^i q_i)^\top (R^j k_j), \quad R = \text{block-diag}(R(\omega_1'), \ldots, R(\omega_{d_k/2}'))\]
三种方案的区别在于 \(\gamma_m\) 的取法:
方案一:位置插值(PI,Chen et al。,2023)
最简单的思路:把所有位置索引等比缩小,让它们都落回 \([0, C_{\text{train}}]\) 以内。
\[m' = m \cdot \frac{C_{\text{train}}}{C_{\text{test}}} = \frac{m}{s}\]
对应的 \(\gamma_m^{\text{PI}} = \frac{1}{s}\),对所有频率维度一视同仁地乘以 \(\frac{1}{s}\)。
效果:理论上,插值的误差上界比外推小约 600 倍,数值上更稳定。仅需 1000 步微调就能把 LLaMA 的 context 从 2048 扩展到 32768。
代价:等比缩小意味着相邻 token 之间的位置区分度下降,原来间距为 1,现在间距变成了 \(1/s\)。对高频维度来说,这几乎没有影响(高频本来就变化很快);但对低频维度来说,这会导致近距离 token 的位置区分变得模糊。
方案二:RoPE-NTK(bloc97,2023)
PI 的问题出在高频和低频被一视同仁。一个更聪明的思路来自 NTK(Neural Tangent Kernel)理论:与其缩放位置索引,不如直接把 base \(b\) 换成更大的值。
\[b' = b \cdot s^{d_k/(d_k - 2)}, \quad \omega_m' = (b')^{-2(m-1)/d_k}\]
对应的缩放因子 \(\gamma_m^{\text{NTK}} = \left(\frac{1}{s}\right)^{1 - 2(m-1)/d_k}\)。
高频维度(\(m\) 大)对应的 \(\gamma_m \approx 1\),几乎不缩放;低频维度(\(m\) 小)对应的 \(\gamma_m \approx 1/s\),被大幅压缩。
效果:近距离位置的区分度保留更好,高频维度不受影响。
代价:仍然需要微调;低频维度被大幅压缩。
方案三:YaRN(Peng et al。,2023)
YaRN 在 NTK 的基础上更进一步:不同频率维度分三段差异化处理。
对每个频率维度 \(m\),计算它对应的“波长”\(\lambda_m = 2\pi / \omega_m\)。根据 \(\lambda_m\) 与训练长度 \(C_{\text{train}}\) 的比值,把维度分成三类:
- 高频(\(\lambda_m \ll C_{\text{train}}\)):这类维度在训练长度内已经转过很多圈,超长序列对它们没有影响,完全保留(\(\gamma_m = 1\))
- 低频(\(\lambda_m \gg C_{\text{train}}\)):这类维度即使在训练长度内都没转完一圈,超长序列会让它们严重 OOD,完全插值(\(\gamma_m = 1/s\))
- 中频:用平滑函数 \(\kappa_m\) 在两者之间过渡
\[\gamma_m^{\text{YaRN}} = (1 - \kappa_m) \cdot \frac{1}{s} + \kappa_m \cdot 1\]
YaRN 还引入了一个额外的注意力缩放因子 \(\sqrt{1/t}\)(\(t \approx 0.1 \ln s + 1\)),用于补偿频率缩放后注意力熵的变化。
效果:微调步数进一步减少,性能优于 PI 和 NTK。
三种方案的共同局限
| 方法 | \(\gamma_m\) 的取法 | 高频影响 | 低频影响 | 需要微调 |
|---|---|---|---|---|
| PI | \(1/s\)(均匀) | 近距区分度下降 | OOD 问题缓解 | 1000 步 |
| RoPE-NTK | 按指数分层 | 基本不变 | 大幅压缩 | 仍需微调 |
| YaRN | 按波长三分段 | 完全保留 | 完全插值 | 最少 |
这三种方案在困惑度(perplexity)指标上都取得了不错的效果。但当用更严格的测试(比如 Needle-in-a-Haystack,即在超长文档中检索一条具体信息)时,它们都出现了严重的失效——在训练长度以内可以检索,超过训练长度就完全找不到。
问题出在哪里?
RoPE 的解剖:高频管位置,低频管语义
论文:Round and Round We Go! What Makes Rotary Positional Encodings Useful?(Barbero et al。, ICLR 2025)
要理解 RoPE-scaling 为什么在实际任务上失败,需要先搞清楚 RoPE 在预训练好的模型中究竟在做什么。
注意力头的两种分工
Barbero 等人(2025)对预训练好的 Gemma-7B 进行了系统分析,发现 attention head 可以根据其注意力模式分成两类:
位置头(Positional Heads):注意力集中在对角线附近,主要关注距离自己近的 token。这类 head 负责整合局部语境,处理的是与位置强绑定的短程关系。举几个具体的例子: - 句法依存:在“猫咪追着老鼠跑”中,动词“追”的主语是“猫咪”(距离 1),宾语是“老鼠”(距离 2),这种主谓宾结构需要在相邻几个词之间建立联系。 - 形容词-名词搭配:“一只 橘色的 猫”中,“橘色的”紧贴“猫”,修饰关系只需近距离感知。 - 标点与句子边界:句号,逗号等标点通常紧跟在它们所结束的短语后,位置头利用这一近邻关系感知句子结构。
语义头(Semantic Heads):注意力分散,根据内容在序列中远程检索相关信息。这类 head 负责跨越较长距离的语义关联,例如: - 代词消解:在“李明走进了实验室,他把笔记本放在桌上”中,“他”指代开头的“李明”,两者可能相距十几个 token,需要语义头把它们关联起来。 - 长文档检索:在 RAG 场景中,问题的关键词和文档中对应的答案片段可能相距数千个 token,语义头负责把两者的 query 和 key 匹配起来。
频率分工的发现
Barbero 等人是如何发现这两类 head 的?他们在 Gemma-7B 上可视化了每个 attention head 的注意力矩阵,并计算了一个指标:每个 head 注意力权重的“对角线集中度”(即注意力有多集中在 token 自身及其近邻)。对角线集中度高的 head 就是位置头,分散的就是语义头。这种分类在模型的不同层、不同 head 上都能清晰观察到,并非个别现象。
进一步,他们分析了每类 head 在各 RoPE 频率维度上的激活幅度,发现两类 head 依赖的频率区间高度分离——这就是频率分工的核心证据。
在解释“高频”和“低频”之前,先把 RoPE 的旋转频率公式展开看清楚。
RoPE 把 \(d_k\) 维向量拆成 \(d_k/2\) 对,每一对维度 \(d\)(\(d = 0, 1, \ldots, d_k/2 - 1\))有一个旋转频率:
\[\omega_d = b^{-2d/d_k}, \quad b = 10000\]
位置 \(m\) 的 token 在第 \(d\) 对维度上旋转的角度是 \(m \cdot \omega_d\)。\(d\) 越小,\(\omega_d\) 越接近 1(高频);\(d\) 越大,\(\omega_d\) 越接近 0(低频)。
以 \(d_k = 8\)(即 4 对维度)为例,具体数值如下:
| 维度对 \(d\) | 频率 \(\omega_d\) | 相邻 token 旋转角 | 在 2048 token 内旋转圈数 |
|---|---|---|---|
| \(d=0\) | \(1.000\) | 1。00 rad | ≈326 圈 |
| \(d=1\) | \(0.032\) | 0。032 rad | ≈10 圈 |
| \(d=2\) | \(0.001\) | 0。001 rad | ≈0。33 圈 |
| \(d=3\) | \(3.2\times10^{-5}\) | 3。2×10⁻⁵ rad | ≈0。01 圈 |
用 “The cat sat on the mat” 来具象地理解高频与低频:
高频(\(d=0\),\(\omega_0=1\)):相邻两个 token 之间旋转 1 rad,“cat”(pos=1)和 “sat”(pos=2)的旋转角分别是 1 rad 和 2 rad,差了整整 1 rad,非常容易区分。这个维度专门用来感知“谁在谁旁边”。当模型需要判断 “cat” 和 “sat” 是句法上相邻的动词-主语关系时,正是这个高频维度在发挥作用。
低频(\(d=3\),\(\omega_3 \approx 3.2 \times 10^{-5}\)):“cat”(pos=1)和 “mat”(pos=5)的旋转角分别是 \(3.2 \times 10^{-5}\) rad 和 \(1.6 \times 10^{-4}\) rad,两者差距很小,但这个维度的意义在于:它在整句 6 个 token 内都保持单调增长且几乎不绕圈,能稳定区分近端和远端。当模型需要把代词 “it” (如果出现在后文第 100 个位置)和它的先行词 “cat”(pos=1)联系起来时,正是这些低频维度在帮助语义头跨越长距离建立匹配。
关键发现是:这两类 head 使用的 RoPE 频率维度是不同的。
位置头主要使用高频维度(\(\omega_m\) 大,旋转快)。高频维度在相邻位置之间的旋转角差很大,可以精确区分近距离的位置,正好服务于位置头的句法/近邻感知需求。
语义头主要使用低频维度(\(\omega_m\) 小,旋转慢)。低频维度变化平缓,在较长的相对距离范围内都保持区分度,正好服务于语义头的远程内容匹配需求。
为什么 scaling 必然破坏语义头
现在回头看 RoPE-scaling 的困境就很清楚了:
所有 RoPE-scaling 方法(PI,NTK,YaRN)都必须对低频维度做压缩(\(\gamma_m < 1\)),因为低频维度在超出训练范围时 OOD 最严重。但低频维度正是语义头赖以工作的频段。压缩低频,意味着语义头在计算远距离 token 之间的注意力时,其“坐标系”被悄悄地改变了。
DroPE 论文中有一个实验把这个问题展示得很直观:用 YaRN 扩展 context 后,在 Needle-in-a-Haystack 任务中,语义头对“针”(关键信息)的注意力权重在训练长度以外几乎归零,而对其周围的无关 token 的注意力反而增大了。模型不是“看不到”那么远,而是“看到了但认错了”。
这是 RoPE-scaling 方法的结构性矛盾:为了不让位置超出分布(保住位置头),必须压缩低频;但压缩低频破坏了语义头。这个矛盾在不改变 RoPE 框架的前提下,无法从根本上解决。
DroPE:把位置编码当脚手架
论文:Extending the Context of Pretrained LLMs by Dropping Their Positional Embeddings(Gelberg et al。, 2025)
理解了前面所有的背景,DroPE 的思路就非常自然了。
三个关键观察
DroPE 的整个论证建立在三条观察上:
观察一:显式 PE 是训练时的归纳偏置,不是推理时的必需品。
DroPE 通过理论(Theorem 3.4)和实验证明:RoPE 在训练初期大幅加速了位置感知的建立。具体来说,对于 NoPE 模型,如果输入序列由完全相同的 token 构成,则所有 attention head 的注意力分布均匀,梯度为零,模型完全无法建立位置感知。RoPE 通过旋转变换天然打破了这种对称性,使梯度从一开始就有非零的位置方向,收敛快得多。
但这只是训练初期的需要。训练完成后,如果通过短暂的再校准把 PE 去掉,模型完全可以通过 causal mask 恢复位置感知(见第五节 NoPE 的讨论)。
观察二:RoPE-scaling 无法实现真正的零样本长上下文泛化。
这是第七节的结论:低频压缩不可避免地破坏语义头,导致超训练长度后的检索任务失败。无论 PI,NTK 还是 YaRN,都无法真正解决这个问题。
观察三:PE 去掉之后,模型可以零样本泛化到远超训练长度的序列。
没有 RoPE 的限制,就没有“旋转角度 OOD”的问题。模型只依赖 causal mask 提供的结构性位置信号,而这个信号在原则上对任意长度都成立。需要说明的是,“任意长度”是理论上的表述,论文的实验测到了约 80× 训练长度(SmolLM 训练长度 2048,在 LongBench 上测试了约 160K token 的文档),在这个范围内 DroPE 持续优于所有 RoPE-scaling 方案。但极端倍数(比如 1000×)下是否仍然稳定,论文并未系统测试;causal mask 提供的位置信号虽然没有 OOD 问题,但模型的注意力计算和 KV cache 本身的工程瓶颈(\(O(n^2)\) 复杂度,显存限制)才是真正的上限。
DroPE 的操作流程
基于这三条观察,DroPE 的做法极其简单:
1 | 阶段一(预训练):正常使用 RoPE,享受快速收敛 |
再校准阶段的关键细节:
- 在原始 context 长度(而非扩展后的长度)上做再校准。这里有一个关键问题:为什么不需要长序列数据?再校准的目标是让模型“学会不依赖 PE 也能完成语言建模”,而这个学习过程本身不需要长序列,在短序列上,causal mask 已经足以为每个 token 提供可区分的位置信号(参见 NoPE 那节的分析)。模型在短序列上学会依靠 causal mask 工作后,这个能力可以天然外推到更长的序列,因为 causal mask 的结构对任意长度都成立。换句话说,再校准教的是一种工作方式的切换,不需要见过目标长度的数据。
- 代价极低:对于在 16B tokens 上预训练的模型,再校准只需 2B tokens(12.5%)
- 这 2K 步的再校准足以让模型的 in-context 困惑度恢复到与原始 RoPE 模型持平的水平
实验结果
零样本长上下文泛化(RULER benchmark,2× 训练长度):
这里用的测试集是 RULER(Really Understanding Long-context Evaluation for Reasoning),它的核心任务类型叫 Needle-in-a-Haystack(大海捞针):在一段超长文本里藏几条“针”(关键信息),要求模型精确找出来。三个子任务的区别在于“针”的形式:
- Multi-Query:一根针,但有多个不同的问题来问它(“干草堆里藏了一个密码,密码是多少?密码的第一位是什么?”),测试模型能否在同一位置提取多种信息。
- Multi-Key:多根针(多条不同的键值对),问题只涉及其中一根(“藏了 5 个密码,找出属于用户 A 的那个”),测试模型能否在众多干扰项中精确定位,直接考察语义头的远程检索能力。
- Multi-Value:一个键对应多个值(“用户 A 的密码在文中出现了 3 次,列出所有版本”),测试模型能否聚合分散在长文中的多处信息。
分数是精确匹配率(0–100),“2× 训练长度”意味着测试时序列长度是训练时的两倍,模型从未在这个长度上训练过(零样本外推)。
| 方法 | Multi-Query | Multi-Key | Multi-Value | 均值 |
|---|---|---|---|---|
| RoPE | 0.0 | 0.0 | 0.0 | 0.0 |
| RoPE + PI | 0.0 | 0.0 | 0.0 | 0.0 |
| RoPE + NTK | 21.1 | 19.4 | 16.5 | 19.0 |
| RoPE + YaRN | 17.8 | 0.5 | 14.6 | 11.0 |
| DroPE | 28.0 | 41.6 | 23.3 | 31.0 |
DroPE 在所有任务上全面超越 RoPE-scaling 方案。最值得关注的是 Multi-Key(41.6 vs NTK 的 19.4):这个任务要求在多根针中按语义匹配找到正确的那根,恰好是语义头被破坏后最先崩溃的场景。DroPE 在这里的优势最能说明“保住低频维度/语义头”的价值。YaRN 在 Multi-Key 上只得 0.5 分,几乎完全失效,与前面分析的“低频压缩导致语义头坐标系紊乱”完全吻合。
关于对比的公平性:表中的 RoPE + YaRN 是纯零样本(zero-shot)设置,即直接修改频率后不做任何微调。YaRN 原论文本身强调微调后性能更好,如果做了长上下文微调(SFT),YaRN 的分数会比表中高。因此这个对比针对的具体场景是“拿到一个已经预训练好的模型,不想再花算力微调,直接扩展 context”。在这个场景下,DroPE 再校准的成本(2B tokens)远低于 YaRN 的长上下文 SFT,而效果远优于零样本 YaRN。如果 YaRN 做了充分微调,则两者的对比会更接近,但 DroPE 仍然保留了“无需长上下文数据”的优势。
In-context 性能保留(ARC,HellaSwag 等标准 benchmark):
SmolLM-DroPE 在再校准后,在 6 个标准 NLP 任务上的平均分与原始 SmolLM 基本持平,验证了再校准不会损害原有能力。
扩展到更大模型:DroPE 直接应用于 LLaMA-2-7B(仅在 20B tokens 上再校准,相当于原始预训练的 0.5%),在 LongBench 上依然超越了所有 RoPE-scaling 方案。
关于“无限上下文”的说明:DroPE 常被描述为支持“任意长度”,但需要理解这句话的准确含义。论文的 RULER 实验测到 2× 训练长度;SmolLM-DroPE(训练长度 2048)在 LongBench 上测试了长达约 80× 训练长度的文档,并仍然表现出色。“无限”的真正含义是:DroPE 消除了 RoPE 的那个硬性上限,旋转角度 OOD 导致的性能断崖。去掉 PE 之后,模型没有了这道“墙”,随着序列变长性能是渐进衰减而不是突然崩塌。但实际推理时真正的瓶颈换成了工程问题:self-attention 的 \(O(n^2)\) 计算量,KV cache 的显存占用,这些与位置编码无关,是 Transformer 架构本身的约束。
在 RoPE 框架内精雕细琢
在 DroPE 出现之前(也有部分工作与 DroPE 平行推进),还有一批研究沿着“如何把 RoPE-scaling 做得更精准”这条路继续推进。这些工作没有跳出 RoPE 的框架,而是在频率缩放的细节上不断打磨。
LongRoPE:非均匀插值 + 两百万 token 上下文
论文:LongRoPE: Extending LLM Context Window Beyond 2 Million Tokens(Ding et al。, 2024)
PI 和 YaRN 对所有位置做均匀或分段插值,但不同位置的 token 对旋转角度的“敏感程度”并不相同。LongRoPE 通过进化算法在每个频率维度上搜索最优的非均匀缩放因子,针对性地减小关键位置的插值误差。配合渐进式扩展策略(先扩到 256K,再扩到 2048K),LongRoPE 在 LLaMA-2 和 Mistral 上实现了超过 200 万 token 的上下文窗口,且只需 1000 步微调。
LongRoPE 的价值在于把 YaRN “人工分三段”的启发式规则换成了数据驱动的搜索,本质上还是在 RoPE 框架内打补丁,但精度更高。它也因此继承了 RoPE-scaling 的结构性矛盾:低频维度依然需要被压缩,语义头的长距离检索能力依然受损。
Resonance RoPE:让旋转频率与训练数据“共振”
论文:Resonance RoPE: Improving Context Length Generalization of Large Language Models(Wang et al。, 2024)
这篇工作提出了一个有趣的观察:RoPE 的旋转频率 \(\omega_d\) 是按几何级数固定设置的,但训练数据中 token 的实际位置分布并不均匀,短序列占多数,长序列的位置只被见过少量次数。Resonance RoPE 通过调整频率,让 token 的旋转角度尽量落在训练数据中被频繁见过的角度区间,从而在不增加训练量的情况下提升长度泛化能力。可以理解为 YaRN 的精细化版本:不只是“高频保留,低频插值”,而是让每个维度的频率都与数据分布“共振”。
DPE:只动关键维度,不动其余
论文:Effective Length Extrapolation via Dimension-Wise Positional Embeddings Manipulation(Lu et al。, Fudan,2025)
DPE 提出了一个更外科手术式的视角:既然不同频率维度对超长 context 的“耐受程度”各不相同,为什么要对所有维度施加同样的缩放?通过分析每个维度对 attention 贡献的 2-norm 指标,DPE 发现大约只有一半的维度(约 48/128 维)在超出训练长度时会出现 OOD 失效,其余维度其实本来就不需要处理。因此只对这些“关键维度”的位置索引做选择性缩放,其余维度保持不变。这个方案完全无需训练,将 Llama3-8B 从 8K 扩展到 128K,在 RULER benchmark 上以 75.6 分超越了需要微调的 YaRN,集成到 Llama3.1-70B 后在部分任务上甚至超过了 GPT-4-128k。
FoPE:从频域视角重新审视 RoPE 的局限
论文:Fourier Position Embedding: Enhancing Attention's Periodic Extension for Length Generalization(Hua et al。, ICML 2025)
FoPE 指出了一个此前被忽视的问题:RoPE 的旋转向量经过 Transformer 的线性层和激活函数后,其频率成分会被“污染”,线性层的矩阵乘法会混合不同频率维度,激活函数会引入非线性谐波,导致模型实际利用的频率特性与 RoPE 设计时的假设出现偏差。FoPE 用傅里叶级数来构造更鲁棒的位置表示,使频率特性在网络深度方向上保持稳定。这个方向从信号处理的角度为 RoPE 的理论分析提供了新工具,也为后续工作打开了“频域设计 PE”的思路。
混合架构:用“局部有 PE,全局无 PE”绕开结构性矛盾
如果说上面这些工作还在 RoPE 框架内修修补补,那么另一批工作选择了一条更彻底的路:在同一个模型里,让一部分 attention 层保留 RoPE,另一部分完全不用 PE,用架构设计规避低频压缩的结构性矛盾。
RoPE-to-NoPE:全局 NoPE + 局部 SWA-RoPE
论文:Rope to NoPE and Back Again: A New Hybrid Attention Strategy(Yang et al。, Cohere,NeurIPS 2025)
这篇工作的出发点是:RoPE 和 NoPE 的能力是互补的。RoPE 擅长近距离位置区分(高频维度的精确旋转),NoPE 擅长长距离泛化(无显式位置约束,可以通过 causal mask 隐式处理任意距离)。Cohere 的研究者将两者交替堆叠:全局 NoPE 层(不带任何位置编码,直接 attend 全序列)+ 局部 SWA-RoPE 层(滑动窗口注意力,窗口内使用 RoPE)。
实验在 8B 参数、750B token 规模的模型上验证:hybrid 模型在 NIAH 测试中,将有效 context 从训练长度 65K 外推到 128K,得分 9.56 vs 纯 RoPE 的 7.40。纯 RoPE 在超出训练长度后立刻崩溃,而 NoPE 层的存在给了模型“忽略绝对位置限制”的能力。
SWAN-GPT:NoPE + SWA-RoPE 的工业级验证
论文:SWAN-GPT: An Efficient and Scalable Approach for Long-Context Language Modeling(Puvvada et al。, NVIDIA,2025)
SWAN-GPT 是 NVIDIA 对相同混合架构思想的独立验证和工程化推进。核心设计是:NoPE 全局层(无位置编码,看全序列)与 SWA-RoPE 局部层(512 token 滑动窗口 + RoPE)交替排列,并在 attention logit 上加入对数衰减缩放(\(\log\)-scaling)来稳定超长序列下的激活值。
关键结论是:NoPE 层单独使用时超出训练长度就失效,SWA-RoPE 层单独使用时也受限于窗口大小,但两者交替后,NoPE 层的位置感知能力被 SWA-RoPE 层的局部锚定效应所稳定,整体模型可以外推到 16× 训练长度(训练长度 1024,有效泛化到 16384),且在 LLM 标准 benchmark 上与完整注意力的模型持平。这个方向还有一个工程优势:SWA 的局部窗口把推理时的 KV cache 开销从 \(O(n)\) 压缩到 \(O(w)\)(\(w\) 为窗口大小),在长上下文推理上更经济。
回望这条路,想想下一步
1 | Sinusoidal PE(绝对位置,加法注入) |
每一个转折点背后都是同一个追问的深化:位置信息究竟是什么,它需要被显式表达吗,表达在哪里最合适? 从“加进去”到“旋转进去”到“惩罚进去”到“不加也行”到“训练完就丢”到“局部加全局不加”,这条路线展示的不只是技术进步,更是研究者对一个基础假设一次次的重新审视。
DroPE 和混合架构都还留下了一些开放问题,也是研究者可以切入的方向:
PE 退火 recipe 的通用性:DroPE 的再校准在“原始 context 长度”上做,只需 2B tokens。但这个结论依赖于“causal mask 可以恢复位置感知”,而这一点在 encoder-only 架构(BERT 类)或非 causal 的 decoder 里并不成立。全双向注意力下,causal mask 的隐式计数机制消失了,PE 退火是否还可行,目前还没有答案。
位置编码与注意力效率的联合设计:去掉 PE 之后,限制超长上下文的下一个瓶颈变成了 Attention 的 \(O(n^2)\) 计算复杂度和 KV cache 的显存占用。SWAN-GPT 的局部窗口已经部分解决了这个问题,但如何在保持语义头全局感知能力的同时彻底压缩 KV cache,仍是未解的工程难题。
对刚入门的研究者来说,这里有一个值得借鉴的研究模式:先引入一个归纳偏置加速收敛,然后分析它的边界和代价,最后找到在保留好处的同时去除限制的方法。 你当前觉得“缺了它就不行”的那个模块,不妨问一问,它在哪个阶段是必要的?训练完成后,它还必须在场吗?
参考文献
- Vaswani,A., et al. (2017). Attention Is All You Need. NeurIPS 2017. arXiv:1706.03762
- Su,J., et al. (2021). RoFormer: Enhanced Transformer with Rotary Position Embedding. arXiv:2104.09864
- Press,O., Smith,N. A., & Lewis,M. (2021). Train Short,Test Long: Attention with Linear Biases Enables Input Length Extrapolation. arXiv:2108.12409
- Haviv,A., et al. (2022). Transformer Language Models without Positional Encodings Still Learn Positional Information. arXiv:2203.16634
- Kazemnejad,A., et al. (2023). The Impact of Positional Encoding on Length Generalization in Transformers. NeurIPS 2023. arXiv:2305.19466
- Chen,S., et al. (2023). Extending Context Window of Large Language Models via Positional Interpolation. arXiv:2306.15595
- bloc97 (2023). NTK-Aware Scaled RoPE allows LLaMA models to have extended (8k+) context size without any fine-tuning and minor perplexity degradation. Reddit,r/LocalLLaMA.
- Peng,B., et al. (2023). YaRN: Efficient Context Window Extension of Large Language Models. arXiv:2309.00071
- Barbero,F., et al. (2025). Round and Round We Go! What Makes Rotary Positional Encodings Useful? ICLR 2025. arXiv:2410.06205
- Gelberg,Y., Eguchi,K., Akiba,T., & Cetin,E. (2025). Extending the Context of Pretrained LLMs by Dropping Their Positional Embeddings. arXiv:2512.12167
- Ding,Y., et al. (2024). LongRoPE: Extending LLM Context Window Beyond 2 Million Tokens. arXiv:2402.13753
- Wang,S., et al. (2024). Resonance RoPE: Improving Context Length Generalization of Large Language Models. arXiv:2403.00071
- Lu,Y., et al. (2025). Effective Length Extrapolation via Dimension-Wise Positional Embeddings Manipulation. arXiv:2504.18857
- Hua,E., et al. (2025). Fourier Position Embedding: Enhancing Attention's Periodic Extension for Length Generalization. ICML 2025. arXiv:2412.17739
- Yang,B., et al. (2025). Rope to NoPE and Back Again: A New Hybrid Attention Strategy. NeurIPS 2025. arXiv:2501.18795
- Puvvada,K. C., et al. (2025). SWAN-GPT: An Efficient and Scalable Approach for Long-Context Language Modeling. NVIDIA. arXiv:2504.08719