← 返回题目列表

大模型的上下文窗口是如何扩展的?位置插值、NTK、YaRN 是什么?

高频 困难 第 12 / 25 题 更新于 2026/09/25
长上下文位置插值NTKYaRNRoPE
学习 AI 实战项目

简化版

模型在固定长度(如 4K)训练后直接处理 32K,位置相位、注意力距离与长文数据都发生分布外变化,性能可能下降。对 RoPE 模型,常见办法是调整位置或频率映射:

  • 位置插值(PI):把位置索引按比例缩小,等比压进训练范围,需少量微调。
  • NTK-aware scaling:改变 RoPE base,使不同维度的频率缩放不均匀,尽量保留短距离分辨率;“免训练可用”是特定模型与倍数下的经验结果。
  • YaRN:采用分频段插值(NTK-by-parts)并配合注意力缩放,目标是在长短上下文间取得更好折中,仍需实测和通常的长序列训练适配。

除改位置编码外,还有长文本继续训练、滑动窗口注意力、稀疏/高效注意力、KV 压缩等配套手段。

详细版

问题根源:外推失效

RoPE 用各维频率的旋转相位编码位置。超过训练长度时,相对距离分布、各频率相位组合以及长序列注意力模式都可能分布外;由于旋转具有周期性,不能简单描述成“角度数值超出一个区间”。是否失效和失效位置依赖模型、频率与训练数据。

三种主流扩展法

  1. 位置插值(Position Interpolation, PI)

    • 思路:不外推,而是内插。把位置索引乘以 L/L'(L 是原长,L’ 是目标长),让 [0, L’) 的位置「压缩」到 [0, L) 内。
    • 效果:缩放后的位置坐标落回原数值范围,但相对距离分辨率改变;通常配合长文本微调,稳定性不是无条件保证。
    • 代价:位置分辨率变粗(相邻位置的编码差异变小),近距离建模略受损。
  2. NTK-aware scaling

    • 思路:不均匀地缩放——高频维度(管近距离)几乎不动,低频维度(管远距离)才插值。通过调大 RoPE 的 base(θ 的底数)实现。
    • 效果:目标是比均匀 PI 更好保留短距离结构;能否免微调取决于扩展倍数、模型和任务。
    • 直觉:近处要看清(别动),远处放宽(插值)。
  3. YaRN(Yet another RoPE extensioN)

    • 思路:在 NTK 基础上进一步分频段处理,并引入注意力温度缩放(调 softmax 的缩放)补偿长序列下注意力熵的变化。
    • 效果:在其论文设置下改善了长上下文训练效率与质量,但不能脱离训练配置宣称“最省、最稳”。

配套手段

  • 长文本继续预训练/微调:直接在长样本上训,最直接但最贵。
  • 滑动窗口注意力:每个 token 只看最近 W 个,降成本(Mistral)。
  • 稀疏/高效注意力、KV 压缩:控制长上下文的计算与显存。

完整版教学

记忆钩子:RoPE 扩长是在“位置范围、局部分辨率、继续训练成本”之间交换,窗口能打开不代表远距离信息能用好。

一、为什么”训 4K、用 32K”会崩

上下文扩展的难点全在位置编码的外推能力。RoPE 把位置信息编成随位置线性增长的旋转角 m·θ_i(不同维度 i 用不同频率 θ_i)。训练时模型见过的旋转角范围对应 m ∈ [0, L)。

当推理距离远超 L,模型没在相同距离分布上优化,可能出现困惑度上升、位置检索下降或长文组合失败;错误可能发生在开头、中间或结尾,不能概括为“只用开头”。

缩放方法只解决位置表示的一部分分布外问题:要么压缩位置坐标,要么调整不同频率的旋转速度;模型仍需学习在更长内容中检索、组合和抗干扰。

二、位置插值 PI:把长序列”压”回训练范围

PI 的想法极简:既然模型只熟悉 [0, L),那就把目标长度 L’ 的位置索引线性缩小 L/L' 倍,让它们全部落进 [0, L)。

