LLM 预训练:数据、目标函数与 Scaling Law

从"为什么预测下一个 Token 能学会推理"出发,解释预训练的目标函数、数据配比与质量对模型能力的决定性影响,以及 Scaling Law 如何让研究者在训练前就能估算模型的最终表现。

本文使用humanizerdocumd-visuals

大模型的能力从哪里来?后训练(SFT、RLHF、DPO)能让模型变得有用,但它们是在已有能力上做对齐,不能凭空创造能力。翻译、推理、写代码——这些都是在预训练阶段从数据里学来的。

预训练是大模型能力的来源,也是成本最高的阶段。训练 GPT-4 的计算成本估计超过一亿美元,这笔钱绝大部分花在预训练上。理解预训练,就是理解大模型能力的根基。

这篇文章从三个角度拆解预训练:目标函数(为什么预测下一个 Token 有效)、数据(什么决定了模型能学到什么)、Scaling Law(规模如何影响效果,以及这个规律意味着什么)。

目标函数:预测下一个 Token 为什么有效

预训练的目标非常简单:给定前面所有的 Token,预测下一个 Token 是什么。

输入:The quick brown fox jumps over the lazy
目标:dog

这个目标函数是语言模型的标准形式,也叫自回归语言模型(Autoregressive Language Model)或者因果语言模型(Causal Language Model)。训练时,模型处理整个文档,对序列中每个位置预测下一个 Token,把所有位置的预测误差加总作为损失:

Loss = -Σ log P(token_t | token_1, ..., token_{t-1})

这里有一个看起来很朴素的问题:为什么预测下一个词能让模型学会推理?

答案是:这个目标比它看起来要难得多。

预测“The quick brown fox jumps over the lazy dog“里的 dog,只需要记住这个常见的英语习语。但要预测”如果一个房间有 4 面墙,每面墙有 2 扇窗户,那么这个房间有 8 扇窗户”,模型必须理解数量和乘法关系。要预测一段代码里的下一个语法正确的 Token,模型必须理解当前函数的缩进层级、已经声明的变量名、语言的语法规则。

当这个任务在数 TB 的多样语料上重复数百亿次时,模型被迫建立起关于世界的内部表示——不是明确教给它的,而是为了更好地预测文本而不得不学会的。这个现象有时被称为“语言理解作为压缩”:要高效压缩(预测)人类写下的所有文本,模型必须内化产生这些文本所需要的知识和推理能力。

Next Token Prediction 和 Masked Language Model 的区别:BERT 系列模型用的是另一种目标——Masked Language Model(MLM),随机遮掉序列中 15% 的 Token,让模型预测被遮掩的部分。MLM 能看到上下文的双向信息(被遮掩位置左边和右边的 Token 都能看到),所以在理解型任务(分类、相似度、抽取)上表现更好。代价是它不能做自回归生成——你没法用 BERT 续写一段文字。GPT 系列选择 Next Token Prediction,牺牲了一部分理解型任务的上限,换来了生成能力。

预训练目标的力量在规模下才真正显现。在百亿参数以下的模型上,Next Token Prediction 能学到语言的语法和局部统计规律;到了百亿参数、训练数据超过万亿 Token 的规模,模型开始表现出在小规模训练时几乎为零的能力——算术推理、多步逻辑、代码补全、跨语言翻译。这些“涌现能力”并非被明确教授,而是为了更好地预测训练数据而不得不建立的内部能力。一个直观的理解方式:如果你必须预测一千本历史学著作里每个词的下一个词,你必须内化大量的历史事实、因果逻辑和写作风格;如果你还要同时预测数百份物理学论文,你还需要内化这门领域的符号体系和推理规范。预训练数据的广度决定了这种能力积累的覆盖范围,而“语言模型无法学会推理”这个早期论断,在足够大的规模下被反复证伪。

训练数据:什么决定了模型能学到什么

“模型的能力上限由数据决定”这个说法不是比喻,是字面意思:训练语料里没有出现过的知识类型、语言、推理模式,模型在预训练阶段就学不到。

数据规模

现代 LLM 的训练数据规模在万亿 Token 量级。以几个代表性模型为例:

  • LLaMA 3 8B:训练了约 15 万亿 Token
  • GPT-3(2020):约 3000 亿 Token
  • GPT-4(估计):超过 10 万亿 Token(未官方公布)

Token 规模的快速增长来自两个因素:Chinchilla 定律(后面会讲)指出更小的模型也需要更多数据,以及数据工程能力的提升使得清洗和处理更大规模数据集成为可能。

数据来源和配比

训练数据通常是多源混合的,常见的来源包括:

