Kaelem

RoPE 的频率不是模型自己偏爱的,而是数据教出来的

·22 min read
AI论文解读TransformerRoPE长上下文

一句话概括:这篇论文把 RoPE 的“频率使用”从一个模型内部现象,改写成一个数据问题。RoPE 给模型一整排位置频率,但训练后的模型并不会平均使用它们;作者提出,模型会选择那些刚好能覆盖训练数据中相关距离的频率。依赖宽度是 W 时,最优可用频率按 1/W 缩放。位置插值之所以能扩展上下文,是因为把频率除以 α 等价于把视野扩大 α 倍;但代价是局部分辨率也粗 α 倍。所以它只在测试时依赖结构像训练依赖的“拉伸版”时真正有用。

图 1:RoPE 频率像一组不同焦距的位置镜头

先把几个概念放到桌面上

RoPE 可以先别理解成“给 token 加位置编号”。更贴近这篇论文的说法是:RoPE 给注意力层装了一组不同焦距的镜头。高频镜头看近处很清楚,两个相邻位置很容易分开;但它绕得快,距离稍远就会相位重复,容易把远处看混。低频镜头正好相反:看得远,不容易绕回去;但近处的细节分得粗。

依赖宽度 W,就是任务真正需要看的相对距离范围。预测下一个词可能主要依赖前几个词;追踪一篇文章里的实体,可能要跨句子、跨段落;数学题答案可能要回看题干里的多个条件。不同数据让“有用位置”落在不同范围里。

位置插值 PI,则像把所有镜头的焦距同时拉长:频率 θ 变成 θ/α,模型在更长上下文里看到的距离 r,会被表示成原来距离 r/α 的样子。听起来像免费扩窗,但问题是,拉长视野的同时,近处刻度也被拉粗了。

这就是论文的核心线索:长上下文不是看得越远越好,而是训练中学到的“位置镜头”,是否和测试时真正需要的依赖尺度对得上。

第一个反直觉:低频不是“语义维度”,仍然是位置维度

很多人看 RoPE 频率时,会自然产生一个解释:高频负责位置,低频负责语义。因为低频变化慢,在一个有限训练窗口里几乎不怎么变,看起来像“不关心位置”。

这篇论文首先拆掉这个直觉。低频并不是不表示位置。RoPE 的任意一个频率 θ,进入注意力分数时,仍然通过相对距离 r=i-j 产生 cos(θr) 和 sin(θr) 的变化。区别只是:高频的相位转得快,低频的相位转得慢。

作者用一个 score-level energy 来量化每个频率对原始注意力分数的贡献。对某个 RoPE 频率 θm,它对 query i 和 key j 的注意力分数贡献可以写成一个正弦项:a cos(θm(i-j)) + b sin(θm(i-j))。于是这个频率的能量可以用 a²+b² 的期望来度量,再归一化成频率能谱。

这个度量的意义是:它不是只看 Q/K 向量某些维度的范数,而是直接问“这个频率实际给注意力分数贡献了多少”。作者在 Qwen2.5-1.5B 上比较 Alpaca 和 GSM8K,发现随机初始化时频率能量接近均匀;训练后能量明显集中到低频区域,并且在不同 prompt、不同数据域上相当稳定。附录里对 Llama-2-7B 复现实验,也观察到类似的低频集中和跨输入稳定性。

这说明至少有三件事:频率偏好不是 RoPE 架构天然写死的;也不是每条输入临时决定的;它更像训练后写进 Q/K 权重里的位置归纳偏置。

数据怎么“推”频率:宽依赖选择低频

图 2:依赖宽度越大,可用 RoPE 频率越低

接下来真正关键的问题是:训练到底学到了什么,才会把能量推到某些频率上?

