Pretraining 预训练
Pretraining 预训练 是大语言模型获得通用语言建模能力的主要阶段。
现代 Decoder-only LLM 的目质是在做 next token prediction:在给定历史上下文的条件下,预测下一个 token 的概率分布。
预训练的核心作用是让模型在大规模文本、代码等语料中学习语言规律、知识关联、格式模式、代码模式和部分可泛化的推理模式。
预训练完成后的模型通常称为 Base Model,具备续写和生成能力。
Base model 不一定稳定遵循人类指令;要形成可对话用的 chat model,通常还需要指令微调、偏好优化、强化学习、安全评估和部署侧约束。
1. 预训练基本概念
1.1 预训练解决的问题
预训练解决的是"模型是否具备足够通用的语言和表示基础"的问题。
它让模型从大规模语料中学习:
- token、词语、句法和篇章结构的统计规律。
- 实体、概念、属性和关系之间的关联。
- Markdown、JSON、表格、代码、论文、问答等格式模式。
- 常见任务的文本模式,例如翻译、总结、分类、解释和代码补全。
- 数学、代码、因果、条件判断和步骤分解等推理样式。
这些能力不是以显式规则或数据库条目的形式存储,而是分布在模型参数(即所谓的模型权重)中。
1.2 Next Token Prediction
模型生成文本时,本质上仍是在当前上下文下预测下一个 token,而不是默认检索一个可验证的事实库。
语言模型预训练通常把一段 token 序列拆成多个预测位置:
上下文: 大型
目标: 语言
上下文: 大型 语言
目标: 模型
上下文: 大型 语言 模型
目标: 通过
训练时,模型对词表中所有 token 输出 logits,经 softmax 得到概率分布。真实的 next token 的概率越高,交叉熵损失越低。
粗略地说,预训练的优化目标,是 最大化训练语料中真实 token 序列的条件概率。
在规模足够大、数据足够多样时,这个目标会迫使模型学习大量隐含结构。虽然看起来只是预测下一个 token,但为了降低 loss,模型必须建模语法、语义、实体关系、上下文依赖、文档结构和代码结构才能达到目标。
1.3 自监督学习
预训练通常属于自监督学习(self-supervised learning)。
它不需要人工为每条样本写标签,因为监督信号来自文本本身:每个位置的下一个 token 就是训练标签。
这也是预训练能够扩展到万亿级 token 的前提。
2. 数据体系
预训练作为自监督学习,使用文本本身作为标签,但"标签自动生成"并非表示数据没有成本。
真正的成本集中在数据收集、授权确认、格式解析、质量过滤、去重、敏感信息清理、数据配比和评估隔离上。
2.1 数据来源与配比
预训练数据通常由多类语料混合而成。不同数据源会强化不同能力,也会引入不同风险。
| 数据类型 | 主要价值 | 主要风险 |
|---|---|---|
| 网页文本 | 覆盖面广,语言现象和知识密度高 | 噪声、重复、模板页、错误信息 |
| 书籍和长文档 | 篇章结构完整,长程依赖更强 | 版权、授权、版本和来源记录 |
| 论文和技术文档 | 专业知识密度高,术语体系稳定 | 领域偏斜,格式解析复杂 |
| 代码仓库 | 提升代码生成、结构化推理和工具使用能力 | 许可证、密钥泄漏、重复代码 |
| 问答和论坛 | 接近真实用户表达和问题分布 | 错误答案、攻击性内容、低质量讨论 |
| 数学和合成数据 | 强化符号推理、格式和可验证任务 | 模板化、分布不自然、过拟合生成器风格 |
| 多语言语料 | 提升跨语言理解和生成能力 | 低资源语言质量、比例和覆盖难控制 |
数据配比会显著影响模型能力边界。比如:
- 代码占比提高,通常有利于代码生成和结构化输出;
- 高质量中文语料增加,中文表达和中文知识问答会更稳定;
- 长文档比例提高,可能改善篇章建模,但也会增加训练成本和上下文组织难度。
2.2 清洗、过滤与去重
原始语料不能直接用于预训练。常见处理环节包括:
- 格式解析:从 HTML、PDF、代码仓库、文档和表格中抽取可训练文本。
- 质量过滤:删除乱码、模板页、广告、低信息密度内容和机器生成垃圾文本。
- 语言识别:识别语种并控制不同语言和地区语料比例。
- 安全过滤:移除明显违法、有害、攻击性或恶意代码内容。
- 隐私过滤:检测并移除手机号、邮箱、证件号、密钥、token、内部地址等敏感信息。
- 去重:删除完全重复、近似重复和模板化重复内容。
- 文档切分:按长度、段落、语义边界和训练窗口约束切成样本。
去重尤其关键,它不仅提高 token budget 使用效率,也降低评估污染风险。
2.3 Tokenizer 与语料编码
训练前需要确定 tokenizer。
Tokenizer 决定文本如何切成 token,也决定词表覆盖哪些语言、符号、代码片段和特殊控制符。
Tokenizer 会影响:
- 中文、英文、代码和符号的压缩效率。
- 同样上下文窗口可容纳的信息量。
- 训练和推理成本。
- 低资源语言、专业术语和混合文本的处理效果。
- 代码缩进、空格、特殊符号和结构化格式的稳定性。
通常做法是在代表性语料上训练或选择 tokenizer,再把全部训练数据编码为 token ids。
Tokenizer 一旦确定,预训练、后训练和部署必须保持一致,否则 token id 语义会错位。
3. 训练流程与工程约束
3.1 基本流程
一个简化的预训练流程如下:
原始语料
-> 清洗、过滤、去重
-> tokenizer 编码
-> 组成 token 序列和训练 batch
-> 模型前向计算 logits
-> 计算 loss
-> 反向传播更新参数
-> 周期性评估和保存 checkpoint
训练时并非逐条文档处理,而是把大量 token 打包成 batch,在多机多卡集群上并行训练。
模型参数、优化器状态、梯度、激活值、数据加载、checkpoint 和通信都会消耗大量显存、内存、存储和网络带宽。
3.2 稳定性与可恢复性
预训练是长周期工程系统,不是一次性脚本。训练过程中需要持续监控:
- 数据吞吐是否匹配 GPU 计算吞吐。
- 多机多卡通信是否稳定。
- checkpoint 是否能可靠保存和恢复。
- loss 曲线是否平稳下降。
- 是否出现梯度爆炸、NaN、发散或异常尖峰。
- 不同数据源采样比例是否符合计划。
- 评估集表现是否和训练 loss 同步改善。
训练系统通常还要处理节点故障、网络抖动、数据损坏、checkpoint 回滚、混合精度数值稳定性和长时间训练中的随机性复现问题。
3.3 Scaling Law 与预算分配
Scaling Law 讨论模型规模、训练 token 数、计算量和性能之间的关系,它要求在给定预算下平衡:
- 参数量:模型可表达和存储的模式容量。
- 训练 token 数:模型见过的有效样本规模。
- 计算量:训练过程中可执行的有效更新。
- 数据质量:单位 token 对能力提升的贡献。
实际上:
- 如果模型很大但训练 token 不足,可能欠训练或过度记忆;
- 如果数据很多但模型容量不足,能力上限会受限;
- 如果计算预算不足,训练可能尚未充分收敛就停止。
4. 指标、评估与污染控制
4.1 Loss 与 Perplexity
预训练最常见的损失函数是 token-level cross entropy loss。
对单个 token 来说,如果真实 token 的预测概率为 p,损失可写作 loss = -log(p)。
平均 loss 越低,说明模型在训练目标上越能预测真实 token。
Perplexity 是 loss 的另一种表达。如果 loss 使用自然对数,那么 perplexity = exp(loss)。
两者单调对应:
- loss 越低,perplexity 越低。
- perplexity 越低,模型面对该文本分布时越“不困惑”。
但低 loss 或低 perplexity 不等于模型一定好用。原因包括:
- 训练集 loss 低可能来自记忆训练数据。
- 通用语言建模 loss 下降不一定提升具体业务任务。
- 聊天、工具调用、安全拒答、事实引用和格式稳定性需要专项评估。
- 数据污染会使 benchmark 指标虚高。
4.2 评估隔离与数据污染
数据污染是预训练和继续预训练中最容易破坏评估可信度的问题。常见污染形式包括:
- benchmark 题目或答案进入训练集。
- 评估集的改写版本进入训练集。
- 测试用业务样本被用于继续训练。
- 在线用户反馈未隔离,回流到下一轮训练集。
- RAG 检索语料与评估答案之间存在重叠。
降低污染风险的做法:
- 在训练前冻结评估集版本。
- 对训练集和评估集做精确去重与近似去重。
- 按时间、来源、客户或项目切分数据。
- 对公开 benchmark 做专项过滤。
- 保留数据版本、过滤规则、样本来源和处理流水线记录。
评估可信度和模型能力同等重要。没有干净评估集,就很难判断一次训练带来的是真实泛化提升,还是记住了测试答案。
5. 预训练获得的能力与边界
5.1 参数化知识与表示能力
预训练学到的不是一个显式知识库,而是参数中的统计规律、表示能力和生成分布。可以分为几个方面:
| 层次 | 模型学到的内容 |
|---|---|
| token 和字符模式 | 拼写、标点、分词、代码符号 |
| 局部语言规律 | 词语搭配、语法结构、短句表达 |
| 长程依赖 | 指代、主题延续、段落结构 |
| 世界知识 | 常见事实、实体属性、概念关系 |
| 格式模式 | Markdown、JSON、表格、论文、代码 |
| 任务模式 | 翻译、总结、问答、解释、分类等文本模式 |
| 推理模式 | 步骤分析、类比、条件判断、数学和代码模式 |
这里我们需要严格区分的是"模型参数中编码了某种统计关联"和"模型能稳定、可验证地调用正确事实":预训练模型输出的是概率上合理的文本,不是事实。
5.2 幻觉与事实边界
幻觉的根源之一在于训练目标本身。
Next token prediction 让模型擅长生成语言上合理的后续内容,但它不天然验证内容是否真实、最新或有来源。
当上下文缺少证据时,模型仍然会继续生成:它可能基于相似模式补全一个流畅答案,但该答案并不一定符合事实。
降低这类风险通常的做法有:
- 在系统层面接入 RAG、工具或数据库。
- 要求模型基于给定证据回答。
- 对事实性、引用和不确定性做专项评估。
- 在后训练阶段加入拒答、不确定性表达和证据使用规范。
6. 与后训练、继续预训练和 RAG 的关系
6.1 Base Model 与 Chat Model
Base model 主要学习续写文本分布。
给它一段对话格式,它可能生成回答,也可能继续补全对话、扩写格式或生成不符合产品预期的内容。它未必稳定理解角色边界。
Chat model 通常需要经过后训练来获得:
预训练 base model
-> 指令微调 / SFT
-> 偏好优化 / 强化学习
-> 安全与格式评估
-> chat model
后训练让模型学习:
- 区分 system、user、assistant 等角色。
- 按指令完成任务。
- 控制语气、格式、长度和拒答边界。
- 在多轮对话中保持一致。
- 在多个可接受答案中偏向更符合人类或业务偏好的答案。
因此,不能把"预训练能力强"和"产品可用"混为一谈。
简单地说,预训练提供基础能力,后训练决定交互方式和行为边界。
6.2 不同训练与知识接入方式
| 方法 | 主要目标 | 数据形式 | 训练信号 / 机制 | 典型产物或效果 |
|---|---|---|---|---|
| 预训练 | 学习通用语言、知识、格式和代码模式 | 大规模原始文本、代码、文档 | next token loss | Base model |
| 继续预训练 | 补充领域语料分布和术语体系 | 大量领域文本、代码或专业文档 | next token loss | 领域 base 或中间模型 |
| 指令微调 / SFT | 学会按指令完成任务和输出格式 | 指令 + 标准回答 | 模仿高质量答案 | Instruct model |
| 偏好优化 / 强化学习 | 让回答更符合人类或业务偏好 | chosen/rejected、reward、verifier | 偏好或奖励信号 | 更对齐的 chat model |
| RAG | 接入最新、私有、可追溯知识 | 外部文档库、数据库、检索结果 | 推理时注入上下文 | 可更新、可引用的知识问答 |
选择方式时应先判断问题类型:
- 模型不熟悉领域术语、文档风格或代码库分布:考虑继续预训练。
- 模型不按任务格式回答、不稳定遵循业务规范:优先考虑 SFT。
- 多个回答都可用,但需要更符合偏好、安全或质量标准:考虑偏好优化或强化学习。
- 知识经常变化、需要来源可追溯或涉及私有资料:优先考虑 RAG。
7. 风险、实践要点与总结
7.1 主要风险
预训练和继续预训练的核心风险包括:
| 风险 | 说明 | 控制方式 |
|---|---|---|
| 数据质量不足 | 低质量网页、重复模板、错误答案会降低训练效率 | 质量过滤、来源分层、抽样审计、分源 loss 监控 |
| 数据偏差 | 语种、地区、行业或观点分布失衡会影响输出倾向 | 控制语料配比,构造覆盖不同场景的评估集 |
| 版权与授权 | 书籍、论文、代码和网页数据可能有使用限制 | 记录来源和授权,区分可训练、可检索、可展示权限 |
| 隐私与密钥泄漏 | 训练语料可能包含 PII、API key、内部资料 | PII 检测、secret filtering、脱敏和输出回归测试 |
| 评估污染 | 评估样本或相似样本进入训练集 | 固定评估集、训练前去重、benchmark 专项过滤 |
| 能力退化 | 继续训练可能损害原模型通用能力 | 保留通用回归集,监控领域能力和通用能力权衡 |
7.2 实践路径
如果要做预训练或继续预训练,建议按以下顺序推进:
- 明确目标:通用模型、领域模型、代码模型、多语言模型还是继续预训练。
- 建立评估集:覆盖通用能力、目标领域、安全、格式、长上下文和回归样本。
- 做数据审计:确认来源、授权、质量、重复率、敏感信息和评估污染风险。
- 小规模试训:验证 tokenizer、数据管道、loss 曲线、checkpoint 恢复和评估稳定性。
- 扩大规模:逐步增加 token 数、模型规模、训练时长和数据源覆盖。
- 比较基线:同时观察训练 loss、固定评估集、人工抽检和线上任务指标。
- 保留可复现记录:数据版本、配比、过滤规则、代码版本、随机种子、训练参数和 checkpoint。
对大多数应用团队来说,从零预训练成本过高。更常见的路线是:
选择合适开源或商用基座模型
-> 用 RAG 接入可更新知识
-> 用 SFT 固化任务格式和行为规范
-> 用偏好优化改善回答质量
-> 用评估体系持续回归
7.3 总结
理解预训练可以抓住几条主线:
- 核心目标是 next token prediction。
- 数据质量、配比、清洗和去重决定训练上限。
- Tokenizer 会影响压缩效率、上下文容量、多语言表现和成本。
- Loss 与 perplexity 是训练指标,但不能替代真实任务评估。
- Base model 不等于 chat model,后训练负责指令跟随、偏好对齐和安全边界。
- 继续预训练、SFT、偏好优化和 RAG 解决的问题不同,不能互相简单替代。
- 数据污染、隐私、版权和偏差必须从数据阶段控制。