LLM长上下文预训练方法
DeepSeekV3.2的回答⬇️
从短上下文开始训练,然后逐步扩展——是当前业界最主流、最有效的方法。直接从头开始训练128K的模型在计算上是非常奢侈且低效的。
下面我来详细解释这个渐进式扩展的过程、原因和具体技术。
核心方法:渐进式训练
这就像教一个人读书:你不会一开始就让他读一整本《战争与和平》,而是先让他读短文、故事,再到章节,最后读整本书。
对于LLM,这个过程通常被称为 “渐进式训练” 或 “上下文长度扩展”。
典型的步骤(以从4K扩展到128K为例):
第一阶段:短上下文基础预训练
- 模型(如DeepSeek-V2)首先在大量的4K或8K token长度的文本上进行标准的预训练。这个阶段的目标是让模型学会语言的基本规律、常识和世界知识。此时的计算成本相对可控。
第二阶段:持续预训练与长度扩展
- 当短上下文模型收敛后,我们不会从头开始,而是在这个已经训练好的模型基础上,使用更长序列的数据进行继续训练。
- 关键技巧:位置编码的外推与插值
- 问题:模型之前只在4K长度的序列上见过RoPE位置编码。现在要处理128K的序列,位置索引远远超出了它之前见过的范围(0~4095)。模型无法理解位置50000是什么意思。
- 解决方案:位置插值 这是目前最流行、最有效的技术。
- 思想:我们不直接使用巨大的位置索引(0~127999),而是将所有位置索引进行等比例缩小,使其落在模型“熟悉”的范围内。
- 公式:对于目标长度
L_max(128K)和原始训练长度L_orig(4K),我们定义一个缩放因子s = L_max / L_orig(例如 s = 128K / 4K = 32)。 - 操作:在计算RoPE时,我们不使用实际位置
m,而是使用m' = m / s。这样,位置127999就变成了 127999 / 32 ≈ 4000,这个值就在模型熟悉的0~4095范围内了。 - 比喻:这就像把一张被拉长变形的橡皮膜,压缩回它原来的形状。模型只需要在它已经理解的位置关系上做一些微调,就能适应新的、更密集的位置关系。
- 在这个阶段,使用大量128K长度的文本数据,并应用位置插值,以较小的学习率对模型进行持续预训练。模型会快速学会在新的、更长的上下文窗口中理解和生成文本。
为什么不用第一种方法(直接训练128K)?
- 计算成本爆炸:注意力机制的复杂度和序列长度成平方关系(O(n²))。直接训练128K序列的计算量和内存消耗是训练4K序列的 (128/4)² = 1024倍!这在经济上和工程上都是不可行的。
- 数据需求:高质量、连贯的长文档(128K token约等于10万字)比短文本更难收集和整理。
- 训练不稳定:从头开始学习长程依赖关系非常困难。渐进式训练提供了一个更平滑的优化路径。
为什么不用纯外推?
你可能会问,既然RoPE有外推性,能不能直接用4K模型去推理128K的文本?
- 答案是不行。外推能力有限。虽然模型在8K或16K上可能还行,但到了128K这种远超训练长度的范围,模型的性能(如困惑度)会急剧下降。它没有学过在如此长的范围内如何组织注意力。位置插值正是为了增强模型的外推能力而设计的“热身运动”。
DeepSeek-V3的具体实践
虽然DeepSeek没有完全公开其128K训练的每一个细节,但根据论文和技术报告,可以确信他们采用了上述的渐进式策略,并结合了其他尖端技术:
- 混合架构:DeepSeek-V3使用了MLA等高效注意力机制,本身就为长上下文做了优化。
- 渐进式扩展:他们几乎肯定是从一个较短的上下文(比如8K或16K)开始预训练,奠定模型的基础能力。
- 位置插值:在扩展到128K时,必然会使用PI或类似的改进技术(如NTK-aware插值、YaRN)来平滑过渡。
- 高效的工程实现:依赖类似FlashAttention-2/3的底层优化,以及序列并行等分布式技术,才使得在硬件上训练128K序列成为可能。
- 高质量长文本数据:精心构建了包含长文档、代码、学术论文等在内的128K长度数据集用于持续预训练。
总结
所以,回到你的问题:DeepSeek-V3的128K上下文长度,绝不是从一开始就直接用128K文本训练的。
它遵循的是一个高度优化的工业化流程:
短上下文基础预训练 → 在预训练好的模型上,通过【位置插值】等技巧进行【长上下文的持续预训练】→ 最终得到一个强大的长上下文模型。
这种方法在性能、成本和稳定性之间取得了最佳平衡,是目前训练长上下文LLM的标准做法。
LLM长上下文预训练方法
https://cosmoliu2002.github.io/posts/llm-long-context-pretrain/