上下文窗口:长文本怎么撑

上下文窗口是模型单次推理能看到的 token 上限,由位置编码的最大位置决定。超出窗口,绝对位置编码会越界,注意力无法正确对齐。如何在有限训练长度上扩展到更长文本,是工程关键。

受限根因

Transformer 注意力复杂度为序列长度平方,长序列显存与算力开销大。训练时通常用固定最大长度(如 4096),位置编码只见过该范围内相对位置,直接外推到更长位置会退化。

位置插值(PI)

位置插值(Positional Interpolation)把新位置除以缩放因子 s=L’/L 再喂入原编码,使长文本落在训练见过的位置区间内。RoPE 上应用 PI 只需缩放旋转频率,改动小且有效。

# 对 RoPE 的旋转频率做线性缩放(示意)
import torch
def rope_freqs(dim, base=10000.0, scale=8.0):
    inv = 1.0 / (base ** (torch.arange(0, dim, 2) / dim)) / scale
    return inv

NTK 与 YaRN

NTK-aware 插值按维度非线性缩放频率,保留高频细节;YaRN 进一步结合注意力缩放与插值,在长上下文评测上更稳。这些方法让 4k 模型扩展到 32k 甚至 128k 而无需全量重训。

小结

上下文窗口受位置编码与算力限制。位置插值、NTK、YaRN 通过缩放或重映射位置频率,把长文本压回训练区间,从而低成本扩展上下文长度。

参考与延伸阅读

本文累计阅读