技术博客

训练长度与外推长度的鸿沟:长程依赖真的被学到了吗

第 91 / 147 篇 · 2026-03-05 · ai · 长上下文位置编码评估方法

"这个模型外推到 128k 了"——这类说法里藏着两个被混为一谈的问题:位置编码在 128k 上取值是否合法,和模型在 128k 上会不会用远距离信息。前者 YaRN 一类缩放技术就能修,后者没有免费午餐。这篇讲这道鸿沟的成因和判定方法。

两件事分开:定义域 vs 能力

设模型在长度 $L$ 上训练。外推失败有两个独立来源:

$$ \underbrace{\text{PE 失效:}}_{\text{位置取值越出训练分布}} \qquad \underbrace{\text{能力缺失:}}_{\text{即使 PE 修好,远距离注意力模式从未被训练。}} $$

RoPE 缩放族(PI/YaRN/NTK,第 5080、5090 篇)做的是第一件事:把位置刻度压缩或频率重标定,让 128k 的距离值映射回模型见过的相位区间。困惑度曲线立刻好看——因为语言建模的边际分布以局部统计为主,只要最近几千 token 的注意力正常,PPL 就撑得住。

但能力缺失是另一笔账。长程依赖的使用要求模型学会"把答案存在第 0 个 token、几千步之后取回来"这类注意力行为。训练长度 $L$ 内,能被梯度监督到的远距离样本本身就稀少:预训练语料里跨万 token 的依赖关系(长文档的指代、章节呼应)占比微乎其微,且统计上多被局部冗余替代——模型用就近信息就能把 loss 降得差不多,远距离注意力拿不到足够的学习压力。YaRN 没有改变训练数据,也就不可能凭空长出这个能力。

实测的证据链

几个互相印证的观察:

  • PPL 拐点远晚于任务失效点。 外推后的模型困惑度常在 2~4 倍训练长度处才明显抬升,但带监督的检索任务(needle in a haystack、RULER)刚过训练长度就掉分。PPL 是寻址失效的盲区指标(第 5150 篇)。
  • Lost in the Middle。 即使在训练长度以内,关键信息放在输入中部时召回率也系统性低于放在两端——U 形曲线。说明"长度之内"和"长程能力"也不是一回事:位置先验(开头锚定、就近衰减)会盖住中部信息。
  • 针测过拟合。 专门刷 passkey 类合成任务可以把 needle 测分拉满,换到多跳推理、跨段聚合任务立刻露馅——合成任务只训练了"寄存-取回"一条回路。

什么才能真正补上能力

按代价从高到低:

  1. 长序列继续训练。 直接喂长文档,让远距离注意力吃到真实梯度。代价是注意力 $O(n^2)$ 与 FFN 线性成本,万级长度训一轮的算力是短序列的数倍。LongRoPE(第 5100 篇)另辟蹊径:用搜索找非均匀插值,让"位置合法"所需的继续训练量最小。
  2. 合成长依赖数据。 构造强制远距离依赖的任务(跨段摘要、长链指代)。风险是分布窄,刷出来的能力迁移有限。
  3. 架构侧绕开。 检索增强(RAG)把长程问题转化为外存寻址,绕开注意力寻址;线性注意力/状态空间(第 4250、4260 篇)把长程做成固定维状态——代价是表达力上限。
  4. 接受折损。 很多 agent 场景下 8k~16k 有效上下文 + 好的分块策略,比 128k 名义上下文更实用。

小结

"外推"这个词的歧义值得警惕:位置编码的刻度可以缩放,能力的缺课没法缩放。判断一个模型的真实上下文长度,别看宣传里的外推倍数,看训练用了多长、检索类评测在多远距离还能过——两者取小,就是有效上下文。

同一模型的两条曲线:PPL 拐点远晚于任务失效点 训练长度 L 检索任务失效 PPL 明显抬升 PPL 检索任务分 输入长度 有效上下文 = min(训练长度, 检索评测仍通过的最远距离)