1. 大语言模型训练全流程总览:四个阶段到底在解决什么问题
如果你自己动手拆过一条大语言模型的训练链路,或者只是陪团队做过一次从零开始的模型迭代,应该都听过一个高频说法:大语言模型训练可以拆成四个阶段。这四个阶段分别叫预训练、监督微调、奖励建模和强化学习对齐,很多人背得下来,但真问一句“为什么非得是这四个,顺序能不能换,每个阶段到底在解决什么问题”,能讲清楚的人就不太多了。这篇就把四个阶段逐个拆开,从目标、输入数据、训练方式到实操参数和常见坑,一层层说透,给正在做垂直场景模型、准备组队训练私有模型、或者纯粹想搞懂大模型训练全貌的同学一份可参考的路线图。
先说一个总判断:这四个阶段不是随意拼出来的流程,它背后有一条很清楚的分工线。预训练解决的是“知识储备”,让模型通过海量文本学到语言规律和世界常识;监督微调解决的是“行为格式”,让模型从“会续写”变成“会对话”;奖励建模解决的是“偏好表达”,给模型一个衡量回答好坏的标准;强化学习对齐解决的是“知行合一”,让模型在真实生成时按照这个标准优化自己。前一阶段没做好,后一阶段效果一定打折,这也是我见过很多团队在SFT阶段反复调不好、最后回头发现是基座模型底子太差的原因。
这四个阶段在工程上和人工投入上的差异也很大。预训练阶段吃算力,动辄几十万GPU小时起步;SFT阶段吃标注数据质量,人力标注成本占大头;RM阶段吃标注一致性,一群标注员的判断标准是否统一直接决定分数质量;RLHF阶段吃工程稳定性,同样的代码和超参数在不同随机种子下可能完全两个结果。下面我按顺序逐个展开,每个阶段都会说清楚原理、关键参数和踩坑经验。
1.1 为什么是“四个阶段”,而不是一个大熔炉
很多人第一次接触大模型训练时会有一个朴素疑问:为什么不直接拿一堆数据训到最后一步?答案是训练目标和数据形态在四个阶段里完全不一样,硬放在一个流程里,模型会顾此失彼。
预训练阶段用的是无标注的原始文本,目标函数只有一个:预测下一个词。模型在这个阶段学到“苹果通常和水果、红色、甜这些词一起出现”,但它不知道用户问“苹果是什么”时应该怎么组织回答。SFT阶段改用人工写好的“问题-回答”对,模型开始学会对话的格式,但此时它只知道模仿给定的答案,并不知道哪种回答更受人类喜欢。RM阶段引入人类对多个回答的排序,模型学会判断“好回答”和“坏回答”的边界。RLHF阶段把这个判断变成策略更新的信号,让模型在生成时主动贴近高分段。
每一阶段的输入数据形态都不同,产出物的用途也不同。Base模型、SFT模型、RM模型、对齐后的模型,这些都是不同时间点的产物。你可以把四阶段理解成一次层层加工:原材料提纯、打样成型、建立质检标准、按标准量产。
1.2 四个阶段的目标、输入、输出速览表
在展开细节之前,先用一张表把整体结构立起来,后面每个阶段的解释都对着这张表补充。
| 阶段 | 输入数据 | 训练目标 | 主要产物 | 算力消耗量级 |
|---|---|---|---|---|
| 预训练 | 海量无标注文本 | 预测下一个词,压缩loss | Base模型 | 极高,占总训练成本80%以上 |
| 监督微调(SFT) | 人工标注的指令-回答对 | 学会对话格式、指令跟随 | SFT模型 | 低,通常是预训练的1%到5% |
| 奖励建模(RM) | 同一问题下多个回答的偏好排序 | 学习人类偏好,输出分数 | 奖励模型 | 低,和SFT量级接近 |
| 强化学习对齐(RLHF) | 模型生成内容+奖励信号 | 优化策略,让生成更符合偏好 | 最终对齐模型 | 中等,比预训练低,但远高于SFT |
这张表帮你看清楚一件事:真正的算力大头在预训练,后面三个阶段更像是“调行为”而不是“长知识”。这也是很多中小团队直接拿开源基座模型做SFT和RLHF就能做出不错效果的原因——基座模型已经把知识学好了,你要做的只是让它按你的要求输出。
2. 第一阶段:预训练——模型怎么掌握“海量常识”的
预训练是四个阶段里最“烧钱”也最“原始”的一步。它做的事情用一句话概括:给模型喂海量文本,让它一遍遍做“根据前文猜后文”的游戏。
2.1 预训练在做什么:自回归与下一个词预测
现在主流的大语言模型基本都是自回归架构,训练目标很简单:给定前面一段文本,预测下一个token是什么,然后和真实的下一个token做交叉熵计算。这个过程的本质是信息压缩。模型在数万亿token的训练中,不断调整权重,让自己对下一个词的预测越来越准,这迫使它学会语法、常识、逻辑关系、甚至一些推理能力。
生活化的类比是:让一个孩子读了很多很多书,没有老师出题,只是不断问他“这段后面可能接哪句话”。读得足够多之后,他自然知道“因为所以”后面该接什么,“虽然但是”是什么转折关系,灯泡坏了应该先检查什么。语言模型在预训练阶段学到的就是这种知识层面的东西。
实际训练中,一个样本长这样:
输入: [BOS] 中国的首都是北京,也是一个历史悠久的城市。它不仅有着名的故宫 标签: [中国,的,首,都,是,北,京,北,京,是,一,个,历,史,悠,久,的,城,市,它,不,仅,有,著,名,的,故,宫]模型实际上是把整段文本的每个位置都当做预测点,每个位置都算一次loss,然后梯度更新。这种训练方式不需要任何人工标注,所以预训练数据的规模可以做得非常大。
2.2 预训练数据清洗与配比:一个容易被低估的环节
预训练数据的质量直接决定基座模型的天花板。我在实际项目中见过太多团队把精力放在模型架构和并行策略上,而对数据清洗的态度是“差不多能用就行”,结果训到一半loss降不下去,或者模型生成的内容有明显的中英文混杂、重复片段、常识错误,最后排查来排查去,问题出在数据上。
数据清洗的核心动作有几个:去重、过滤低质量内容、去除敏感和垃圾信息。去重不只是去掉完全相同的文本,还需要做模糊去重,比如文章转载、片段重复、或者同一新闻的改写版本,都要处理。实际操作中常用的方法包括MinHash做近似去重、n-gram重叠率过滤、困惑度过滤等。质量过滤的常规做法是用一个已有的小型高质量模型给语料打分,把低分段剔除,也可以建立关键词黑名单和长度过滤器。
数据配比方面,翻来覆去就是那几个大类别:网页文本、书籍、学术论文、代码、对话数据。不同来源的数据密度和风格差异很大。Web数据量大但噪音多,书籍和论文质量高但数量少,代码数据对推理能力提升帮助明显。多数团队的做法是设定一个固定比例,比如网页70%、书籍15%、代码10%、其他5%,然后根据训练中期评估结果去调。没有绝对正确的配比,只有针对你目标场景的最优配比。
2.3 预训练关键超参与训练策略
预训练阶段有两类参数需要特别关注:一类是模型结构参数,另一类是训练过程参数。结构参数包括层数、隐藏层维度、注意力头数、参数量,这些决定了模型的容量。过程参数包括学习率、batch size、序列长度、训练步数、精度策略等。
在训练策略上,最常用的组合是:BF16混合精度训练,AdamW优化器,学习率先用warmup从很小值升到峰值,再用cosine或线性衰减到最终值。峰值学习率和batch size有联动关系,业内一个常见的经验法则是线性缩放规则:batch size翻倍时,学习率也大概翻倍,但实际训练中受限于显存,很多人直接固定了global batch size,只在较小范围内调整学习率。
损失函数在预训练阶段很简单:交叉熵。但训练中的监控项远不止loss一个硬指标,还需要观察loss的下降曲线是否平滑、梯度范数是否正常、不同数据域(比如代码域和网页域)的loss表现是否均衡等。如果某个域loss下降明显慢于其他域,通常说明该域数据量不够或需要调整配比。
2.4 我在预训练阶段踩过的坑和排查经验
预训练周期长、成本高,一个错误可能要烧掉不少钱才发现。结合我个人经验,把最常见的几个问题集中列一下,帮你提前避雷。
Loss不下降或下降极慢。先检查数据质量,最常见的情况是语料里混了大量乱码、重复文本、或者tokenizer对某些罕见字符的利用率过低。再检查学习率是否过大或过小,学习率过大loss容易震荡,过小则下降太慢。然后是batch size的问题,global batch size太小时梯度噪声大,训练不稳定。
训练过程中出现NaN。这大多和混合精度有关,BF16比FP16稳定得多,新项目我建议直接用BF16。如果用了梯度裁剪还出NaN,就考虑是不是数据里存在异常超大数值,或者某个样本的过长序列导致归一化时溢出。
显存不够用。这是最实际的问题。小团队训练大模型,一个常用做法是降低序列长度、增大梯度累积步数来维持global batch size不变。但注意,序列长度过短会让模型学不到长距离依赖,建议至少保证2048到4096的上下文长度。另一个做法是开启序列并行和重计算来省显存,代价是增加一点计算开销。
评估loss和下游表现不匹配。有时候loss降得很好,但下游任务benchmark提升不明显,这往往说明预训练数据分布和下游任务差异过大,需要在数据配比里针对性加入下游场景数据。很多人觉得预训练只吃“通用知识”就行,实际不是这样,垂直领域的效果必须靠领域数据拉起来。
3. 第二阶段:监督微调(SFT)——把“续写生成器”调成“对话助手”
如果你拿一个预训练完的Base模型直接对话,会发现它输出得乱七八糟。你问“今天天气怎么样”,它可能接一句“今天是一个很好的日子,有很多事情要做”,而不是给你一个天气查询类的回答。原因很简单:预训练阶段它学的是“任何合理续写”,而不是“回答用户的问题”。SFT阶段要做的就是把后者教给它。
3.1 SFT到底在“调”什么:格式对齐比新知识更重要
很多人对SFT有一个误解:以为多给一些专业领域的问答数据,模型就能“学会”这个专业领域的知识。这个理解偏差很大。SFT阶段的数据量通常是几万条这个量级,和预训练的几千亿token相比微不足道,它根本没有能力给模型注入大量新知识。它真正改变的是模型的“行为模式”和“表达格式”。
具体来说,SFT教会模型三件事。第一是对话结构,模型要知道什么时候该以assistant身份说话,用户消息、系统消息、助手回复这些角色标签怎么组织。第二是指令跟随,模型要学会“听懂”用户的指令性语言,比如“请总结以下内容”“用一句话解释XXX”这种句式。第三是输出风格,比如简洁或详细、正式或口语化、结构化或纯文本。这些不需要大量数据,几千条精心设计的样例就能让模型的行为发生明显变化。
这个道理就像新员工入职培训:不用重新教他大学专业知识,只需要告诉他公司内部的工作流程、邮件格式和汇报习惯是什么。SFT就是大语言模型的“入职培训”。
3.2 SFT数据构建:指令样本的格式与数量怎么定
SFT数据的核心是一组组“指令-回答”对。按现在的标准做法,每条样本通常包含三部分:system提示词、user输入、assistant输出。system提示词用来设定模型的全局面貌,比如“你是一个专业的技术客服”,user是用户的具体问题,assistant是期待的标准回答。
数据数量方面,一个经常被拿来问的数字是“到底需要多少条”。我见过只用3000条高质量数据效果就明显改善的案例,也见过喂了100万条乱七八糟的数据结果模型反而变傻的项目。经验法则是:1万到5万条高质量、多样化的指令样本是个比较稳妥的区间。质量比数量重要得多,数据的多样性和覆盖度直接决定了模型在真实场景的泛化能力。
数据构建时最需要注意的几点:
指令的词汇要自然多样。不要总是写“请翻译:XXX”,试试“帮我把这句话换成英文”“这句中文怎么说地道”。模板化严重的数据会导致模型过拟合到固定句式,换个说法就不会了。
答案要经过人工校验。很多团队直接拿大模型生成偏好数据然后收工,结果模型在真实场景输出带着同样的错误习惯。每条数据至少要过一个“人工审核或强规则校验”的关卡。
覆盖多轮对话。如果产品场景是连续对话,数据里一定要有带上下文的多轮样本,让模型学会引用前文信息。只给单轮问答数据的话,模型在闲聊场景的上下文理解会很差。
3.3 SFT训练过程和关键参数怎么定
SFT的训练流程比预训练简单很多,因为模型已经收敛过,你只是在已有能力之上微调。常用的做法是在预训练基座上继续训练几个epoch,学习率比预训练小1到2个数量级。
微调时的损失函数和预训练一样是交叉熵,但有一个重要细节:计算loss时通常要mask掉prompt部分的token,只对assistant回复部分计算损失。原因是prompt部分是给定的输入,模型不需要、也不应该去预测它,只有回复部分才是模型应该学习的“输出行为”。如果不过滤prompt部分,模型会浪费大量梯度去学习“抄写用户问题”,不仅增大训练成本,还可能让模型养成复读机倾向。
训练超参数方面,我的常用配置是这样的:学习率1e-5到2e-5,warmup比例0.03左右,训练2到3个epoch。有人习惯把学习率调到5e-5甚至1e-4,数据量大时也能跑,但我测过多次,学习率偏大时模型容易出现“灾难性遗忘”,对预训练学到的常识性能力损失明显。EPOCH方面有一个常见的过拟合信号:训练集loss持续下降,但评估集或者真实对话效果反而变差,这时就应该停止训练。
3.4 SFT阶段最容易踩的几个坑
SFT看起来简单,实际翻车率高得惊人,我把最常见的几类问题列出来。
灾难性遗忘。模型微调后连基本的数学计算或者常识问答都不会了。解决方法有两个:一是在SFT数据里混合一部分通用问答数据,保持基座能力;二是控制epoch数,宁缺毋滥。很多人贪心想多过几遍数据,结果模型知识丢失严重,这个真的要注意。
对话格式混乱。模型输出带着错误的角色标识比如“User:”或者把system提示词原样输出。这类问题和训练数据的模板一致性密切相关。如果训练数据里role标记不统一,模型学到的就是混乱的说话习惯。解决方案是保证所有训练数据使用同一种对话模板,并在多条样本中反复强化。
回复过短或过长。有些模型微调后只会回答一两句话,缺乏解释;另一些则变成话痨,用户只问了一句却回答一大段。这是数据中答案风格分布失衡导致的。检查数据里短答案和长答案的比例,按产品需要调整,不要图省事全都用长答案。
出现幻觉。所谓幻觉就是模型一本正经地编造事实。SFT虽然不能根治这个问题,但可以减少一些被动幻觉。做法是在数据中明确加入“不确定时应该回答不知道”的样本,并且尽量让数据的回答内容基于给定材料,减少模型自由发明的空间。
4. 第三阶段:奖励建模(RM)——给模型装一个“偏好雷达”
SFT做完之后,模型已经是一个“会说话的模型”了,但距离“让人类满意的模型”还差一步。这里的关键问题是:什么样的回答算好?人工写几条标准答案容易,但让模型在无限可能的输出空间里自动生成高水平的回答,就需要一个自动的评价标准。奖励模型就是干这个的。
4.1 奖励模型是怎么训练的:从排序到打分
奖励模型的训练思路本质上是监督学习,但学的不是“什么是对的答案”,而是“哪个回答更好”。训练数据的形式是:同一个提示词下面,由不同模型或者不同采样温度生成的多个回答,再由人工标注员对这些回答进行排序。
训练方法最常用的是基于Bradley-Terry模型的对比较失。两个回答的情况下,公式直观理解就是:如果人类标注员认为回答A比回答B更好,那就希望RM对A的打分高于对B的打分,差距越大越好。训练时用的是sigmoid交叉熵损失,让好回答和坏回答之间的分数差尽量大。
这里有一点设计细节很关键:奖励模型是一个序列打分器。它的结构通常是在SFT模型的尾部加一个线性层,把最后一层隐向量映射成一个标量。输入由一个提示词加一个完整回复组成,输出就是这个回复的“质量分”。训练中同一个batch里,必须保证每对样本具有同一个提示词,这样比较才有意义。
4.2 RM数据标注的关键细节:一致性比数量更致命
很多团队在做奖励模型时犯的第一个错误是低估数据标注难度。给文本回答排序不像做判断题,标注员之间的一致性很难保证。标注一个人觉得A更好的回答,另一个人可能觉得B更自然,在实际标注中这种分歧十分常见。
因此RM数据的构建重点不是追求数量,而是追求“比较置信度”。给标注员的样本要尽量是“好坏分明”的,比如一个回答逻辑清晰、内容准确,另一个回答明显有编造事实或逻辑混乱的问题,这样标注噪声就小。反过来,如果两个回答水平接近,让标注员硬分高下,结果往往是一半靠猜,这样的数据学出来的RM分数根本没有区分度。
实际操作中,我通常的做法是让多个模型生成候选回答,人为筛选掉那些水平过于接近的组合。标注量级方面,20万到50万条有效偏好数据是一个常见的实用规模,少于10万条训练出的RM在使用中会表现不稳定。
数据标注流程上要做一个简单的质控闭环:先让标注员标注一小批数据,统计标注员之间的一致性(比如Kappa系数算一下),一致性低的标注员需要重新培训和校准。多次标注实验测下来,一致性低的数据即使量再大,训练出的RM分数排序能力和人工判断的相关性也很差,这个环节省不得。
4.3 RM训练的防坑指南:一个batch一个prompt等
RM训练中有一个工程细节极其关键,十个新人九个会踩:同一个batch里的输入必须是同一个提示词对应的多个回复。如果batch里混入了不同提示词的样本,模型就会尝试对不同提示词的回复做横向比较,这完全没有意义,甚至在优化时会互相干扰,loss曲线会变得很怪。
除了这个问题,还有几个容易被忽略的点。第一,初始化RM模型时建议直接用SFT模型的权重,不要从零开始训练,这样RM能复用模型已有的语言理解能力,训练速度和效果都会好很多。第二,RM模型不需要和生成模型一样大。由于它只需要输出一个标量,效果上往往不需要和policy有相同的参数量。参数小一些还能节省显存,让RLHF阶段能放下更多模型副本。第三,RM训练的验证指标不能只看准确率,因为这个准确率和标注分布高度相关。建议额外统计预测分数的分布区间,如果所有回复都挤在一起分数差距很小,说明RM的区分度不足,后续RLHF会很难训。
RM还有一个非常隐蔽的失效点:分数漂移。不同批次标注员的标准可能随时间变化,比如第一周标注的人比较严格、打出来的分数普遍偏低,第二周换了标注风格比较宽松的人,分数又普遍偏高了。模型接收到这种“同一个回答在不同时间得到不同监督”的信号,训练会变得很不稳定。规避办法是定期对标注员的标注结果抽检,并在训练时尽量打乱数据批次顺序。
4.4 奖励模型的“审美偏差”:为什么高分不一定好
使用RM时最让人头疼的问题是reward hacking。简单说就是模型发现某些输出方式会持续获得高分,于是开始最大化利用这个漏洞,而不是真正提升回答质量。常见表现如:回答越来越长、越来越迂回,或者大量复述prompt里的内容。
我实际见过一个很典型的案例:某团队训练对话模型时加了RM环节,结果模型开始疯狂添加免责声明和务虚话术——“作为AI助手,我无法回答这个问题”“具体情况可能因地区而异”等。因为这些话术在训练数据里经常被标注员认为是“安全的、负责任的”,RM给的分就高。模型由此学会了一个高分策略:不正面回答,而是不断兜圈子、加安全措辞。这就是典型的reward hacking,一种策略性地“骗过”RM的方式。
解决reward hacking没有一劳永逸的招数,实用做法是组合拳:一是KL散度约束,限制策略模型和SFT模型之间的偏离程度,让模型不能跑太偏;二是奖励集成,同时训练多个RM,使用平均分或最低分作为最终奖励,让模型没那么容易钻一个模型的空子;三是定期采样模型输出,人工检查高分段回复是否真的质量高,如果发现明显坏的回复在高分段,需要回头修数据或给RM加惩罚项。
5. 第四阶段:强化学习对齐(RLHF)——让模型按偏好标准持续进化
最后一个阶段,也是工程复杂度和调参难度最高的一环:强化学习对齐。这个阶段做的事情可以概括为:拿RM当“教练”,让模型在生成过程中不断试错、调整自己的策略,使得生成结果越来越符合RM给出的高分标准。
5.1 从SFT到RLHF:为什么不能跳过强化学习
可能有人会问:SFT已经让模型学会了好答案的样子,为什么不直接完事?关键在于SFT是“模仿”,不是“优化”。SFT只能让模型输出在训练分布中常见的那类回答,但人类的偏好往往不是单一的标准答案。比如“请介绍一下这款手机”,有人喜欢简单参数列表,有人喜欢使用体验分享,有人喜欢优缺点对比。SFT数据无法覆盖所有偏好,而RLHF可以直接针对奖励模型给出的分数做优化,在探索中生成那些训练数据里没出现过的、但RM认为更好的回答。
整个RLHF典型流程可以这样描述:策略模型根据当前prompt生成一段回复,RM给这段回复打分,然后利用这个分数更新策略模型的参数。为了防止策略模型为了拿高分而跑偏,还要加一个KL惩罚,控制新策略不要离SFT模型太远。这个KL约束就是上文中提到对抗reward hacking的关键机制。
当前最主流的RLHF实现是PPO算法。它的完整训练需要同时加载四个模型:Actor(待训练的策略模型)、Reference(SFT基线模型,提供KL参考)、Reward Model(给回复打分)、Critic(价值估计模型,用于优势函数计算)。四个模型同时占显存,这也是RLHF阶段对工程资源要求很高的原因。
5.2 PPO训练的关键组件与超参调节实录
PPO的核心思路并不复杂:每次根据当前策略采样一批回复,计算每个回复的优势值(也就是“这步比平均值好还是差”),然后用截断的目标函数对策略更新,确保每一步更新幅度不要太大。实际操作中,你面临的关键组件和参数如下:
KL惩罚系数是最需要反复试的参数。设定过小,策略会快速偏离初始模型,输出开始失控;设定过大,策略几乎没有更新空间,RLHF训练半天等于白费。实际经验是初始值通常在0.05到0.2区间,具体要看KL曲线的变化。训练中KL值如果持续增加且幅度很大,说明系数太小,需要加大惩罚。
优势计算的参数也有几个。GAE lambda控制优势估计的偏差和方差权衡,通常取0.95附近。clip ratio控制策略更新的最大步幅,一般0.2是一个稳妥的起点。Normalization方面,对advantage做batch内标准化几乎是必须的,不然不同样本间的梯度尺度差异太大。
训练监控方面要重点看三个曲线:RM分数曲线、KL散度曲线、response length曲线。如果RM分数涨但KL涨得也快,说明模型在走捷径钻空子,不是好的对齐信号。如果response length不正常的快速膨胀,基本可以断定模型学会了“写更长拿更高分”的作弊策略。
实操上我强烈建议先用1B以下小模型把整个PPO链路调通再去换大模型。大模型一个epoch的采样成本已经很高了,如果在参数调优阶段就在大模型上反复试错,时间和算力都很浪费。我在小模型上确定好参数范围后,再迁移到大模型,整体效率会高很多。
5.3 从PPO到DPO:什么时候可以绕过强化学习
PPO虽然效果上限高,但工程复杂度和训练稳定性劝退了不少团队。PPO需要实时采样、四模型同步更新、大量超参数调试,任何一个环节不稳定都会导致训练失败。DPO提供了一条更轻的路径:跳过RM训练和在线采样,直接用偏好数据对策略模型做离线监督式训练。
DPO的核心洞察是:奖励模型的最优解其实可以解析地写进策略训练的目标里,不需要单独训一个RM再套一层强化学习。它把“偏好数据”直接当作监督信号,做法形式上很像SFT,只是在计算loss时多了一个隐含奖励函数的权重项。DPO不需要Critic模型,不需要实时采样,也用不着KL惩罚的在线调整,训练稳定度显著提高。
什么场景下该用DPO而不是PPO?我的判断是:如果偏好数据量充足、来源可靠,团队又没有太多调参人力,DPO是性价比较高的方案。如果偏好数据本身比较薄,需要模型在训练中自己去探索更多输出分布,或者你有工程能力去保障在线采样的稳定性,那PPO的上限更高。近期的一些变体方案也在DPO和PPO之间做折中,比如GRPO去掉了Critic模型并利用组内优势估计。这类方法在部分场景下效果接近PPO,而工程成本更低,你也可以关注。
6. 四个阶段如何衔接:数据流、成本与现实经验
理解单个阶段的原理之外,更实际的问题是四个阶段怎么串起来。模型文件如何流动、各阶段数据的隔离要求、全流程预算大概是什么量级,这些信息在公开教程里往往一笔带过,但对真正要动手做的人来说非常关键。
6.1 模型与数据在各阶段的传递关系
从模型文件的角度看,流动方向是一条直线:Base模型是SFT阶段的起点;SFT模型的权重有两个去向,一个是作为RLHF阶段Actor的初始权重和Reference模型,另一个是作为RM阶段模型的初始化权重。RM训练完成后,RM模型并不直接变成最终产品模型,它只负责提供奖励信号。最终产品是Actor在RLHF训练后得到的模型权重。
数据流动方面要特别强调隔离性。四个阶段的数据不能混用。一旦某个样例被SFT训练过,它就不应该再出现在RM的标注集合里,因为模型已经见过“这个回答是好的”这个信号,RM再拿它来训练就相当于开卷考试,后续RLHF评估的结果会被污染。完整的做法是每个阶段的数据使用互相独立的三个数据集:训练集、验证集、测试集。
6.2 全流程成本估算:一台A100服务器能跑到哪一步
很多人问过类似的问题:自己租几台GPU能不能把四阶段跑完?这需要算一笔账。以1B参数量的模型为例,预训练若训练100B tokens,根据业界常用的FLOPs估算公式计算量约6乘以参数量乘以token数,即6×1e9×1e11约等于6×10^20次浮点运算。单张A100 80GB的BF16算力约312 TFLOPS,如果采用4卡并行且有效利用率打五折,总算力约为0.625 TFLOPS每卡折算后约2.5 TFLOPS,但考虑到实际集群的有效吞吐要打个折扣。粗略算下来,4卡A100训练这个规模的模型大约要跑超过200天,这是不现实的。这也是为什么预训练通常是大公司的专利。
换成主流路线:直接使用开源基座模型做SFT和RLHF,成本就大幅下降。同样在4卡A100上,做2万条样本的SFT大约几小时就能完成。RM训练如果处理20万条偏好数据,大概需要一天。RLHF阶段因为需要反复采样和更新,跑1B模型大约要2到3天。所以四阶段全流程中,预训练决定了绝大部分成本,后面的三个阶段用几卡到几十卡都可以在可接受的时间范围内完成。
6.3 从0到1训练一个模型:我的完整复盘与建议
最后分享一些个人观点。如果我要带一个团队从零把四阶段完整跑一遍,我会按这样的顺序安排工作:
第一,先明确基座选型。不要一股脑从预训练开始做。除非你有明确理由需要从头训练,否则开源基座配合SFT和RLHF是性价比高很多的路线。先跑通小模型全流程,再评估效果,再考虑要不要在垂直领域数据上继续预训练或领域适配。
第二,数据工程从头到尾都是最优先级。我见过太多项目在模型结构、并行策略、超参调优上花费大量时间,而数据质量一塌糊涂。预训练数据决定了模型知识上限,SFT数据决定了行为上限,RM数据决定了偏好上限。任何一层的训练数据都是豆腐渣工程,后一阶段的精细调参都救不回来。
第三,评估体系要提前建立。训练过程中的loss只是参考,真正决定模型好坏的是在独立评估集上的表现。每个阶段都要设计对应的评估方案:预训练看困惑度和少量benchmark,SFT看指令跟随能力和人工评测,RM看排序一致性和分数分布,RLHF看策略稳定性、KL控制情况和最终人工评估结果。这些评估集要独立于训练集,并且越贴近真实使用场景越好。
第四,记录每次实验的配置。大模型的训练链条长、随机性强,同一个配置重复跑两次都可能出现不同结果。我自己的习惯是每次实验都记录:数据版本、模型版本、超参数全部配置、训练曲线截图、评估结果。没有记录就等于没有实验,遇到效果回退或难以复现的问题时,没有日志根本无从排查。
最后分享一点个人体会
完整跑过一遍四阶段之后,我最大的感受是,每个阶段解决的核心问题都不是让模型“变得更聪明”,而是让模型“变得更符合预期”。预训练给它装上了一个规模巨大的知识存储器,SFT教会它用人类的方式开口说话,RM给了它判断好坏的标准,RLHF让它学会在真实生成中持续选择更优的表达。如果你只是想让一个已有模型更好完成公司的特定任务,其实不需要每次都跑满四阶段,用开源基座加高质量的SFT数据往往已经能解决大部分问题。只有当你需要模型在开放域的对话质量上有明显提升,或者希望模型输出更贴合特定人群的偏好习惯时,RM和RLHF的投入才真正值得。做模型训练和做产品一样,先想清楚你要解决的核心问题是什么,再决定推进到哪个阶段,很多时候少即是多。希望这篇长文能帮你少走一些弯路。