上下文窗口:长文本怎么撑
上下文窗口是模型单次推理能看到的 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 通过缩放或重映射位置频率,把长文本压回训练区间,从而低成本扩展上下文长度。
参考与延伸阅读
- “Extending Context Window via Positional Interpolation”(Chen 等, 2023)。已核验。https://arxiv.org/abs/2306.15595
- YaRN(Peng 等, 2023)。已核验。https://arxiv.org/abs/2309.00071
- Hugging Face 文档首页。已核验。https://huggingface.co/docs/transformers/
本文累计阅读 — 次