论文做了一个很干净的合成实验。序列长度固定为 4096。每条序列被切成长度为 B 的隐变量块,每个块的隐变量从 中均匀采样;观测 token 是这个隐变量加上单位高斯噪声。任务也固定:模型在当前位置 t,要预测 t-16 位置的 token。也就是说,预测 offset 没变,序列长度没变,唯一变化的是块长度 B。作者让 B 取

为什么这个设置有用?因为 B 控制了数据里的相关距离。两个位置如果在同一个块里,就共享同一个隐变量;距离越大,还在同一块里的概率越低;超过 B 后,这种块内相关性基本消失。因此这个数据的依赖宽度就是 W=B。

作者训练一个两层、单头、attention-only 网络,然后测第二层 RoPE 频率能谱。结果符合一个非常简单的规律:B 越大,模型使用的有效频率越低。把有效频率拟合成 c/B,得到 c=3.02,接近理论里的常数 π。

这组数字很重要,因为它排除了很多混杂解释。不是“长序列导致低频”,因为序列长度一直是 4096;不是“任务 offset 变远导致低频”,因为 offset 一直是 16;被单独拨动的旋钮就是数据相关性持续的宽度 B。

论文随后用更像文本的数据做第二个验证:iGSM。它是可控生成的小学数学题数据,作者改变 operations 数量 ops∈。ops 越大,问题和推理链越长,依赖分布越往长距离移动。作者训练 12 层 GPT-style Transformer,并测每层每头的 log-mean effective frequency。结果同样是:依赖变宽,RoPE 使用向低频移动。

这里不要把结论读过头。论文不是说自然语言只有一个最优频率。恰恰相反,自然语言有局部搭配、短语结构、句子级依赖、篇章级实体追踪等多个尺度,所以它更像许多依赖宽度的混合。理论给出的不是“语言应该用某一个 θ”,而是一个尺度规则:宽依赖偏低频,窄依赖偏高频;多尺度数据会产生一个频率能量带。

理论的骨架:镜头必须先覆盖,再尽量清楚

论文的理论部分其实很像摄影。

对一个频率 θ,RoPE 用 (cos θr, sin θr) 表示相对距离 r。作者定义位置对比度 Dθ(r)=1-cos(θr)。这个量越大,说明频率 θ 越能把距离 r 和距离 0 区分开。

高频的好处是分辨率高。达到某个对比阈值 τ 所需的最小距离,是 arccos(1-τ)/θ。θ 越大,这个距离越短,近处越容易分清。

但高频的坏处是视野短。因为 cos 会周期性回绕,作者把频率 θ 的无歧义视野定义为 F(θ)=π/θ。在 [0,π/θ] 里,距离越大,对比度越大;超过这个范围后,对比度开始下降,不同距离可能混在一起。

于是任务给出一个依赖宽度 W 后,一个频率想要有用,首先必须覆盖整个相关区域:F(θ)≥W,也就是 θW≤π。在所有满足覆盖条件的频率里,哪个最好?答案是最高的那个可用频率。因为在还没有相位回绕之前,θ 越大,平均位置对比度越强。

这就是 Theorem 1:如果依赖核 K 支持在 [0,W] 上,且不全在 0 点,那么平均位置对比度 U(θ;K) 在可用集合 θW≤π 内严格递增,唯一最大值在 θ*=π/W。

翻译成人话就是:镜头必须先看完整个相关区域;在看得完整的前提下,尽量用更高分辨率。相关区域越宽,能安全使用的最高频率就越低。因此 θ* 按 1/W 缩放。

这个理论解释了为什么“低频有用”不等于“低频更语义”。低频有用,是因为某些数据依赖本来就跨更宽的位置范围。模型不是在频率表里凭空偏爱低频,而是在训练分布反复奖励那些既不相位混叠、又能提供足够位置对比的频率。

位置插值为什么有时有效:它保留的是尺度关系,不是能力本身

图 3:位置插值扩大视野,同时牺牲局部分辨率

长上下文扩展里常见的操作是位置插值:把 RoPE 频率从 θ 改成 θ/α,让模型从长度 L 用到 αL。

