预训练
在海量无标注文本上自监督学习,一次性把「通用能力」灌进模型
Pre-training · 预训练
- 为什么「预」——为什么不直接针对任务训练,而要先来一步「预」训练。
- 怎么训——这份「通用底子」具体是怎么学出来的。
- 凭什么——只是预测下一个 token,怎么就灌进了语言、常识、推理。
- 产出什么——预训练完,得到的是能直接用的助手吗。
- 为什么贵——为什么只有少数机构做得起预训练。
- 针对任务直接训练又贵又窄,于是先学通用底子、再适配任务——这就是「预」训练。(§1)
- 它用数据自身构造监督信号:自回归模型预测下一 token,其他架构也可用掩码、对比或重建目标,因此能利用大规模无标注数据。(§2)
- 每个位置以 −ln p 贡献损失,整段文本自动产生密集监督;梯度让正确 token 的相对概率上升。(§3)
- 预测目标迫使模型压缩许多可复用结构,但能力与数据、规模和任务分布共同决定。(§4)
- 产出的是博学但不听话的基座,还需微调+对齐才成助手。(§5)
- 预训练同时消耗数据、算力、通信与工程时间,所以多数团队复用基座再适配。(§6)
1为什么要「预」训练直觉
直接针对某个具体任务训练模型,表面上是最近的路,实际却要付出两笔高昂的代价。第一笔是数据:任务专属训练需要人工标注好的数据,标注成本高、数量有限。第二笔是能力的窄化:这样训练出来的参数只学会了这一小块任务的规律,换一个任务几乎要从头再来。预训练就是为了绕开这两笔代价而设计的两段式思路:先用海量通用数据训练出一个「通用底子」——让模型先学会语言是怎么使用的、世界大致是什么样;然后再针对具体任务做少量调整。「预」字的意义正在于此:在正式面对具体任务之前,先打好通用基础。
把整个任务说完整:预训练的输入是两样东西——大规模通用数据,以及一个尚未学会任何任务规律的模型;输出是一份参数检查点,这份检查点可以直接用于后续微调,也可以直接用来做表示提取。训练过程中发生的机制循环很直接:模型反复从数据自身构造出预测目标,计算损失,再根据损失更新参数。这里值得留意的是「从数据自身构造目标」这个环节——通用数据本身并不携带人工标注的任务答案,目标是从原始数据里自动生成的,这也是预训练能利用海量无标注数据的关键。
因果链的另一端是判断标准。训练损失下降只说明模型记住了训练数据,不能证明「通用底子」已经形成;真正要看的,是模型在训练中从未见过的留出集上的损失,以及多类能力评测的表现。只有当模型在没见过的数据上也能稳定预测、在多种能力上都有起色时,才能说这层通用基础立住了。
这条路线有清晰的适用边界。当目标任务与预训练数据中蕴含的规律高度重合时,预训练积累的广泛规律可以被直接复用,收益最大;但如果目标领域与预训练数据相差很远,通用底子并不直接适用,这时需要做领域适配,甚至应该考虑换用针对该领域的专用模型,而不是硬套通用参数。
用一句话概括这条因果链:先当通才,再当专才。就像人先接受多年通识教育,再做岗前专项培训——通识那一步最贵、最耗时,但只要一次做好,之后各种专项都能快速上手。预训练在整个流程中的地位与此完全一致:它是成本最高、周期最长的环节,也是后续一切专项能力得以廉价获得的前提。
2它具体怎么训数学
这份「通用底子」不是靠人工讲解灌进去的,而是从数据本身构造出监督信号,让模型自己学出来的。这是预训练与任务专属训练最本质的区别:不需要逐样本的人工标签,原始数据就是题目,数据自己携带的部分内容就是答案。
构造信号的主流方式有三类,各自对应不同的输入构造方式、模型输出形式和适用方向。自回归模型做下一 token 预测:给定左侧已经出现的文本作为前缀,模型输出下一个 token 在整个词表上的概率分布,这类目标适合训练自回归生成模型。BERT 类编码器做掩码预测:把序列中的部分 token 遮住,模型输出这些被遮位置对应的词表概率,这类目标适合训练双向编码表示。多模态系统则常用对比或重建目标:输入是配对视图(比如图文对)或被破坏的样本,模型输出匹配分数或还原后的样本,这类目标适合训练视觉与多模态表示。三类目标都在回答同一个问题——怎样让原始数据自己提供学习目标——但它们是不同的算法,不能随意互换:目标决定了模型每一步能看见什么、输出什么,也决定了最终模型更擅长生成、编码还是跨模态匹配。
以自回归训练为例看一次完整的参数更新循环:模型对前缀做完计算,得到下一个 token 的预测分布;用交叉熵衡量这个预测分布与真实的下一个 token 之间的差距——差距越大,损失越高;再对这个损失做梯度下降,把参数朝让预测更接近真实 token 的方向更新。这个循环在海量文本上重复执行,模型就逐步学会了文本序列的统计规律。
「减少人工标签」带来的自由度并不是无限的,它的上限被数据质量卡住。高质量数据本身是稀缺资源:采集许可、清洗、去重、语言与领域的配比,每一个环节都会直接影响最终模型的能力分布、偏见倾向和记忆风险。数据选得差,自监督信号再多也学不出好的通用底子。
验证环节同样要遵守目标与数据的一致性。必须使用与训练目标相符的留出数据来评估损失和表现,不能拿训练损失充数;同时还要额外检查数据泄漏、重复样本,以及训练目标与下游任务之间是否存在错位——目标练的是生成,下游却要求编码,这种错位会直接削弱评估结论的有效性。
把整件事压缩成一句话:预训练,就是在尽可能多的文本上,反复做「预测下一个 token」这一个自监督任务。简单到反直觉,却是整座大厦的地基。
| 预训练目标 | 输入怎样构造 | 模型输出什么 | 适用重点 |
|---|---|---|---|
| 下一 token 预测 | 给定左侧前缀 | 下一 token 的词表概率 | 自回归生成模型 |
| 掩码预测 | 遮住序列中的部分 token | 被遮位置的词表概率 | 双向编码表示 |
| 对比或重建 | 配对视图,或被破坏的样本 | 匹配分数,或还原后的样本 | 视觉与多模态表示 |
3手算一次 next-token 训练信号数值例子
上一节的循环可以在一句文本上完整地手算出来。取文本「猫 喜欢 鱼 <EOS>」(<EOS> 是序列结束符)。训练样本不是把这句文本当作一个整体,而是把序列右移一次、逐位错开:每个前缀都成为一个独立样本,样本的正确答案是紧跟其后的那个 token。于是这一句文本产生三个训练位置:看到前缀「猫」要预测「喜欢」,看到前缀「猫 喜欢」要预测「鱼」,看到前缀「猫 喜欢 鱼」要预测 <EOS>。
假设模型在三个位置上分给正确 token 的概率依次为 0.50、0.25、0.80。每个位置的损失用负对数概率表示:−ln p。第一个位置是 −ln 0.50 ≈ 0.693,第二个位置是 −ln 0.25 ≈ 1.386,第三个位置是 −ln 0.80 ≈ 0.223。这里的直观含义是:概率越低,负对数越大,损失越重;模型最没把握的位置恰好贡献了最大的损失。
把三个位置的损失平均,就得到整句的平均交叉熵:L̄ = (0.693 + 1.386 + 0.223) ÷ 3 ≈ 0.767。符号上,L̄ 表示三个预测位置的平均交叉熵,t 是位置编号,pₜ 是模型在位置 t 分给正确 token 的概率,ln 是自然对数。再把平均交叉熵做指数变换:PPL = exp(L̄) = e^0.767 ≈ 2.15。这里的 exp 是以自然常数 e 为底的指数函数,它把平均负对数损失换算回概率尺度——2.15 可以理解成:在评测数据上,模型平均每步预测下一个 token 时,感觉上像在约 2.15 个等可能候选中做选择。在相同分词器和相同数据上,PPL 越小,通常表示模型越会预测后续 token。
损失算出来之后,参数怎么动?反向传播会同时调整模型中所有共享的参数,使得在相似上下文下,正确 token 的 logit 相对上升。回到第二个位置:如果一次更新后模型给「鱼」的概率从 0.25 升到 0.50,这个位置的损失就从 −ln 0.25 = 1.386 直接降到 −ln 0.50 = 0.693。一个位置的改善立刻反映为整句平均损失的下降,这正是梯度下降在文本序列上运作的最小单位。
这个例子的真正价值在于它揭示了训练信号的密度。训练不是每段文本只提供一个标签,而是一个长度为 L 的序列通常贡献约 L 个 next-token 监督位置。一句十个 token 的文本,大约能切出十个训练样本。海量原始文本乘上这个密度,自动产生了密集到不需要人工标注的训练信号——这是预训练在数据层面能够成立的算术基础。
最后要明确这个指标的边界。低困惑度并不等于事实更真,也不等于助手更好用。它只表示模型在评测文本的分布上更会预测 token。数据污染、死记硬背、只学会风格上的捷径,或者训练目标与真实任务错位,都可能让 PPL 与真实能力分离——指标下降,能力却未必同步提升。
| 前缀 | 正确下一个 token | 正确概率 p | 损失 −ln p |
|---|---|---|---|
| 猫 | 喜欢 | 0.50 | 0.693 |
| 猫 喜欢 | 鱼 | 0.25 | 1.386 |
| 猫 喜欢 鱼 | <EOS> | 0.80 | 0.223 |
4凭什么这一步能灌进这么多能力直觉
最关键的疑问是:只是预测下一个 token,怎么就学到了语法、常识,甚至推理?答案在于预测任务对表示施加的约束强度。模型面对的是跨主题的海量样本,前缀无穷多、组合无穷多。为了在大量不同文本上同时降低预测误差,模型不能只靠死记——只背下某一句,无法解释无穷多从未见过的新前缀为什么也能预测准。唯一能让损失持续下降的出路,是形成可以复用的内部结构:语法的规律、语义的关联、代码的结构、事实之间的共现模式。于是训练的直接产出是更低的损失和一套更新后的内部表示;翻译、代码或推理成绩,则是这套表示被提示词和评测任务调用之后的外部表现。
这里必须把「会续写推理文本」和「可靠推理」分开。模型可能真的复用了抽象规律,也可能只是记住了模板、利用了表面线索。判断标准要看泛化的证据强度:如果在新组合的题目、反事实的题目和分布外样本上仍然稳定答对,说明掌握的是可以迁移的规律;如果只在熟悉的格式上成功,就不能声称学到了通用算法。
规模在这个因果链里的位置同样值得说清楚。增加参数量、数据量和算力,通常能平滑地降低预测损失,并可能让某些能力越过「可用」的阈值——这类经验关系被称为缩放定律。但缩放定律描述的是趋势,不是保证。规模不是充分条件:数据质量、训练目标的设计、模型结构、评测口径,任何一环的变化都会改变最终结果。「更大」不自动意味着事实更可靠,也不自动意味着对所有人更公平。规模提供的是潜力的上限,把潜力兑现成能力,仍取决于前面的每一个设计选择。
5产出的是「基座模型」工程
预训练跑完,是不是就得到了一个能直接使用的助手?还不是。这个阶段结束时得到的是一份基座模型检查点:知识渊博,但不听话。你问它一个问题,它可能顺着「文本通常怎么接下去」的惯性,续写出更多问题,而不是给出回答。原因在于训练目标本身——它只学了文本序列的概率规律,从没学过「被提问时应该回答」这条行为规范。
要把基座模型变成能对话的助手,还需要后面两步训练:指令微调教它「被问就答」,偏好对齐教它答得既有用又安全(详见「微调」「对齐」两个深读页)。于是这一阶段的边界变得清晰:输入是预训练数据流,输出是基座模型检查点及其训练记录;「能续写、留出集损失低」说明语言建模目标取得了进展,并不说明模型已经会遵循指令。
从海量文本到基座模型再到助手,这条链路的分工可以记成两句话。预训练负责灌进「知识与能力」,得到博学但不听话的基座;微调与对齐负责校准「行为」,把基座变成日常使用的助手。三步缺一不可。再压缩一步:预训练决定「会什么」,微调与对齐决定「怎么表现」——模型绝大部分知识和能力,都是在预训练这一步灌进去的。
还要守住一条边界:后续训练可以改变模型的回答习惯和偏好,却不能保证事实正确。基座知识再多,也仍然是概率性的统计知识,不是经过验证的事实库。高风险用途必须依赖独立的评测、检索或工具验证,不能因为「这模型预训练数据很多」就免除核查。
6它为什么这么贵工程
预训练之所以关键,是因为它是能力的主要来源;它之所以贵,是因为把这份能力灌进去要同时烧掉四类资源。前沿通用模型的从头预训练要消耗大规模数据、加速器集群和长期工程投入,成本通常只有少数机构能承担——但要注意,「小模型预训练」并非绝对做不起,贵的是前沿规模的那一档,而不是预训练这件事本身。
四类成本来源各有不同的增长逻辑。计算与显存:参数和 token 越多,需要的前向与反向计算就越多,这直接决定训练时长和加速器集群的规模。通信:多台设备必须不断同步梯度、参数或激活,网络一旦成为瓶颈,集群利用率就会被拖低,机器在等数据而不是在算。数据工程:采集、许可、过滤、去重和配比需要反复迭代,它不直接体现在算力账单上,却决定模型的污染程度、偏见倾向和长尾覆盖质量。失败与验证:硬件故障、数值异常、坏批次都会中断动辄数月的长训练,必须配套检查点、监控和恢复系统,否则一次中断可能损失大量已完成的训练进度。
做预算规划时,输入端是目标模型规模、训练 token 数、硬件效率和数据方案,输出端是预计计算量、时间、成本以及可恢复的检查点计划。其中有一笔预算最容易被忽视:总训练预算要在参数量与 token 数之间合理分配。Chinchilla 等工作表明,只增加参数而训练数据不足,并非计算最优——模型够大但没看够数据,等于把算力花在了喂不饱的容量上。
读训练过程的状态也要分清因果。实际吞吐低于理论峰值,不一定表示模型设计错误,也可能是通信或数据管线存在瓶颈;反过来,训练跑得飞快,也不代表数据和能力质量达标。速度快只说明工程效率,不说明模型学得好。
既然从头预训练这么贵,绝大多数人不会自己重来一遍,而是站在别人预训练好的模型上做微调——这就是迁移学习:花很小的代价,借用了那份天价的通用底子(见「微调」深读页)。预训练与微调因此形成一种分工:一次昂贵的通才养成,配合无数次廉价的专才适配。在具体场景里选哪条路,要按数据量、任务差异和预算权衡:数据少、任务和预训练领域接近,直接微调最划算;数据多且领域特殊,小规模领域模型或继续预训练才值得考虑。
| 成本来源 | 为什么会增长 | 工程结果 |
|---|---|---|
| 计算与显存 | 更多参数和 token 需要更多前向、反向计算 | 决定训练时长与加速器规模 |
| 通信 | 多设备要同步梯度、参数或激活 | 集群利用率可能被网络拖住 |
| 数据工程 | 采集、许可、过滤、去重和配比需反复迭代 | 决定污染、偏见和长尾覆盖 |
| 失败与验证 | 硬件故障、数值异常和坏批次会中断长训练 | 需要检查点、监控和恢复系统 |
7把整条因果链连起来综合
把前面各环串起来,预训练整条因果链是连贯的。起点是一个经济判断:针对任务直接训练,又贵又窄,于是改成先学通用底子、再适配任务——「预」训练的两段式由此成立。
通用底子怎么学?靠数据自身构造监督信号。自回归模型预测下一 token,其他架构可用掩码、对比或重建目标,总之不依赖人工标注就能从大规模无标注数据里获得学习信号。信号落在每个位置上:每个位置以 −ln p 贡献损失,一段文本右移一次就自动产生密集的监督位置;梯度下降再让正确 token 的相对概率逐次上升。微观的算术在宏观上积累出一个约束:预测目标迫使模型压缩出大量可复用的结构——语法、语义、代码结构与事实共现。但这一步不承诺结果自动变好,最终能力由数据、规模与任务分布共同决定。
链的末端产出的是基座模型:博学但不听话,因为语言建模目标从没教过它「被问就答」。要成为助手,还需微调与对齐两步。而整条链的成本结构——数据、算力、通信与工程时间的多重消耗——解释了为什么多数团队不从头训练,而是复用现成基座再做适配。
抓内核可以用两个问题自检:能不能讲清预训练为什么不用标注就能学到这么多;能不能说出基座模型和对话助手之间差的是哪两步。这两个问题都能答上来,这条链才算真正握在手里。
10概念依赖与延伸学习路线
进入预训练之前,有四块先修地基需要先站住:监督学习——它给出了「从数据构造损失、用梯度更新参数」的基本循环;自监督学习——它解释了如何从数据本身造出监督信号,这正是预训练的核心机制;大语言模型与 Transformer——它们决定了模型的结构、容量和序列建模方式。有了这些,预训练页的四个核心概念才落得下来:两段式(预训练→微调)的总体路线、自监督预测下一个词的具体目标、基座模型这一中间产物,以及通才与专才的能力分工。
紧邻的延伸概念沿着链条两侧展开。往「训练之后」走是微调、指令微调与对齐:基座模型正是在这里被塑造成会听话、有用的助手。往「训练规模」走是缩放定律:它描述参数、数据、算力与损失之间的经验关系,是理解预训练为什么需要如此大规模投入的钥匙。更远的延伸则触及规模化应用与工程现实:合成数据补足高质量数据的稀缺,蒸馏把大模型的能力压缩进更小的模型,量化与部署则决定训练好的模型最终以什么代价跑到用户手里。
| 学习层级 | 涉及概念 |
|---|---|
| 先修 | 监督学习、自监督学习、大语言模型、Transformer |
| 本页核心 | 两段式(预训练→微调)、自监督预测下一个词、基座模型、通才 vs 专才 |
| 紧邻延伸 | 缩放定律、微调、对齐、指令微调 |
| 更远 | 合成数据、蒸馏、量化与部署 |
- Brown et al., Language Models are Few-Shot Learners:自回归预训练与上下文学习。
- Devlin et al., BERT:掩码语言建模说明预训练目标并不只有下一 token 预测。
- Hoffmann et al., Training Compute-Optimal Large Language Models:模型规模与训练 token 数的计算最优权衡。