主题
预训练:下一个 token 与扩展规律
一句话:预训练用“预测下一个 token”把海量无标注文本变成训练信号,一次前向就能对每个位置算损失;它把语言规律、事实关联和推理捷径压进权重,换来通用能力,代价是数据、算力,以及一个只优化“像不像文本”而不保证“对不对”的目标。
为什么需要
监督学习需要标签,但互联网上的文本没有“这段话说得对不对”的标注。下一个 token 预测把这个问题绕开了:任何一段文本,每个位置的下一个词都是现成的标签。一句话有 T 个 token,就产生 T 个预测任务,不需要人工标注。
更关键的是,要把下一个词预测得足够准,模型必须学到比“词频”更多的东西:语法结构、实体关系、事实知识、代码语法、论证模式,甚至一些推理步骤。预测是压缩,压缩迫使模型找到数据里的规律。这就是“只会预测下一个词”却能表现出通用能力的原因。
但这条目标也有天然边界:它优化的是给定上下文时下一个 token 的似然,不是事实正确性、任务完成度或安全性。模型可以生成一个语法完美、概率很高但事实错误的句子;幻觉不是训练失败,而是目标函数没有“必须真实”这一项。
核心机制
一、目标函数
给定 token 序列 x₁, x₂, …, x_T,模型在每个位置输出词表上的概率分布:
text
p(x_t | x_1, …, x_{t-1})
Loss = −(1/T) · Σ log p(x_t | x_<t)训练时整段序列一次送入,因果掩码保证第 t 个位置只能看见前面的 token;一次前向就得到所有位置的预测,再和真实的下一个 token 算交叉熵。这叫 teacher forcing:无论模型上一步预测对错,下一步的输入都用真实 token,训练可以完全并行。
交叉熵衡量的是“给正确 token 分配了多少概率”。正确 token 的概率越低,损失越大;梯度会提高它的 logit、压低其他 token 的 logit。损失下降只说明模型更能拟合训练分布,不直接等于任务能力,见 调优:归因、数据飞轮与黄金集。
二、模型到底学到了什么
预训练权重里至少有三类东西:
- 统计规律:哪些词常一起出现,哪些句式常见;
- 世界知识:实体、属性、关系,以参数关联的形式存储;
- 算法模式:复制、归纳、类比、简单的多步推理。研究者在小模型里观察到“归纳头”(induction head)这类电路,能做“看到 A B … A,预测 B”的模式补全。
这些能力是涌现的、分布相关的:它们在训练数据覆盖的分布内有效,换一个领域、换一种表述就可能失效。模型学到的不是一套符号规则,而是对数据生成过程的近似;这也是为什么提示词、上下文和示例会显著改变表现。
三、训练配方
预训练不是“把数据灌进去”这么简单,稳定的配方通常包括:
| 组件 | 作用 | 常见做法 |
|---|---|---|
| 优化器 | 更新权重 | AdamW,β₂ 常设 0.95–0.98 |
| 学习率 | 控制步长 | warmup 后余弦衰减;warmup 防早期发散 |
| 精度 | 省显存、提吞吐 | BF16/FP16 混合精度,损失和归一化用 FP32 |
| 梯度裁剪 | 防爆炸 | 按全局范数裁剪 |
| 批次 | 稳定梯度 | 大 batch,配合学习率缩放 |
| 数据 | 决定能力上限 | 去重、质量过滤、领域配比、去污染 |
数据侧的工作往往比模型结构更影响最终效果:重复数据会让模型死记硬背,低质量文本会教坏风格,测试集泄漏会让评测虚高。预训练的数据配比是产品决策,不是单纯的技术参数。
四、扩展规律
Kaplan 等人在 2020 年给出经验规律:模型损失随参数量、数据量、计算量呈幂律下降。2022 年的 Chinchilla 进一步修正了配比:在固定计算预算下,参数量和数据量应该同步增加,大约每个参数配 20 个 token 是计算最优的。
但“计算最优”不等于“部署最优”。推理成本由参数量决定,数据多、参数少的模型在同样能力下更便宜。所以近年的模型普遍“过度训练”:Llama 3 8B 用了 15T token,约合每个参数 1875 个 token,远高于 Chinchilla 的 20 倍。代价是训练更贵,收益是推理更便宜、小模型能力更强。
| 模型 | 参数量 | 训练 token | token/参数 | 取向 |
|---|---|---|---|---|
| Chinchilla 最优 | 70B | 1.4T | 20 | 训练成本最优 |
| Llama 3 8B | 8B | 15T | 约 1875 | 推理成本最优 |
这张表说明:scaling law 给的是方向,不是唯一答案。训练多少 token,取决于你把成本花在训练还是推理、模型要部署在哪里。
五、从 base model 到可用模型
预训练产出的是 base model:它只会补全文本,不会遵循指令,也不会用工具。要变成助手,还需要后训练:
- SFT(监督微调):用“指令 → 回答”的样本教它对话格式和任务模式;
- 偏好优化:RLHF、DPO 等,用人类或模型偏好让输出更符合期望;
- 工具与 Agent 训练:在轨迹上做 SFT/RL,教它调用工具、处理反馈、长程推进。
后训练改变的是行为分布,不改变“下一个 token 预测”这个底层目标。Agent 需要的工具协议、停止条件、权限边界,仍然主要靠 Harness 和系统约束保证,不能指望预训练权重。
图中训练循环的输入是“前 t-1 个 token”,监督信号是“第 t 个 token”,一次前向覆盖所有位置。循环产出 base model,后训练再把它变成会对话、会调工具的模型;两层目标不同,不能互相替代。
最小上手
用 numpy 算一次交叉熵和它的梯度,确认“损失对 logits 的梯度 = 概率 − one-hot”:
python
import numpy as np
def softmax(z):
e = np.exp(z - z.max())
return e / e.sum()
logits = np.array([2.0, 1.0, 0.1])
target = 0
p = softmax(logits)
loss = -np.log(p[target])
grad = p.copy(); grad[target] -= 1
print(f"p={p.round(3)} loss={loss:.3f} grad={grad.round(3)}")
for name, params, tokens in [
("Chinchilla 20×", 7e9, 20 * 7e9),
("Llama-3-8B", 8e9, 15e12),
]:
print(f"{name}: {tokens / params:.0f} tokens/param")输出:
text
p=[0.659 0.242 0.099] loss=0.417 grad=[-0.341 0.242 0.099]
Chinchilla 20×: 20 tokens/param
Llama-3-8B: 1875 tokens/param第一行说明:正确类别的概率是 0.659,损失 0.417;梯度在正确类别上是负的(提高它),在其他类别上是正的(压低它们)。后两行把“每个参数配多少 token”换算成直观倍数,方便判断一个模型的训练/推理成本取向。
生产动作
- 不要轻易从零预训练。除非有独特数据、充足算力和训练团队,否则基于开源 base/instruct 模型做继续预训练或微调更现实。
- 领域继续预训练先做数据。去重、质量过滤、领域配比、去污染四件事做完,再谈学习率和训练步数;小学习率、短步数,防止灾难性遗忘。
- 换分词器要扩嵌入。新增 token 必须扩展嵌入矩阵和输出层,并继续训练;否则新 token 的向量是随机的。
- 困惑度不是任务指标。困惑度低只说明更拟合语言分布,业务效果要另建评测集,见 黄金集。
- 查数据污染。训练集和评测集重叠会让分数虚高;至少做 n-gram 重叠检查,公开榜单不能替代自己的回归集。
边界
- 下一个 token 不等于真相。目标函数没有事实性约束,模型会用流畅的方式补全错误内容;幻觉是机制性的,不是偶发 bug。
- scaling law 是经验规律。它描述的是训练分布内的平均趋势,换数据分布、换架构、换评测方式都可能偏离;不能拿参数量直接推业务能力。
- 计算最优不等于部署最优。训练预算固定的最优点,和推理成本、延迟、显存约束下的最优点不是同一个。
- 数据质量决定上限。更多低质量数据可能让模型更差;去重和过滤的收益经常大于调结构。
- 预训练学不会企业私有事实和工具协议。这些要靠 RAG、SFT、上下文和 Harness,不能指望模型“自己知道”。
讲清楚
预训练把每段文本变成“预测下一个 token”的训练任务,用交叉熵一次监督所有位置。要预测得准,模型必须压缩语法、事实和推理模式,所以通用能力是压缩的副产品;但目标只优化似然,不保证事实、任务完成或安全,幻觉由此而来。
规模上,Chinchilla 给出“每参数约 20 token”的计算最优点,而部署更看重推理成本,所以现代小模型普遍过度训练。预训练产出 base model,SFT、偏好优化和工具轨迹再把它变成可用助手,三条奖励路线的区别见 08-后训练与对齐;企业事实、工具协议和权限边界仍然要靠外部系统,而不是权重本身。
适用:Decoder-only 大模型预训练与继续预训练;配比与规模以具体模型报告为准 | 初稿 2026-10