网页数据(Common Crawl):互联网的大规模爬取,Raw 数据质量参差不齐,需要大量清洗。体量最大,通常占训练数据的 50-80%。

书籍和文学:质量高、语言多样、长文档,对模型的长上下文理解和写作风格有重要贡献。Project Gutenberg(公版书)、Books3 是常见来源。

代码:GitHub 上的开源代码。代码对模型的推理能力有不成比例的重要贡献——代码有明确的逻辑结构、符号操作和因果关系,这些特性让在代码上训练能提升模型在非代码逻辑推理任务上的表现。LLaMA 3 在 GitHub 代码上的数据配比约为 4%,但代码相关任务的表现显著。

学术论文:arXiv、PubMed 等。高密度的专业知识,对科学推理和数学能力有帮助。

Wikipedia 和知识库:高质量、经过人工编辑的事实性内容,密度高但绝对体量小。

多语言数据:覆盖多种语言。模型的多语言能力直接取决于训练数据中该语言的比例——如果训练数据里中文只占 0.1%,模型的中文能力就会很弱。

配比是一门工程学问。直接按各来源的自然比例混合通常效果不好:网页数据体量大但质量低,书籍体量小但质量高,代码体量中等但对推理的贡献超过其占比。大多数研究团队会对高质量来源做过采样(upsampling),对低质量来源做欠采样。

LLaMA 3 的论文披露了一个数据点:相同计算预算下,把代码数据的比例从约 1% 提升到约 4%,整体基准表现(包括非代码任务)提升明显,说明代码数据对推理能力的贡献远大于其体量比例。

数据质量和清洗

数据质量是预训练效果的关键变量,也是各家模型之间最难以量化比较的差异之一。

典型的数据清洗流程包括:

去重:同一份文本在爬取结果里可能出现几十次甚至几百次(不同网站转载相同内容)。重复数据会让模型过拟合到这些内容,浪费训练 Token。MinHash、SimHash 等近似去重算法在百亿级文本上是常用工具。

质量过滤:去掉质量过低的内容——纯广告页、乱码、低信息量的模板化文本。判断质量的方法可以是规则(文本长度、标点符号比例、语言识别置信度),也可以是用一个质量分类器打分。

安全过滤:过滤包含明显有害内容的文档——不是因为模型永远不会见到这类内容,而是控制其在训练数据中的密度,避免模型对有害内容产生过强的偏好。

去污(Decontamination):把测试集里的数据从训练集里去掉,确保评估结果是真实泛化能力而不是记忆。如果训练数据里包含了 MMLU、HumanEval 等主流基准的题目,报告的基准分数就不可信。

在实际操作中,数据质量过滤面临一个核心张力:严格的过滤提升质量,但会大量丢弃数据,减少总量。使用基于小型语言模型的困惑度过滤(Perplexity Filter)是一种常见方法——对每段文本计算语言模型困惑度,只保留困惑度在某个范围内的内容(过低说明可能是重复模板,过高说明可能是乱码或噪声)。另一种思路是“质量信号来自人类行为”:Reddit 高赞内容、Wikipedia 被外部站点引用的链接等都可以作为正向质量信号,从这些高质量内容里训练一个快速分类器,对全量数据打分过滤。FineWeb、Dolma 等开源数据集的技术报告详细记录了这类流程,是了解大规模数据工程的第一手资料。

预训练数据配比与质量对模型能力的影响

Scaling Law:规模如何预测效果

Scaling Law(规模定律)是近年来 LLM 领域最重要的实证发现之一,核心结论是:在相当大的范围内,语言模型的损失(以及由此延伸的能力)随着计算量、参数量和数据量的增加,以可预测的幂律关系下降。

Kaplan Scaling Law(2020)

OpenAI 的 Kaplan et al. 在 2020 年发表了第一篇系统性的 Scaling Law 研究。他们在不同规模的模型和数据上训练,观察到:

  • 模型损失与参数量之间呈幂律关系:参数量翻倍,损失大约下降固定的比例
  • 同样的规律对计算量(FLOPs)和数据量成立
  • 这三个维度(参数、数据、计算)的扩展可以相互替代,但有一个最优配比

Kaplan 定律给出了一个重要实践结论:给定固定的计算预算,应该优先扩大参数量,数据量的扩展可以相对保守。这个结论指导了 GPT-3 的训练决策。

Chinchilla Scaling Law(2022)

DeepMind 的 Hoffmann et al. 在 2022 年发表了 Chinchilla 论文,重新做了更全面的实验,得出了不同的结论:Kaplan 的模型参数比例建议偏高,数据量被严重低估了。

Chinchilla 定律的核心结论:给定计算预算 C,最优配比是参数量 N 和训练 Token 数 D 大致相等(N ≈ D / 20,即每个参数对应约 20 个训练 Token)。

