技术博客

上下文长度课程:从 4k 到 128k 的分阶段延长策略

第 119 / 147 篇 · 2026-04-13 · ai · 预训练长上下文训练策略

看主流模型的技术报告,上下文长度几乎都不是一步到位训出来的:Llama 2 从 4k 起步,长上下文版用 8 万步延长到 8k/16k;Qwen2.5 分 4k → 32k → 128k 多段;GPT-4 的细节不公开,但公开论文里所有认真的复现都遵循同一个模式——短序列主体训练 + 中程延长 + 末期长度退火。为什么要把长度当成一门课来排课表,这篇从成本、数据和位置编码三个角度拆。

为什么不能直接 128k 训到底

三个硬约束叠加。

成本约束是定量的。 每个 token 的注意力计算量正比于它能看到的历史长度,近似正比于 $n$;128k 序列的单 token 注意力成本是 4k 的 32 倍。摊到整个模型上,注意力占总 FLOPs 的比例从 4k 时的几个百分点涨到 128k 时的相当大一块(参数量越小占比越高,对 7B 级模型注意力在 128k 下能占到总计算的三成以上)。更隐蔽的是显存账:activation 里 $n \times n$ 的注意力矩阵(FlashAttention 之前)或分块流水的工作区,都随长度平方膨胀。训练初期模型离收敛很远,用 32 倍贵的序列长度去学"the 后面接名词"这种统计规律,是纯粹的浪费。

长文数据不够。 网络语料的长度分布天然偏短:大部分网页正文凑不齐 4k token,真正的 32k+ 连续文本主要是书籍、论文、长代码仓库和对话记录,总量以 TB 计、还要过质量关。128k 训练窗口若按自然分布填满,窗口大部分位置会被"不够长的文档 + 填充或拼接"占据,真正跨万 token 的依赖信号极其稀疏。

位置编码要重新校准。 RoPE 训练的绝对位置范围就是它见过的范围,直接拿 4k 训出来的模型跑 128k,超出训练位置的部分高频分量相位完全乱掉(外推篇展开过机制)。长度延长本质上是给位置编码做一次再训练,这需要专门的数据和步数,塞进主体训练早期没有任何收益。

三阶段的标准课表

阶段一:主体预训练,固定短窗(4k–8k)。 占整个训练 token 量的 95% 以上。这个阶段模型学词汇、语法、世界知识、推理模式——这些能力的长度无关性极强,4k 窗口足够承载。成本敏感的操作都在这里做:去重、配比调整、课程切换。有些实现还会在阶段一内部做"长度预热",前 1%–2% 的步数用 2k 甚至更短的窗口,避免训练最初几百步长序列带来的激活爆炸和 loss spike,稳定后再切到目标短窗。

阶段二:中期延长(32k–64k)。 用 RoPE 插值(PI/NTK/YaRN 任选,见位置编码系列)把位置范围扩到目标长度,混入 5%–10% 比例的长文数据继续训。这一步的 token 总量不大,Llama 2 长上下文版的延长阶段只用了约 8 万步、总量不到主体的 5%,但它完成了两件大事:校准插值后位置编码的相位分布,以及让模型"见到"万级 token 的真实依赖结构。

阶段三:末期长度退火。 和退火篇的逻辑同构:学习率趋零的窗口是行为定型期,把长度分布往目标推、把长文任务(长文摘要、仓库级代码、多文档推理)的占比上调,模型以最高保真度把"长上下文行为"写进参数。如果只做了阶段二没做阶段三,常见症状是模型能处理长输入但长文任务的输出质量明显差于短任务。

长度课表三阶段:token 量与序列长度解耦,成本大头留在短窗主体阶段 序列长度 训练进程(token 消耗,非线性) 阶段一:4k–8k 主体(约 95%+ token) 阶段二:插值延长 32k–64k,5% 左右 token 阶段三 长度退火 → 128k 4k 64k 128k 经验口径:阶段二+三合计约占 1%–5% 训练算力;超过 10% 通常说明阶段一配比或插值方法有问题

长文数据从哪来:拼接是有讲究的

阶段二、三最头疼的是数据构造。天然长文(书籍、论文、代码仓库)量不够,主流补法是拼接——把多篇短文档拼进一个长窗口。但裸拼接会引入一个隐蔽问题:窗口中段的文档,其注意力被前后无关文档稀释,而且 cross-document attention 会把无关内容混进表示(packing 与文档边界那篇专门讨论)。负责任的实现会给拼接的文档加 attention mask(文档间不可见),或者优先选主题相关的文档拼接,让长程依赖至少"看起来"有意义。

更进一步的做法是合成带监督信号的长程任务:把关键信息埋在长文档中段、让模型做检索或推理(大海捞针式任务的训练版)、多跳问答、跨章节的摘要。这类数据的构造成本不低,但它直接提供了"长距离依赖必须被使用"的梯度信号——自然长文里其实大量内容是局部可解的,模型没有动力真的去用 100k 之外的上下文。

两个容易忽视的坑

延长阶段的学习率要重新warmup 一小段。 插入长序列后 attention 的激活分布跳变,沿用主体末期的低学习率会导致延长阶段学不动;但也不能回到峰值,否则会把主体阶段学到的知识冲掉。实践是峰值学习率的 10%–20% 做几千步的小 warmup 再衰减。

评测长度和训练长度要分开记账。 阶段二做完插值,模型在 64k 的 perplexity 立刻好看,这不代表长程能力到位——困惑度对长文的衡量偏差极大(长文本评测篇展开)。真正的验收要在阶段三退火完成后,用带长程依赖的任务测:跨章节指代、多文档综合、长代码仓库的跨文件补全。只看 needle 检索会高估,只看 perplexity 会失真,两个都要但更信前者。

小结

上下文长度课程是三个约束的联合最优解:注意力成本随长度线性放大单 token 计算、长文数据稀缺且质量参差、位置编码需要专门校准。标准课表是短窗主体(95%+ token)→ 插值延长(5% 左右,配 RoPE 缩放)→ 末期长度退火(行为定型)。长文数据靠"带文档隔离的拼接 + 合成长程任务"两条腿。延长阶段 learning rate 小 warmup、验收用任务而非困惑度,是两条容易被漏掉的经验。