论文用同一个视野-分辨率框架解释它。频率变成 θ/α 后,视野 F 从 π/θ 变成 απ/θ,也就是扩大 α 倍。与此同时,达到同一对比阈值所需的分辨率长度,也从 Δτ(θ) 变成 αΔτ(θ)。也就是说,所有位置刻度都被放大了。

这一步经常被说成“把外推变成插值”:长序列里的距离 r,在缩频后看起来像原频率下的 r/α。这句话没错,但还缺一半:插值不等于一定泛化。它只是把坐标缩回训练尺度;如果测试时真正需要的依赖结构,也刚好是训练依赖结构沿位置轴拉伸 α 倍,那么缩频会保留原来学到的频率用途。否则,它可能把模型从正确位置推开,或者把需要精确局部对齐的任务变糊。

论文把这个条件形式化为自相似:长上下文依赖分布 PαW 是短上下文依赖分布 PW 经过 r→αr 的推前分布。Theorem 2 说明,在这个条件下,U(θ/α,αW)=U(θ,W)。也就是说,短上下文里有用的频率 θ,缩放后在长上下文里同样有用。进一步的推论是,训练尺度的最优频率 θW,缩放成 θW/α 后,就是长尺度 αW 的最优频率。

注意这个结论的边界很窄:它证明的是“当依赖结构自相似时,PI 保留位置对比效用”。它没有证明“PI 对所有长上下文任务都有效”,也没有证明“低困惑度就等于长程推理成功”。

成功与失败的分界:语言像拉伸,算术像局部对齐

图 4:PI 成功的条件是依赖结构自相似

论文用三个实验来展示这个边界。

第一个是 key-value retrieval。训练长度 n=8 时,模型要从 x1,y1,...,xn,yn,xquery 中找目标标签。目标设在中间位置 xn/2+1。问题是,在 n=8 时,“找中间 pair”和“从 query 往前固定 offset 找”这两种策略是不可区分的。测试时把 n 扩到 16,二者才分开。

结果是:不做 PI,模型更像保持固定 offset;做 PI 且 α=2,注意力被拉向更长序列的中间区域。因此,如果长测试任务的正确答案仍是固定 offset,PI 反而伤害;如果正确答案是对应的中间位置,PI 才帮忙。这个实验没有把 PI 神化,而是把它放回条件句里:依赖随上下文长度拉伸,PI 有用;依赖不拉伸,PI 可能错。

第二个是自然语言。作者在 Nemotron-ClimbMix 预训练数据上估计 token 之间随相对距离变化的互信息。为了近似“尺度拉伸”,他们训练不同词表大小的 BPE tokenizer:词表越大,token 越粗,同一文本跨度会变成更少 token。结果显示,不同 tokenization 粒度下的互信息 profile 形状相似。论文据此认为,自然语言依赖具有近似自相似,这为 PI 在自然语言长上下文上常常有效提供了数据侧解释。

第三个是反例:算术。作者用 Llama-2-7B,在由 1 到 5 位数四则运算表达式串接而成的数据上测试 PI。模型原始上下文长度是 4096;测试长度包括 2048、4096、8192、16384。任务评价不是自由生成,而是 teacher-forced 单次前向,对答案 span 做 exact answer-token accuracy,最终结果平均于 100 条随机序列。

这里的依赖结构不自相似。长上下文只是塞进更多独立算式,每个算式内部仍需要精确局部对齐;并不是“同一个依赖图被拉长”。所以 PI 扩大视野的同时牺牲局部分辨率,不能真正保住算术能力。

论文的困惑度表很能说明陷阱。算术任务上,不做 PI 的 Llama-2-7B 在 [0,2048) 与 [2048,4096) 的 perplexity 是 2.09 和 2.05,超过训练上下文后大于 100。做 8192 PI 后,[4096,8192) 降到 4.39;做 16384 PI 后,[8192,16384) 是 15.38。看起来困惑度改善很多。但作者指出,16k 位置附近答案 token 的 perplexity 约为 16,甚至差于对 0-9 数字均匀猜测的 perplexity 10。也就是说,模型整体似乎更会“接着写”,但没有恢复精确答案能力。