举个例子:如果你的计算预算能训练一个 10B 参数的模型跑 200B Token,按 Chinchilla 定律,同样的预算更应该训练一个 6-7B 参数的模型跑 300B Token——更小的模型、更多的数据,最终效果更好。

这个结论改变了业界的训练策略。GPT-3(175B 参数,训练了约 300B Token)按 Chinchilla 定律来看是明显的“数据欠训练”。LLaMA 系列有意地按小模型+大数据的方向设计——LLaMA 3 8B 训练了 15T Token,远超 Chinchilla 的最优配比,目标是得到一个“推理时高效”的小模型(推理成本比训练成本更重要,训练多烧的钱每次推理都会收回来)。

Scaling Law 的局限

Scaling Law 是实证规律,不是物理定律,有几个重要的边界条件:

能力的涌现(Emergence):某些能力不是随规模平滑提升的,而是在某个规模阈值突然“出现”——在小模型上几乎为零,在大模型上突然显著。Wei et al. (2022) 记录了这些“涌现能力”,比如算术推理、多步推理、跨语言翻译。Scaling Law 对这类不连续提升的预测能力有限。

数据质量:Scaling Law 的实验通常在固定质量的数据集上进行,但数据质量本身是变量,更高质量的数据可以让小模型获得大模型的效果。这个因素在 Scaling Law 的标准公式里没有体现。

任务特定的边界:对于某些任务,增加规模的边际收益会递减,甚至模型越大越差(逆向Scaling),比如需要精确遵循格式的任务,大模型有时反而会过度发挥。

后训练的放大效应:Scaling Law 预测的是预训练损失,而预训练损失和实际任务表现之间的关系取决于后训练质量。一个 7B 模型经过好的 SFT 和 RLHF,可以在很多实际任务上超过一个 70B 的纯预训练模型。

计算最优训练和实际决策

Chinchilla 定律给出了“在固定计算预算下损失最小化”的配比,但现实中的训练决策还需要考虑另一个维度:推理成本。

训练是一次性的(或周期性的),推理成本是持续的。如果一个模型要服务数百万用户,推理成本随使用量线性增长。这让“小而强”的模型变得更有商业价值——你可以多花一些训练预算(超过 Chinchilla 最优)来训练一个更小的参数量模型,每次推理节省的成本会在产品生命周期内摊销回来。

这是 LLaMA 3 8B 用 15T Token(远超 Chinchilla 建议的约 200B Token)训练的主要原因,也是 Mistral 7B 在发布时能在很多基准上超过 LLaMA 2 13B 的原因之一(数据更多、质量更好、架构更新)。

另一个现实约束是数据墙(Data Wall):高质量的互联网文本是有限的。目前互联网上高质量英文文本的估计量约为 10-20T Token,如果 Scaling Law 要求继续扩大数据量,就需要数据合成(合成数据、多轮对话数据)或者重复使用数据(多 epoch 训练),这些方法的有效性还在研究中。

**合成数据(Synthetic Data)**是应对数据墙的主要方向之一。DeepSeek-R1、Qwen 等模型用已有的强模型生成数学推导步骤、代码注释、问答对,再用这些合成数据做预训练或后训练。合成数据的质量上限取决于生成它的模型——如果生成者本身存在某类错误,合成数据会系统性地放大这些错误。数学和代码类合成数据可以通过执行器验证正确性(运行代码看结果、验证数学证明步骤),质量控制更可靠;自然语言问答的合成数据验证更难,容易引入模型的固有偏见和幻觉。多 epoch 训练方面,相比图像模型,语言模型对数据重复更敏感,重复过多会导致模型过拟合到特定表达方式、降低泛化能力,但适度的多 epoch(2-4 遍)配合数据增强在某些设置下仍有正向收益。如何在有限的高质量数据上最大化训练收益,是当前预训练工程的核心研究方向之一。

预训练的实际流程

一次大规模预训练是怎么运作的,涉及哪些工程问题?

并行策略:单张 GPU 装不下大模型,需要多种并行方式:

  • 数据并行(Data Parallelism):多 GPU 各处理一部分 batch,梯度同步后更新参数。最简单,通信开销随 GPU 数量增长
  • 张量并行(Tensor Parallelism):把单层的矩阵运算切分到多 GPU,适合减小单卡显存压力
  • 流水线并行(Pipeline Parallelism):把不同层分配到不同 GPU,不同层可以同时处理不同的 micro-batch

大规模训练(千卡以上)通常是三种并行方式的组合。

混合精度训练(Mixed Precision):前向传播和梯度计算用 bfloat16(速度快、显存小),参数主拷贝和优化器状态用 float32(保持精度)。这是现代训练的标准配置,在不显著降低精度的前提下让训练速度提升约 2-3 倍。

