如果你问我,“LLM 训练”到底在做什么,我会先让你想象一块蛋糕出炉的全过程。第一次训练自己的小模型时,我盯着终端里跳动的 loss 曲线,怎么也想不明白自己到底在干什么:数据、参数、学习率、优化器,每一个词单独搜都能看懂,但合在一起就变成了另一种语言。后来我用 Baking a Model 这个比喻,把 LLM(Large Language Model)Training 的预训练、监督微调和对齐阶段重新梳了一遍,才真正找到一种“知道下一步在等什么”的节奏。
这个比喻并没有把训练说得幼稚。相反,它把一条很长、很多环节不可见的流程,压缩成了几个可以操作、可以检查、可以失败重来的抽屉。我想分享给你的一个主判断是:LLM 训练之所以让人发怵,不是因为它缺少公式,而是因为你在大多数时候看不到“蛋糕内部”,只能靠外围信号判断。烘焙恰好就是一套训练人类处理黑箱直觉的方法。与其一头扎进梯度推导,不如先用蛋糕的流程感,把训练地图建出来。
1. 为什么这个比喻能帮你理解训练,而不是逃进公式
1.1 训练不是单一动作,而是一条有阶段产物的流水线
很多初学者对 LLM 训练的第一个误解,是把“训练”当成一个瞬间完成的动作。实际上,训练更像一条流水线:先有原料配方,再放进一个昂贵且温度不能乱调的烤箱,等蛋糕胚烤熟后,还要裱花、装饰、试吃,最后才能端上桌。
这条流水线有个关键特点:每个阶段都有不同的产物。预训练结束,你得到的是“蛋糕胚”,也就是 base model;它能补全文本、有语言能力,但未必会好好回答你的问题。接下来做指令微调或对齐,你得到的是能对话、能遵循指令的模型,相当于裱好花、放上水果的蛋糕。很多人把 base model 当成成品直接上线,就像把没装饰的蛋糕胚端上生日宴,能吃,但体验很怪。
烘焙比喻能帮你建立“阶段产物”的意识:不要在蛋糕胚阶段就要求它给你一个完美的客服回答,也不要在裱花阶段期待它能突然学会新的知识。每个阶段的目标不同,判断标准也不同。这个意识,比记住十个训练参数都更有用。
1.2 配方、烤箱、裱花,构成了训练认知地图
我在给团队讲训练流程时,通常会画这样一张表:
| 烘焙流程 | 烘焙决策 | LLM 训练对应 | 关键信号 |
|---|---|---|---|
| 写菜谱 | 配方、克数、原料比例 | 数据配比、tokenizer、语料来源 | token 分布、去重率、数据规模 |
| 预热烤箱 | 温度、上下火、烤盘位置 | 学习率、warmup、初始化、分布式策略 | 初始 loss 是否按预期下降 |
| 烘烤 | 时间、火候、不开烤箱门 | 预训练步数、batch size、优化器 | loss 曲线、grad norm、eval loss |
| 出炉测试 | 用牙签扎蛋糕中心 | checkpoint 验证、小样本评测 | eval 指标、生成质量 |
| 裱花装饰 | 奶油、水果、写字 | SFT、RLHF/DPO、指令微调 | 指令跟随、对话流畅度、偏好得分 |
| 上桌试吃 | 调整口味、摆盘 | 评测、A/B 测试、用户反馈 | benchmark、人工评分、线上反馈 |
这张表最有用的地方,是帮我在问题出现时快速定位:到底是配方坏了、烤箱坏了,还是裱花手抖?你不会因为蛋糕裱花不好看,就去重新买面粉;同样,模型生成质量差,也不一定要立刻改模型结构,而应该先判断问题出在数据、训练过程,还是对齐策略。
注意:烘焙比喻是认知脚手架,不是机器学习课程的替代品。它的价值是让你先看懂流程,再往流程里填充公式和代码。
2. 配方与原料:数据配比决定蛋糕胚的底子
2.1 原料各司其职,模型偏科往往因为数据偏科
蛋糕配方不是把面粉、糖、鸡蛋、黄油随便搅在一起就行。面粉提供结构,鸡蛋帮助凝结,黄油带来湿润口感,糖不只是甜,还影响上色和保质期。每种原料都有不可替代的作用。
训练数据也一样。代码数据帮助模型建立逻辑和结构化表达能力,数学数据提高推理严谨性,书籍和百科提供长文知识与世界常识,对话数据让模型更自然地和用户交互。你把它们按什么比例混合,直接决定蛋糕胚的口感取向。
我见过一个典型的失败案例:某团队想做一个代码助手,于是把训练数据中的代码比例拉得很高。结果模型确实很懂代码续写,但用户一句“帮我写个带注释的函数”,它生成的注释全是英文模板,自然语言部分僵硬得不行。原因不复杂:数据太偏科,模型没有学会在代码与自然语言之间平滑切换。
所以,处理数据时不要只盯“总量”,更要看“配比”。不同来源的数据量差异很大,直接混在一起会让大语料淹没小语料。通常的做法是设置采样权重,让每个 domain 按目标比例出现,而不是按原始文件大小出现。这个细节决定模型是“均衡发展”还是“单科突出”。
2.2 清洗、去重、配比,不是可有可无的预处理
数据配比听着简单,落地时有几个环节最容易出问题。
第一是清洗。很多爬下来的文本里夹着模板残留、乱码、重复的页眉页脚、无意义的超链接。这些噪声不会让模型“学坏”,但会占用大量上下文窗口,让模型把不重要的格式当成语言模式。清洗阶段至少要做的动作包括:去 HTML 标签、去重复段落、过滤异常字符、按长度和语言做规则过滤。
第二是去重。重复数据会让模型在某个表达上过度自信,生成时出现复读机现象。你可以先用 MinHash 或 SimHash 做近似去重,再用精确匹配删掉完全一样的样本。对代码数据还要额外小心,GitHub 上大量 fork 仓库会造成很多重复,直接影响代码生成质量。
第三是切分。很多人把训练集和验证集随便随机切一下就开始训练,但如果在去重之前切分,同一个文件的多个副本可能会同时出现在训练集和验证集里,eval loss 会虚低,让你误以为模型很强。正确顺序是先全量去重,再按文档粒度或时间戳切分。
我一般会建议团队在动手训练前,先花一周时间把 1% 的数据抽样出来人工看一遍。这不是浪费,而是像烘焙前先尝原料:面粉有没有结块、鸡蛋新不新鲜,肉眼和鼻子就能判断。数据问题如果等到训练跑起来才发现,代价已经不是改几行代码,而是重跑一次昂贵的训练。
3. 烤箱与温度:预训练是那条不能跳过的长烘焙
3.1 黑箱过程只能靠外部信号判断
蛋糕放进烤箱之后,你没办法直接看到内部结构怎样膨胀,只能隔着玻璃门观察表面颜色,或者用牙签扎进去抽出来看有没有湿面糊。预训练也一样。训练过程中,你无法直接看到模型内部的表征如何形成,只能靠一组外部信号来判断:
- loss:整体是否在下降,下降速度是否平稳。
- grad norm:梯度范数是否突然暴增,出现明显 spike。
- eval loss:在固定验证集上的表现,是否和训练 loss 同步。
- checkpoint 生成样例:每隔一定步数抽几段生成结果,直观感受当前模型“熟了没有”。
这些信号就像烘焙里的计时器和牙签。loss 不降,等于蛋糕没有膨胀;loss 突然变成 NaN,等于烤箱突然蹿到 500 度把蛋糕烤成了碳。不要只看训练集 loss,训练集 loss 降得再漂亮,也可能只是模型把训练数据背下来了。
我见过新手调参时,看到 loss 一步没降就开始改学习率,改完再跑一会儿,又降不下去,又改。整个过程像每五分钟打开一次烤箱门,蛋糕永远都烤不好。训练需要时间,优化器需要足够步数才能把参数移动到合适区域。过于频繁地干预,反而会让训练过程失去参照。
3.2 学习率、batch size 和时间,是温度与火候的三要素
如果要把预训练超参放进烘焙比喻里,最直接的对应是:
- 学习率像温度。太高,更新步长过大,loss 发散或震荡;太低,模型学得慢,浪费算力。
- batch size 像烤盘大小。烤盘越大,一次能承载的样本越多,梯度估计更稳定,但对显存和分布式通信压力更大。
- 训练步数或 epoch 像烘烤时间。时间太短夹生,太长过拟合,需要靠 eval 决定什么时候停。
这里有一个很多教程没讲透的点:学习率和 batch size 是联动关系。调大 batch size 后,你往往也需要把学习率适当调高,否则每一步相对更新幅度会被稀释。常见实践里有一个线性缩放规则,但不绝对。更稳妥的做法是先固定 batch size,用一个小步数跑通,再看 grad norm 是否稳定,然后才逐步放大。
预训练阶段还有一个容易忽略的因素:数据会在训练过程中重复经过。你可能会设定多个 epoch,但大模型预训练通常不会像传统模型那样跑很多轮,因为数据规模已经很大。增加轮次要特别谨慎,它会让模型更快记住训练数据,而未必带来更好的泛化。
不要一上来就把 batch size 和模型尺寸拉满。先用一个极小的配置跑通数据流,确认 loss 能稳定下降,再逐步增加资源。这相当于先烤一个小纸杯蛋糕试温度,而不是直接烤一个三层大蛋糕。
4. 出炉后的裱花:对齐阶段到底改了什么
4.1 base model 能吃但不好看,SFT 是第一次摆盘
预训练结束后的 base model,已经具备很强的语言生成能力。你让它写一句“今天天气很好”,它能接出很多东西,但不一定是以你期望的方式回答。你需要的是“今天天气很好,适合出去散步”这样自然、有用、符合对话习惯的回答,于是就有了对齐阶段。
对齐的第一步通常是指令微调(SFT)。我们收集一批高质量的“指令 + 期望回答”样本,让模型模仿这种回答风格。这很像裱花:蛋糕胚已经成型,现在你要用奶油挤出花纹,规定它上桌时的样子。SFT 不需要像预训练那样使用海量文本,数据量通常少几个数量级,但数据质量要求非常高。一个脏样本,可能会让模型学到不想学到的模式。
然后是可选的 RLHF 或 DPO。SFT 教模型模仿,RLHF 教模型判断“哪种回答更像真人喜欢的”。如果 SFT 是照着模板裱花,RLHF 就是让一群试吃员反复试吃,然后根据反馈调整裱花手法。你会发现,模型在这种反馈下不只改变表达,还会调整回答的长度、口吻和是否主动给建议。
4.2 关键边界:微调不是表面涂层,它会真的改变蛋糕内部
这里要特别强调这个比喻的边界。蛋糕出炉后裱花,奶油只停留在表面,蛋糕内部的孔隙结构不会变。但模型的 fine-tuning 完全不同。当你对 base model 做 SFT 或 RLHF 时,梯度会更新模型的参数,不只是最后一层,甚至可以是全部层。所谓“对齐”,真实改变的是模型内部的权重分布。
所以,你有可能出现“灾难性遗忘”:为了让模型更会聊天,它在通用知识和推理能力上悄悄退步。这就像你为了把蛋糕表面做得特别华丽,反复压挤内部结构,结果蛋糕塌了。很多人对齐完之后发现 benchmark 分数下降,以为是自己测试集不对,其实是因为微调破坏了原有知识。
我建议在动手微调前先做三件事:
- 明确任务边界。你希望模型更像客服、代码助手还是写作辅助?这个目标决定你的 SFT 数据怎么收集。
- 保留一份基础能力评测集。在微调的每个 checkpoint 上都跑一遍,防止遗忘失控。
- 先小规模验证。用几十条高质量样本来回训练,看模型是否真的在改变行为,再扩展到全量数据。
对齐阶段不是“让模型变聪明”,而是“让模型在特定方向上变得更可用”。它无法凭空给模型增加预训练阶段没有学到的知识。如果模型本身没学过某个领域的概念,靠 SFT 硬编几个正确回答,只会让它在相似问题上看起来懂了,一问深就露馅。真正缺知识,要回到数据配方阶段,而不是在裱花台上硬补。
5. 烘烤失败排查表:训练出问题先看哪一层
5.1 把常见烤糊现象翻译成训练症状
训练模型和烘焙一样,失败通常不是灾难性的突然爆炸,而是某一步没有做对,最后体现在产物上。下面是一张我常用的“烤糊对照表”:
| 烘焙现象 | 可能的烘焙原因 | 训练症状 | 优先检查方向 |
|---|---|---|---|
| 蛋糕完全不膨胀 | 泡打粉失效或配方比例错 | loss 不下降,模型训练好几步也没变化 | 数据 I/O、标签错位、学习率过低 |
| 表面焦了但内部夹生 | 温度太高、时间不够 | 训练 loss 降,eval 变差,过拟合 | eval 集、训练轮数、数据重复 |
| 蛋糕塌陷 | 开门太频繁或蛋白没打发好 | loss 先降后突然发散或 NaN | 学习率、grad norm、数据异常值 |
| 烤出来的颜色不均匀 | 烤盘位置或热风不均 | 模型某些任务好、某些任务差 | 数据配比、tokenizer、任务数量 |
| 味道寡淡 | 少放糖或盐 | 生成无聊、重复、缺乏多样性 | 数据多样性、采样温度、解码参数 |
| 裱花后蛋糕口感变差 | 等蛋糕没凉透就抹奶油 | 对齐后基础能力下降 | 微调数据比例、灾难性遗忘、评测集 |
这张表不是精确诊断工具,而是帮你建立怀疑方向。它最大的作用,是阻止你把所有问题都归因到“模型结构不行”或者“算力不够”。大多数训练异常,源头在数据和超参数,而不是在模型代码。
5.2 一条从输入到验证的排查链路
遇到训练问题时,我建议你按下面这个链路排查,不要跳步。
第一步,看现象。先问自己:是 loss 报错、训练崩溃,还是模型跑完但生成质量差?不同现象指向完全不同的层次。
第二步,看输入。检查数据加载链路:tokens 是否和标签对齐,batch 里有没有大量 padding,文本有没有被错误截断,prompt 和 response 位置对不对。很多“loss 不降”的案例,最后都是数据拼装时标签错位。
第三步,看环境。依赖库版本、CUDA 版本、分布式通信、checkpoint 保存路径、磁盘空间。训练跑到一半突然 NaN,先查 GPU 温度和显存,再查混合精度配置。
第四步,看超参数。学习率、batch size、warmup 步数、梯度裁剪阈值。如果 loss 发散,先把学习率降一半,看是否缓解;如果 eval 先降后升,考虑减少训练轮数或加早停。
第五步,看评估。eval 集是否太小、是否和训练集重合、指标是否能反映真实任务。模型在 eval loss 上表现好,但用户觉得回答没用,多半是评测集和真实场景偏离太大。
第六步,看工具边界。框架是否支持某个算子的分布式版本,模型是否达到上下文窗口限制,日志里有没有被截断的 warning。有些问题不是你的代码问题,而是框架版本本身的限制。
把每次训练的关键配置记录下来,像烘焙笔记一样。下次出现同样现象,先对比上次成功和失败之间到底改了什么,往往比从头读日志更快。
6. 比喻的边界:用它建立流程感,但别停在比喻里
6.1 这个比喻真正帮你解决的,是把黑箱变成流程
回顾整个过程,烘焙比喻能带来三样东西。
第一是阶段感。你不会再把预训练、微调、对齐搅成一锅粥。看到“base model”“instruct model”“RLHF”这些词时,你能马上把它们放进蛋糕胚、裱花、试吃这些抽屉里。
第二是调试直觉。当模型输出很怪时,你不再只会问“这个模型是不是不行”,而是会追问:是数据配比出了问题,还是训练没跑够,还是对齐数据太偏?有经验的人常说“先看数据、再看超参、最后看模型”,烘焙思维让你更容易接受这个排查顺序,因为你不会在蛋糕塌陷时先去换一个烤箱。
第三是沟通成本。团队的算法工程师、数据工程师、产品经理坐在一起讨论问题,如果每个人都用不同的类比,很容易各说各话。烘焙流程是一个大家都接触过的场景,可以用它对齐“产线在哪一段断裂了”。
所以,我会把这个比喻当作内部讨论时的默认语言,而不是一个只能写在课件里的花活。
6.2 梯度、注意力、损失函数,还是要回去啃硬知识
但你必须记住,烘焙比喻的颗粒度很粗。它解释不了为什么残差连接能让深层网络稳定训练,解释不了 attention 的 Q、K、V 如何决定 token 之间关系,也解释不了为什么某些损失函数在极低精度下会出 NaN。
如果只是想理解大模型工作流程、搭建应用、做数据工程,这个比喻足够你入门。但一旦你要训练自己的模型、设计新的训练策略、或者定位深层的训练收敛问题,就必需回去啃机器学习和深度学习的经典基础:反向传播、优化器原理、归一化技术、注意力机制、分布式训练。
我比较推荐的学习路径是:先用这个比喻看懂流程,然后去读一点 LLM 的综述,再看某个开源框架的 training example,最后只用一个小参数规模模型,手动跑一遍从数据到微调的完整 pipeline。等你亲手遇到过 loss 发散、eval 异常、过拟合这些问题,再回头看这个比喻,你会更清楚地知道它的价值:它不是终点,而是帮助你进入更深知识的入口。
真正的训练能力,来自一次次失败后的检查、验证和记录。烘焙思维能让你更快地找到该检查的楼层,但每一层里的工具和机制,还是需要你老老实实去学。当你有一天听到“loss 发散”就像闻到蛋糕糊味一样,会下意识先检查原料和温度,那时你已经不再需要依赖这个比喻了。