模型最初的大规模训练阶段,通过海量语料库学习语言(或其他模态)。这是昂贵的部分—数千块GPU运行数周或数月,耗资数百万美元。结果是一个基础模型,它理解语言,但尚未针对任何任务进行专业化。
当前语言模型的主要预训练目标是下一个标记预测:给定一个标记序列,预测接下来出现的标记。模型会处理训练语料库中的数万亿个标记,对于每个标记,它会计算整个词汇表上的概率分布,并因分配给实际下一个标记的概率较低而受到惩罚(通过交叉熵损失)。这个看似简单的目标实际上非常强大——为了在各种上下文中准确预测下一个词,模型必须隐式地学习语法、事实、推理模式、编码规范等。损失值最初很高(本质上是在32,000-128,000个标记的词汇表中随机猜测),随着模型逐渐内化语言的统计结构,损失值会逐渐降低。对于基于Transformer的模型,这是标准的训练方法。其他架构如状态空间模型(Mamba, RWKV)使用相同的训练目标,但用递归状态更新替代了注意力机制,在处理长序列时实现了可比的质量和更好的计算扩展性。
现代预训练的规模令人震惊,每6-9个月大约翻倍一次。GPT-3(2020)训练了3000亿个标记。LLaMA 2(2023)使用了2万亿个。LLaMA 3(2024)使用了超过15万亿个。计算量以浮点运算次数衡量,前沿的预训练可能需要10^25次浮点运算(FLOPs)——这个数字相当于数千块GPU运行数月,仅电费和硬件成本就高达数千万美元。训练通过数据并行(每块GPU处理不同的数据批次)、张量并行(每层的计算在GPU之间分割)和流水线并行(不同层分布在不同的GPU上)等技术在GPU上分布式进行。Megatron-LM、DeepSpeed和FSDP(PyTorch的完全分片数据并行)等框架处理数千块GPU同步的复杂性,但故障很常见——硬件错误、网络问题和数值不稳定性意味着大规模训练需要稳健的检查点和自动恢复。
并非所有预训练都是一样的,训练配方的细节与数据和计算量同样重要。学习率调度通常包括一个预热阶段(在最初的几千步内线性增加学习率),然后是余弦衰减至接近零。批量大小通常在训练过程中增加——开始时较小,以获得更频繁、更嘈杂的梯度更新,随后增大以实现更稳定的后期训练。序列长度(模型一次看到的标记数量)对模型学习内容有重大影响:更长的序列使其能够捕捉更长范围的依赖关系,但基于注意力的模型的内存消耗呈平方级增长。许多团队现在采用渐进式序列长度训练,从较短的上下文开始,之后逐步增加到完整的上下文窗口。优化器几乎普遍使用AdamW,尽管SOAP和Muon等新方法因其潜在更好的收敛性而逐渐流行。
预训练不再是单一的阶段。现代训练流水线通常包括多个阶段,使用不同数据混合。主要预训练阶段使用广泛语料库,然后“中期训练”或“继续预训练”阶段使用更高质量或更领域特定的数据混合,有时使用更长的上下文长度。这就是模型有效处理长文档的方式——从一开始就训练128K标记序列的成本过高,但最后在长上下文数据上进行短时间微调的效果却出人意料地好。预训练之后是基于指令数据的监督微调(SFT),然后通过RLHF或DPO进行对齐。每个阶段都建立在前一个阶段之上,它们之间的界限越来越模糊。过去清晰的三步流水线(预训练、SFT、RLHF)现在变成了多阶段课程,每个阶段都有不同的数据混合、学习率和目标。