梯度检查点(Gradient Checkpointing):正常训练时,前向传播的中间激活值(activation)都要保留用于反向传播,显存占用随层数和 batch size 增长。Gradient Checkpointing 只保留部分检查点,其他激活值在反向传播需要时重新计算,用计算换显存(通常增加约 30-40% 的计算量,减少约 60-70% 的激活显存)。

训练稳定性:大规模训练中,损失“Loss Spike”(训练曲线突然尖峰上升然后恢复)是常见问题。原因可能是数据质量异常、梯度范数突然增大、学习率调度问题。常见应对方法包括梯度裁剪(Gradient Clipping)、学习率预热(Warmup)和从检查点回滚重训。

训练监控和评估:预训练期间,团队会持续监控多个指标:训练损失的平滑曲线、验证集上的困惑度(perplexity)、学习率和梯度范数的变化,以及几个代理任务(比如简单的常识选择题)上的准确率。这些指标帮助团队判断训练是否在正常进行,以及在哪个检查点停止训练。很多团队还会定期在中间检查点上运行一套“early eval”,用来决定是否需要调整数据配比或超参数。

检查点管理:大规模训练通常每隔几千步保存一次检查点,保留最近的若干个。如果发生 Loss Spike 或其他异常,可以从最近的正常检查点恢复,但要重新生成发生 Spike 之后的那批训练数据(随机种子不同)。训练数千亿 Token 通常需要数周时间,如果不小心从头开始代价极高,所以检查点策略和数据重现性是预训练工程的基础设施重点。

预训练与后训练的分工边界

了解预训练之后,有必要说清楚预训练和后训练的分工,避免混淆。

预训练决定能力上限。预训练语料决定了模型“见过什么”——世界知识、语言风格、推理模式、代码能力。如果训练语料里几乎没有某种语言,这个模型就不会说那种语言;如果训练语料里数学推理的内容很少,再好的后训练也很难弥补。预训练是一个“能力建设”阶段,成本高、时间长,但奠定了一切。

后训练决定实际行为。SFT、RLHF、DPO 这些方法在预训练权重基础上调整模型的行为模式:让它遵循指令、拒绝有害请求、用特定格式回答、更好地对齐人类偏好。后训练的成本远低于预训练,但只能改善预训练模型已经有的能力,不能凭空创造新能力。

“微调能教会模型新知识吗”:一个常见的误解是认为微调可以向模型注入新的事实性知识(比如一个公司的内部文档)。实际上,用几百条 QA 做微调,效果更多体现在行为对齐(回答风格、格式、拒绝无关请求)而不是事实记忆。要让模型“知道”某个文档里的具体事实,RAG(检索增强生成)通常是更可靠的方案:把文档放进向量库,推理时检索相关段落放进上下文,让模型根据上下文回答,而不是依赖参数里的“记忆”。

数据污染(Contamination)的影响:如果测试集里的问题出现在预训练语料里,模型报告的基准分数就不再是泛化能力的指标,而是记忆能力的指标。这是评估大模型的核心挑战之一——你很难确认训练语料里是否包含了你的测试集。这也是为什么新模型发布时,研究者会用发布之后出现的新题目(比如最新的数学竞赛题)来检验模型能力,而不只依赖旧基准。

**继续预训练(Continual Pretraining)**是预训练和后训练之间的一个常见中间步骤,在有特定领域需求时特别有用。做法是在已有的通用预训练权重基础上,用领域特定数据继续以预训练目标函数训练一段时间,通常规模远小于原始预训练(几十亿 Token 而不是几十万亿),让模型对特定领域的语言和知识分布更熟悉。

医疗模型、法律模型、代码模型经常用这种方式在通用 LLM 基础上构建——不需要从头预训练,只需要在领域数据上继续训练,再做领域特定的后训练。这大幅降低了领域模型的构建成本。继续预训练的主要风险是灾难性遗忘(Catastrophic Forgetting):过于专注领域数据可能让模型“忘掉”原有的通用能力。缓解方法包括在领域数据里混合一定比例的通用数据(通常 5-20%),以及使用比原始预训练更低的学习率。

另一个典型应用是长上下文继续预训练:原始 LLaMA 3 训练在 8K 上下文上,要支持 128K 上下文需要在更长的序列上继续训练,同时调整 RoPE 的 ABF 参数(把基础频率从 10000 提升到 500000)。这类继续预训练通常只需要几十亿到几百亿 Token,相比从头预训练成本极低,但需要准备足够长的真实文档(不是把短文档拼接成假长文),否则模型的长上下文理解能力改善有限。

参考资料