上下文扩展方法(位置插值、YaRN、LongRoPE)
要解决的问题
在不 从头预训练 超长序列的前提下,让已在 4K–8K 训练的模型 外推 到 128K+,且 loss 与 perplexity 可控。
核心思路
RoPE 将位置编码为旋转相位;外推失败源于 高频分量 在未见长度上相位错乱。扩展方法 重标定频率 或 插值位置索引。
方法对比
| 方法 | 机制 | 优点 | 风险 |
|---|---|---|---|
| 位置插值(PI) | 线性压缩位置索引 | 实现简单 | 近距离分辨率下降 |
| NTK-aware | 调整 RoPE base | 少改训练 | 需调 base 超参 |
| YaRN | 分段插值 + 注意力温度 | 128K 常用 | 任务敏感 |
| LongRoPE | 非均匀频率缩放 | 更长外推 | 实现复杂 |
YaRN 要点(概念)
对维度分组应用不同插值因子,并在推理时缩放 attention logits(temperature)以稳定长距依赖:
工程上常以 少量长文继续训练(< 1% tokens) 配合 YaRN 固化行为。
推荐流程
- 选定目标长度 (如 128K)。
- 应用 YaRN / LongRoPE 配置(Transformers
rope_scaling)。 - 继续预训练或 SFT 长文样本(代码库、书籍章节)。
- 跑 Needle + 真实 RAG 回归(见 9.1.3)。
与架构改动关系
| 仅算法外推 | 算法 + 架构 |
|---|---|
| PI、YaRN | MLA 减 KV |
| LongRoPE | DSA 减 FLOPs |
| 继续训练 | 线性 attention(MiniMax) |
工程实践
- Hugging Face:
config.rope_scaling = {"type": "yarn", ...}。 - vLLM:确认 max_model_len 与 kernel 支持。
- 不要 仅改 config 不测 Needle——易出现「窗口开但找不到针」。