作为对照,Chen et al. 报告的自然语言 PI 结果里,Llama-7B 从 2048 扩到 8192、16384 后,长窗口 perplexity 仍接近 7:例如 16384 PI 在 [8192,16384) 是 6.83。这和算术的 15.38 形成明显对比。论文想说明的不是“PI 无效”,而是“PI 的有效性取决于数据依赖的尺度结构”。

这篇论文真正证明了什么,又没有证明什么

它证明了四件相对清楚的事。

第一,RoPE 频率使用可以用注意力分数层面的能量来衡量;在 Qwen2.5-1.5B 和 Llama-2-7B 的实证中,训练后频谱高度非均匀,并且跨输入稳定。

第二,在受控 block 数据中,单独扩大依赖宽度 B,会把学习到的有效频率推向低频;拟合常数 c=3.02 接近理论 π。iGSM 的 ops∈ 变化也支持“宽依赖→低频”的方向。

第三,理论上,如果任务相关依赖支持在 [0,W],并要求频率视野覆盖这个范围,那么平均位置对比度的最优可用频率是 π/W。这给出了 RoPE 频率选择的尺度匹配原则。

第四,PI 可以被解释成视野扩大与分辨率降低的交换;当测试依赖是训练依赖的尺度拉伸时,频率缩放保留效用;当任务需要不随上下文拉伸的精确局部对齐时,PI 可能只改善困惑度,而不恢复真正能力。

它没有证明的也同样重要。

第一,它没有给出一个可以直接替代所有 RoPE scaling heuristic 的工程算法。论文最后提到未来可以用测得的依赖宽度和频谱来指导频率网格、缩放 schedule 与评测,但这还不是一个完整系统。

第二,它没有证明自然语言在所有层面都严格自相似。论文给的是互信息 profile 在不同 tokenization 尺度下近似相似,以及与已有 fractal pattern 工作一致的证据。严格自相似只是理论条件,现实语言只是近似满足。

第三,它没有说明所有低频能量都来自长程语义依赖。自然语言是多尺度混合,模型内部还有层、头、数据混合、训练目标等复杂因素。本文给的是一个数据中心的机制解释,不是排除其他机制的最终定论。

Big Picture:长上下文扩展应该从“缩放公式”回到“数据尺度”

这篇论文最有价值的地方,不是又提出一个 RoPE trick,而是把问题的主语换了。

过去我们常问:RoPE base 应该怎么设?频率应该线性缩放、NTK-aware 缩放,还是 YaRN 式分段缩放?这些问题都把注意力放在编码公式上。本文提醒我们:同一个公式,在不同训练数据上会学出不同频率使用;同一个缩放,在不同测试依赖结构上会得到完全不同的泛化结果。

如果训练数据主要奖励宽范围依赖,模型自然会把能量放到更低频;如果测试数据的长依赖只是训练依赖的放大版,PI 就像把学到的镜头搬到新尺度上;如果测试任务需要不被拉伸的局部精确对齐,扩窗就会变成模糊化。

这给长上下文评测也提出一个警告:只看 perplexity 不够。语言建模困惑度可能被局部流畅性支撑,而真正的长程能力要看目标依赖是否被正确对齐。算术实验里,PI 把长窗口 perplexity 从大于 100 拉回到十几,却仍然没有恢复精确答案能力,就是这个警告最直接的版本。

更长的上下文窗口当然重要。但这篇论文的结论更像一句工程箴言:不要只问模型能看多远,要问数据让它学会了看哪种距离,以及测试时需要看的距离是否只是同一种结构的放大。RoPE 的频率表一直在那里;真正决定哪一格会亮起来的,是训练数据里反复出现的依赖尺度。