原始: 位置 m ∈ [0, L'),旋转角 m·θ  (超出训练范围)
PI:   位置 m → m·(L/L'),旋转角 m·(L/L')·θ  (压回 [0, L) 内)

比如把 4K 扩到 32K,可把位置索引除以 8。第 32000 个位置的缩放坐标约为原来的 4000,但整条序列的相对位置密度已经改变,不能说模型“完全见过”这种输入分布。

  • 优点:稳定可靠,是最早被验证有效的方法。
  • 代价:位置「密度」变大、分辨率变粗——原本相邻两个位置的编码差异,现在被压缩了 8 倍,近距离的位置区分度下降,所以需要少量长文本微调让模型适应新的位置尺度。

三、NTK-aware:近处别动,远处才插值

PI 一刀切地压缩所有频率,损害了近距离分辨率。NTK-aware scaling 更聪明:分频段区别对待。

RoPE 的不同维度用不同频率:高频维度旋转快、管近距离的精细区分;低频维度旋转慢、管远距离。NTK 的洞察是:

  • 高频(近距离)维度:分辨率宝贵,几乎不缩放,保持精细。
  • 低频(远距离)维度:本就变化慢,对它们做插值扩展范围,损失小。

常见实现通过修改 RoPE base 形成随维度不同的缩放比例,而不是严格地把一段频率完全冻结、另一段单独插值。它可能比统一 PI 更好地保持短距行为,但“无痛、免微调”只能作为实验现象,不能作为算法保证。

四、YaRN:更省微调的组合拳

YaRN 在 NTK 的方向上更进一步:

  1. 分频段精细处理:对不同频率区间采用不同的插值/保留策略(有的维度外推、有的插值、有的过渡),比单一 NTK 更精细。
  2. 注意力温度缩放:长序列下,注意力要 softmax 的对象变多,注意力分布的「熵」会变化,导致注意力过于平均或过于尖锐。YaRN 引入一个温度因子调节 softmax 的缩放,补偿这种变化,稳住长序列下的注意力质量。

YaRN 的目标是用较少长序列训练获得更好的扩展折中。部署时仍要确认具体 scaling 参数、训练长度、推理实现和短文本回归,不能仅按方法名推断可用窗口。

五、改位置编码之外,还得配套什么

位置编码扩展解决了「模型能不能理解长位置」,但长上下文还有计算和显存的现实压力(注意力 O(n²)、KV Cache 线性膨胀)。所以工程上通常组合:

  • 长文本继续训练:无论用哪种插值,少量长样本微调几乎都能明显提升效果;条件允许时直接在长上下文上继续预训练最稳。
  • 滑动窗口注意力:限制每个 token 只看最近 W 个,降低长序列注意力成本(Mistral 的做法)。
  • 高效注意力:FlashAttention 降显存/访存,稀疏/线性注意力降复杂度阶。
  • KV Cache 优化:GQA/MLA 压缩 KV,缓解长上下文的显存瓶颈。

面试能把「位置编码扩展(PI/NTK/YaRN)」和「计算/显存配套(滑窗、FlashAttention、KV 压缩)」两条线都点到,说明你理解长上下文是系统工程,不止改个位置编码。

六、用位置角度看插值代价

若模型只在 4096 长度内训练,却直接把位置编号用到 32768,最高位置变为训练上限的 8 倍,许多频率分量会进入模型从未见过的相位区域。位置插值把推理位置除以 8,使 32768 映射回约 4096;它避免了纯外推,但也把原本相邻位置的角度差压小,可能损伤局部位置分辨率。

训练范围:       p in [0, 4095]
直接外推:       p=32767                 # 分布外
8 倍位置插值:   p'=32767/8≈4095.9      # 映回训练范围
方法核心动作主要风险
直接外推沿用原频率处理更大位置相位分布外
位置插值将位置整体压回训练区间局部分辨率下降
NTK/YaRN 类缩放分频率调整旋转速度参数与实现一致性复杂

因此“窗口能打开”不等于“长文可用”。至少要分别测试短文本回归、不同距离的 passkey retrieval、长文问答和困惑度,并确认 RoPE 参数、位置编号及 KV Cache 在训练框架与推理引擎中完全一致。

七、常见误区与追问

  • 误区:把 max_position_embeddings 改大就获得长上下文能力。 这只放开形状限制,没有解决 RoPE 相位分布外、注意力成本和长距离训练不足。
  • 追问:位置插值为何能缓解外推? 它把更大的推理位置压回训练见过的角度范围,用局部分辨率换取长度覆盖。
  • 误区:Passkey 测试通过就证明长文本能力完整。 它只测特定位置检索,还需覆盖多跳推理、长文理解、短文回归和不同深度位置。
  • 追问:RoPE 缩放为何常需继续训练? 缩放改变了位置与旋转角度的映射,继续训练帮助模型适应新的距离分布。
  • 追问:部署时最容易出现什么静默错误? 训练与推理使用不同 rope_theta、缩放算法或 position ids,模型能运行但长上下文质量异常。

八、加强记忆

长上下文扩展记三类动作:PI 统一压缩位置坐标;NTK-aware 通过 RoPE base 形成非均匀频率缩放;YaRN 用分频段插值再配注意力缩放。 它们不是必然逐级更优,也不能单独创造长文推理能力。窗口扩展还要配长序列数据、注意力/KV 成本治理,并同时测试短文回归、不同距离检索、多跳组合与推理引擎参数一致性。标称 32K/128K 只说明接口接受长度,不说明每个位置的信息都能可靠利用。