RoPE 的注意力只看到相对角度 (m−n)θj。序列超过训练长度后,直接外推会把角度推到训练分布之外;
Position Interpolation 把位置压回原区间,代价是所有频率一起被压扁。YaRN、LongRoPE 和 DCA 分别从频率分组、逐维搜索和注意力矩阵三条路修正这一点。
页面把「标称长度」和「有效长度」分开看。
RoPE 的 attention score 只依赖相对距离 (m−n)θj。训练长度 L 之外的角度没有在预训练中出现,
直接外推的 PPL 可以超过 103(PI §2.2)。PI 的做法是把位置 m 压成 mL/L′,
让最大角度回到训练区间;论文给出的插值误差上界至少比外推上界小 600×(PI §2.3,LLaMA 7B 设定)。
统一缩放的问题是所有频率一起被压。NTK-aware 改 base,让高频维度少压、低频维度多压;YaRN 用波长比 r=L/λ 做分段 ramp,
再给 attention logits 加一个温度 1/t;LongRoPE 把每个维度的缩放因子 λi 和起始 token 数 n̂ 变成搜索变量,
再用渐进式扩展把 256k 推到 2048k。DCA 不走频率缩放,它把相对位置矩阵按 chunk 重写。
标称长度不等于有效长度。LongRoPE 报告 2048k 的目标窗口,但 passkey 在 2048k 处并非所有模型都能保持; LongRoPE2 用 RULER 把「有效」单独量出来:LLaMA3-8B 在 128k 处平均分 82.03,同一张 LongRoPE2 Table 2 里 LongRoPE 为 73.40。 短上下文保持是第二条轴:扩得越远,越需要单独回收 4k/8k 的能力。
读完这节应知道:RoPE 的注意力只看相对角度;训练长度之外,角度分布变了;把所有位置压回原区间能稳住数值,但会让相邻 token 的差异变小。
RoPE 对 query 和 key 做旋转。取位置索引 m、n,第 j 个频率对的角度是
(m−n)θj,其中 θj=b−2j/D、b=10000
(YaRN §2.1)。这也意味着 attention score 只看相对距离 s=m−n,与绝对位置无关。
预训练时 s≤L;推理超过 L 后,sθj 落到了训练时没覆盖的相位上。
PI §2.2 把直接外推的失败写得很直白:模型在比训练长度更长的序列上,PPL 可以冲到
103 以上,接近未训练模型。论文的解释是三角基函数可以拟合
[0,L] 内的任意形状,但外推区间没有约束,RoPE 原始上界可能非常松。
PI §2.3 于是改看插值误差:把位置压回 [0,L] 后,误差上界至少比外推上界小
600×(PI §2.3,LLaMA 7B 设定)。
第二个问题不是数值爆炸,而是分辨率。PI 把所有位置除以 s,相对距离从 s 变成
s/s′;高频维度本来负责区分邻近 token,压缩后相邻 token 的旋转角差变小。YaRN §3.1 把这个现象描述为
high frequency information 的损失;YaRN §3.2 进一步把它归因于局部相对距离被压扁。
还有第三个不对称:不同维度的波长不同。低维(高频)在训练长度内转很多圈;高维(低频)可能连一个完整周期都没走完。
LongRoPE2 §2.1 举了 Phi3-mini 的例子:训练长度 2048,
最高维的周期是 51861,在训练长度内覆盖不到 4% 的完整周期。
LongRoPE2 §2.2 把这类维度称为 OOD 维度。因此「哪些维度该压、压多少」不能用一个统一的 s 回答推断(由 LongRoPE2 §2.1 的周期覆盖与 LongRoPE2 §2.2 的 OOD 维度定义推得)。
把这三个问题放在一起,就能理解后面的方法为什么都在改写同一个映射:位置怎么缩放,以及每个频率缩放多少。 标称长度只是目标;能不能在目标距离上检索到信息,是另一个指标。PI §3.3 把 effective context window 定义为 token 能有效 attend 的最大距离,这一定义在后面被 passkey 和 RULER 反复使用。
两条前路:一条是在长序列上直接继续训练,另一条是把位置统一缩回原区间。前者学得慢,后者有效但牺牲高频分辨率。
PI §1 报告:直接微调超过 10000 个 batch,有效窗口只从 2048 移到 2560。 PI §2.2 的直接外推 PPL 可以超过 103。
原因不是训练不够,而是新位置的角度不在预训练分布里;继续用 next-token loss 去学,收敛很慢推断(由 PI §1 的 10000 个 batch 实验与 PI §2.2 的外推讨论推得;原文没有把「训练不够」单独列为原因)。 论文把这一现象归因于直接外推没有把角度约束回训练区间(PI §2.2)。
PI §2.3 定义 f′(x,m)=f(x,mL/L′)。位置区间从 [0,L′) 压回 [0,L),
相对距离也按同比例缩小。论文给出插值误差上界,并称它至少比外推上界小
600×(PI §2.3)。
代价是高频维度被一起压缩:短上下文 PPL 退化 0.01–0.05(PI §3.2); 扩到 8192 的 7B/33B 模型在原上下文基准上最多退化 2%, 32768 等更长窗口退化更多(PI §3.4;数字见 PI Table 5)。PI Table 5 未转录,本页只引用 §3.4 的 2% 结论。
PI 在工程上很轻:不改架构,1000 步微调就能把 LLaMA 从
2048 扩到 32768(PI §3.1)。
但它留下两个问题:所有维度同一个 s,不合理;位置压缩后,局部顺序信息变弱。
NTK-aware 先改了第一个问题。
NTK-aware 最早在社区提出(YaRN 引用 bloc97 的 Reddit 帖),YaRN §3.1 给了方法定义,
形式化版本在 YaRN Appendix A.2 Def.3:把 base 从 b 改成 b′=b·sD/(D−2),等价于每个维度乘上不同的缩放。
高频维度几乎不动,低频维度压得更多。
YaRN Appendix A.2 也指出它的缺点:部分维度会被推到 out-of-bound,微调效果可能不如 PI; 因此它更适合不微调的场景,而不是作为最终方案。下面的 YaRN 把「分段」和「温度」补上。
所有方法都能写成 f′(x,m,θ)=f(x,g(m),h(θ)):PI 只改 g,NTK-aware 只改 h,YaRN 同时改 h 和 attention 温度,LongRoPE 把 h 变成逐维搜索,DCA 则绕开 h 去改相对位置矩阵。
表 1 · 统一形式下各方法的 g 与 h(据 YaRN §3.1–§3.3、LongRoPE §3.1、DCA §3 整理)
| 方法 | g(m) | h(θj) | 是否训练 | 备注 |
|---|---|---|---|---|
| PI | m/s |
θj |
需要(短步数) | 所有维度同比例压缩(PI §2.3) |
| NTK-aware | m |
θj·s−2j/(D−2) |
可不训练 | 等价于改 base;部分维度 out-of-bound(YaRN Appendix A.2;形式化定义见 YaRN Appendix A.2 Def.3) |
| NTK-by-parts | m |
(1−γ)θj/s + γθj |
需要 | γ 由 r=L/λ 决定;α=1、β=32(YaRN §3.2 Def.1) |
| YaRN | m |
同 NTK-by-parts,另加温度 1/t |
需要 | √(1/t)=0.1ln(s)+1(YaRN §3.3 Def.2) |
| LongRoPE | m(n<n̂ 的位置不缩放) |
θj/λj,λj 逐维搜索 |
需要 / 渐进 | λj≤λj+1;n̂ 也搜索(LongRoPE §3.1 Eq.3;搜索空间见 LongRoPE Table 4) |
| DCA | 分块位置矩阵(非单一 g) | 不缩放 θ | 不需要 | intra / inter / successive 三种相对位置(DCA §3.1–§3.3) |
PI 的 g(m)=m/s,h(θ)=θ。位置 m 变成 m/s,
所有维度的有效波长都乘以 s。它不引入新参数,也不改模型结构;代价是高频维度也一起被拉长,
相邻 token 的旋转角差变小。PI §2.3 的定理 2.1 给的是插值误差上界:在已知网格点之间做线性插值,
误差由 (s−s1)(s2−s) 控制;外推没有这个夹逼区间,上界只能靠三角和估计。
NTK-aware 不动位置,只改频率。YaRN §3.1 的定义是
g(m)=m、h(θj)=b′−2j/D,其中
b′=b·sD/(D−2)。把 b′ 代回去,等效于
θj·s−2j/(D−2):j 越大(频率越低),缩放越重;
j 越小(频率越高),几乎不缩放。这样高频分辨率保住了一部分,
但 YaRN Appendix A.2 指出部分维度会被推到 out-of-bound;微调时这些维度可能反而拖后腿。
NTK-by-parts 先算每个维度的波长 λj=2π/θj,再算比值
rj=L/λj。YaRN §3.2 用两个阈值 α、β 把维度分成三段:
r<α 的维度做完整线性插值(θj/s);
r>β 的维度完全不插值(保留 θj);
中间的维度用 ramp γ(r)=(r−α)/(β−α) 做线性混合:
h(θj)=(1−γ)θj/s+γθj。
对 Llama 系列,YaRN §3.2 给的取值是 α=1、β=32。
把 r=L/λ 代进去:低维(高频)的波长短,r 大,落在 r>β 一侧,
不插值;高维(低频)的波长长,r 小,落在 r<α 一侧,完整插值。
这正好对应「高频保留局部顺序、低频把远端压回训练区间」的分工推断(由 YaRN §3.2 的 r<α / r>β 分段定义与 YaRN §3.1 的高频损失讨论推得)。
YaRN 的定义 2 是 NTK-by-parts 加一个温度:把 softmax 前的 logits 改成
qTk/(t√D)(YaRN §3.3 Eq.14)。实现上不需要改 attention 代码:
把 query 和 key 都乘上 √(1/t),等价于把 RoPE 的复数嵌入整体缩放,RoPE 又是预计算复用的,
因此论文称零额外推理开销(YaRN §3.3)。
温度不是一个从第一性原理推出来的常数,而是用「最低 PPL」拟合出来的经验式(YaRN §3.3)。 它的作用是把长上下文下的 attention 分布整体压平或锐化;论文报告它在不同数据样本和 token 位置上有一致的 PPL 影响(YaRN §3.3;实验见 YaRN Appendix A.3)。
下面的探针只取一个频率维度 j,令 q=k=(1,0),于是该维的 score 就是
cos(d·θeff);YaRN 再乘以 1/t(即除以 t)。切换 PI / NTK-aware / YaRN,
拖动缩放因子 S、维度 j 和相对距离 d,可以看到同一距离下
不同策略把有效频率压到了多少。图上的曲线是 score 随 d 的变化;
高频维度在图上会很密,读数以探针值为准。
探针参数:L=4096、D=128、b=10000、α=1、β=32;
θj=10000−2j/128。L=4096 与 D=128 是页面为 LLaMA 2 风格探针选定的设定,不参与论文结论。
静态公式与参数来源:PI 的 g(m)=m/s 见 PI §2.3;NTK-aware 的 base 替换见 YaRN §3.1;
YaRN 的 r、γ ramp 与 α=1、β=32 见 YaRN §3.2;
温度 1/t 见 YaRN §3.3。探针是简化模拟,不是源码还原;覆盖与未覆盖的分支见下面的折叠块。
组 A:PI,S=16,j=32,d=2048
θ32 = 10000−64/128 = 0.01 rad/token。θeff = 0.01/16 = 0.000625。angle = 2048 × 0.000625 = 1.280000 rad。score = cos(1.280000) = 0.286715,按 4 位小数显示为 0.2867。组 B:YaRN,S=16,j=32,d=2048
r = L/λ = 4096 × 0.01 / (2π) = 6.518986;γ = (6.518986 − 1)/(32 − 1) = 0.178032。θeff = 0.01 × ((1 − 0.178032)/16 + 0.178032) = 0.002294048,按 6 位小数显示为 0.002294。angle = 2048 × 0.002294048 = 4.698211 rad。1/t = (0.1 ln 16 + 1)2 = 1.631390227;cos(4.698211) = −0.014177531;score = −0.014177531 × 1.631390227 = −0.023129086,按 4 位小数显示为 −0.0231。两组都只做乘法、除法、cos 和 ln;JS 用同一公式。显示位数:θeff、angle 与 γ 6 位小数,score 4 位小数。 手算中间值保留更多位,最后按同一精度四舍五入。NTK-aware 走同一段乘除,没有单独列第三组。
覆盖:PI 的 g(m)=m/s;NTK-aware 的 base 替换
b′=b·sD/(D−2);YaRN 的 r、γ ramp、h(θ)
和温度 1/t;单个频率对 j 的相对距离 d;
分数按 cos(d·θeff) 计算,YaRN 再乘以 1/t(即除以 t)。
未覆盖:64 个频率的求和、q/k 的具体内容、softmax 分母、√D 归一化、多头、
KV cache、Dynamic Scaling、LongRoPE 的逐维搜索、DCA 的分块注意力、微调过程。
探针把 q=k=(1,0),所以分数只是单频余弦,不是完整 attention。
因此它是简化模拟,不是源码还原。手算覆盖 PI 与 YaRN 两组;NTK-aware 用同一段乘除。
LongRoPE 把 PI/NTK/YaRN 里的「人手规则」换成搜索。它给每个 RoPE 维度一个独立的缩放因子
λi,再加一个 token 位置阈值 n̂:n<n̂ 的位置保持不变,
从 n̂ 开始除以 λi(LongRoPE §3.1 Eq.3)。
论文正文写的是「initial n̂−1 token positions」,而 Eq.3 的条件是 n<n̂;
两者相差一个边界 token,页面按公式写 n<n̂。
这样同时利用两种非均匀性:不同维度压不同倍数,序列开头的 token 少压。
搜索空间在 LongRoPE Table 4(LongRoPE §3.2):λi 从 1.0 到 s×1.25、
步长 0.01;n̂ 从 {0, 1, 2, 4, 8, 12, 16, 20, 24, 28, 32, 64, 128, 256} 里选。
搜索用 evolution search,并强制 λi≤λi+1,让低维(高频)少压、高维(低频)多压。
论文报告 s=4× 时搜索空间有 4×10167 种组合(LongRoPE §3.2);
在 LLaMA2 上,这种非均匀插值可以做到 8× 的无微调扩展(LongRoPE §1),这也是渐进式扩展把 256k 推到 2048k 的基础。
结果分两段。先在预训练模型上搜 128k/256k 的因子:128k 训 400 步,换 256k 因子再训 600 步; 然后在 256k checkpoint 上做第二次搜索,把窗口推到 2048k,最后扩展比是 512×(LongRoPE §3.3)。渐进式扩展的关键是:第二次搜索用已经适应过长上下文的模型, 不需要在 2048k 长度的文本上直接微调。
LongRoPE 还做了一次短上下文回收:在扩展后的模型上再搜 4k/8k 的因子,推理时按序列长度切换。 没有回收时,Proof-pile 4k PPL 是 4.16,回收后是 3.71;平均基准分从 49.3 到 52.9(LLaMA2-7B-2048k,ft=128k;LongRoPE Table 10)。
Dual Chunk Attention 走的是另一条路:不缩放位置,也不改 θ,而是把长序列切成小于预训练长度的 chunk,
重写 query/key 的相对位置矩阵(DCA §3)。它有三个部分:intra-chunk、inter-chunk、successive-chunk。
0..s−1 循环,query 用同一套位置;
这相当于把每个 chunk 当成一个短序列,PPL 低,但看不到其他 chunk(DCA §3.1)。c−1,保证 query 的位置大于所有 key(DCA §3.2)。这样能聚合远处信息,但相邻 chunk 的相对距离会失真。w=c−s,把 query 的前
w 个位置设成 c−w..c−1,其余仍是 c−1(DCA §3.3)。
这样相邻 token 的距离不会被 inter-chunk 的常量位置拉平。
以 DCA §3.3 的例子:c=10、s=6、w=4,inter-chunk 的 query 位置是全 9,
successive-chunk 的前四个位置改成 6,7,8,9。DCA 不训练,但改的是 attention 的计算方式;
它不是 h(θ) 轴上的方法,表 1 单列一行只是为了对照。
PI、YaRN、LongRoPE 都不改模型结构;训练步数从千步降到几百步,LongRoPE 用两段微调把 256k 推到 2048k。DCA 走另一条路:不训练,但要改 attention 的分块计算。
推理侧的共同点是「只改位置」:PI 不改架构(PI §2.3);YaRN 的温度在 RoPE 生成时预先算好, 论文称零额外推理开销(YaRN §3.3);LongRoPE 只改 RoPE 因子(LongRoPE §1)。DCA 是例外:它改 attention, 需要 Python 层的 monkey patch,但论文报告显存和速度与 FlashAttention 接近(DCA §4.4)。
搜索本身也有成本。LongRoPE 的搜索空间在 s=4× 时有 4×10167 种组合(LongRoPE §3.2), 因此用 evolution search:种群 64、mutation/crossover 各 16、迭代 40 次、每轮 top- 32。LongRoPE2 把搜索目标换成 needle-driven PPL(LongRoPE2 §3.2)。 这些是离线成本,不进入推理路径。
LongRoPE 的渐进式扩展和 YaRN 的短数据训练说明训练长度不必等于目标长度;但最后一步必须是有效长度验收,而不是看标称值。
s=L′/L,再选择 g(m) 和
h(θ):PI 全压、NTK-aware 改 base、YaRN 分段加温度、LongRoPE 逐维搜索。
这一步决定后面微调能不能收敛(YaRN §2.2、LongRoPE §3.1)。
这五步的顺序不是固定的:DCA 跳过第 3 步,直接在推理时改相对位置矩阵;PI 则可以把第 2 步省掉,
因为它不需要搜索,只需要一个固定的 s。共同点是第 4 步不能省:标称窗口是目标,
不是可用性的证明。
同一张表里既有训练-free 的 PPL,也有微调后的 passkey 和 RULER;条件和分母都跟着数字写,不能把 2048k 的标称值当成每个任务都能用满。
表 2 · 各论文报告的代表性结果;每行的数据集、模型和出处不同,不能横向相减
| 方法 | 模型 / 设定 | 训练 | 目标 | 报告数字 | 出处 |
|---|---|---|---|---|---|
| Direct FT | LLaMA-7B | 10000 batches | 8192 | 有效窗口 k_max 2560 | PI Table 4 |
| PI | LLaMA-7B | 1000 steps | 32768 | 200 步时 k_max 32768 | PI Table 4 |
| YaRN s=32 | Llama-2-7B | 400+200 steps,64k 段 | 128k | Proof-pile PPL 2.37 at 131072 | YaRN Table 1(PPL);训练步数见 YaRN §4.1 |
| LongRoPE ft=256k | LLaMA2-7B | 400+600 steps | 2048k | passkey ≥90% 到 2048k | LongRoPE §4.2(passkey);训练步数见 LongRoPE §3.3 |
| DCA | Llama2-70B | 0 steps | 192k | PPL 5.59 at 64k | DCA Table 1(PPL);目标 192k 见 DCA Table 2 |
| LongRoPE2 | LLaMA3-8B | 10B tokens | 128k | RULER 平均 82.03 at 128k | LongRoPE2 Table 2(RULER);训练 10B tokens 见 LongRoPE2 §1 |
PI 的 passkey 结果很直接:LLaMA-7B 目标 32768,200 步时 k_max 就到
32768(PI Table 4)。同一张表里,7B/8192 的直接长训 10000 个 batch 只到
2560。但 PI Table 4 的 7B/32768 行在 600 步一格是
18432,其余步数是 32768;论文正文没有解释这一格,页面照表并列。
长序列语言建模也随窗口变长而改善:PG19 上 7B/32768 模型在 32768 处的 PPL 是 6.77(PI Table 1)。代价在短上下文:Proof-pile 上 PI 模型在 2048 处 PPL 退化 0.01–0.05(PI §3.2);扩到 8192 的 7B/33B 模型在原上下文基准上 最多退化 2%,32768 等更长窗口退化更多(PI §3.4;数字见 PI Table 5,该表未转录)。 两个窗口大小都出现在 PI §1,32768 的训练设定见 PI §3.1;页面不把它们的比值当作实验提升。
YaRN 的 s=32 模型在 64k 段上微调,却在 131072 处得到 2.37 的 Proof-pile PPL;同一列里 65536 处是 2.45、98304 处是 2.36 (YaRN Table 7;131072 处的 2.37 亦见 YaRN Table 1)。passkey 在 8k 到 128k 的整个窗口内准确率在 99% 以上(YaRN §B.5)。YaRN §4.2 的设定是:模型只用 64k 训练数据,128k 上下文仍能外推;短上下文基准另有小幅波动(YaRN Table 3)。
LongRoPE 报告的目标窗口是 2048k(LongRoPE §1),微调总步数约 1k,训练长度在 256k 以内(LongRoPE §3.3)。在 Proof-pile 上, LLaMA2-7B ft=128k 在 262144 处的 PPL 是 1.88(LongRoPE Table 5); 在 Books3 上,2048k 处的 PPL 是 7.80(ft=128k)与 7.08(ft=256k;LongRoPE Table 6)。
passkey 更接近「有效」:LLaMA2-2048k(ft=256k)在 4k 到 2048k 维持 ≥90% 的检索准确率;Mistral-2048k(ft=128k)在 1800k 之前是 100%,到 2048k 降到 60%(LongRoPE §4.2)。 同一篇论文还报告:LLaMA2 在 256k 微调更好,Mistral 在 128k 微调更好(LongRoPE §4.2)。 两个结论针对不同模型,页面并列保留,不合并成一个最优设置。
短上下文回收的收益可以直接看 LongRoPE Table 10:4k PPL 从 4.16 降到 3.71,平均基准从 49.3 到 52.9(LLaMA2-7B-2048k,ft=128k)。LongRoPE Table 10 的 recovery 消融把这两件事分开测量。
DCA 的 ChunkLlama2-70B 在 4k 处 PPL 是 5.24,64k 处是 5.59(DCA Table 1),96k 处是 5.80, 192k 处是 7.05(DCA Table 2)。7B 版本在 32k 处 PPL 是 7.89,比 4k 的 7.87 高 0.02;到 64k 就升到 15.87。 这里 0.02 是 7.89 − 7.87 的差值,口径是 PG19 PPL 的绝对差。 两个模型规模的 PPL 曲线不同(DCA Table 1、DCA Table 2)。
实际任务上,ChunkLlama2-70B 的 few-shot 平均分是 37.8 (DCA Table 3:✗、4k 训练上下文、0 步训练);LongLoRA-70B 是 37.2(DCA Table 3:✓、32k)。DCA §4.3 注明 LongLoRA 用 LoRA 在 RedPajama 上训练 1000 步以支持 32k;两者条件不同,不能当作同条件对比。
LongRoPE2 在 LLaMA3-8B 上把 RULER 128k 平均分做到 82.03, 同一张 LongRoPE2 Table 2 里 LongRoPE 是 73.40;两者相差 8.63 个百分点(82.03 − 73.40,绝对差)。短上下文侧, LLaMA3-8B 保留 98.6% 的原始性能,Phi3-mini 保留 97.6%(LongRoPE2 §4.2)。这组结果把「长上下文变好」和 「短上下文不掉」分开报告。
把适用边界写清楚:标称窗口是训练目标,不是每个任务都能用满;频率映射和搜索因子都不是模型无关的常数。
c−1,
相邻 chunk 的相对距离会失真;successive-chunk 只用局部窗口 w=c−s 补回来(DCA §3.2、DCA §3.3)。
它不缩放 θ,也不训练。DCA Table 1 与 DCA Table 2 里,70B 在 192k 处 PPL
7.05,7B 在 64k 处已经 15.87。
如果只需要把窗口扩大、能接受短步数微调,PI 是最小改动;如果高频局部顺序不能丢,优先考虑 NTK-by-parts 或 YaRN;如果目标远大于训练长度、又不想在目标长度上直接微调, LongRoPE 的渐进式搜索更合适;如果完全不能训练,DCA 的分块注意力是一条可部署的路径, 但要注意 DCA Table 1 与 DCA Table 2 里 7B/70B 的 PPL 曲线并不相同。无论走哪条路,验收都要看有效上下文,而不是标称窗口。