![[从零训练一个500B大语言模型] 21/25:读过那么多书,怎样学会回答问题?](/_next/image?url=%2Fblog%2Ftraining-500b-part-21-cover.webp&w=3840&q=75&dpl=dpl_HKDZtjNTn1U2zk8pGrYRnYGkyGR9)
[从零训练一个 500B大语言模型] 21/25:读过那么多书,怎样学会回答问题?
主训练结束后,我加载那份读过10T token的模型,给它一小段材料:太阳使水蒸发,水汽遇冷凝结,小水滴聚集后落到地面。接着加了一句要求:“请用三句话解释雨是怎样形成的,适合小学生阅读。”
回答很长。蒸发、凝结、降水都讲到了,还补了一段水循环,最后列出几道思考题。知识似乎有了,我要求的三句话却淹没在里面。
这份回答让我把训练结束的喜悦暂时放到一边。模型读了那么多文字,仍然需要学一件新的事:看清眼前这个人要它做什么,再把已有的知识用到这件事上。
它会讲下雨,却没有听见“三句话”
我把要求拆开再问。先让模型解释“凝结”,它能说出水汽遇冷变成小水滴;再要求缩短回答,它又写出一大段。几轮检查把问题缩小了:至少在这道题上,欠缺的是按要求组织答案。
预训练时,模型一直在做“根据前文预测后文”的练习。书本里有知识,也有习题、目录和各种写作方式。现在输入末尾多了一个用户的要求,我们希望后面稳定出现一份合适的助手回答。这种用法,需要在训练材料里明确示范。
我另开了一份记录,把知识错误和行为错误分开。某个领域的概念确实缺失,就补充相关材料继续训练;概念懂了,回答却忽略句数、对象或格式,就用好的对话教它怎样完成任务。雨水这道题先走后一条路。
基础权重单独保存。它是前面10T主训练的成果;接下来增加的材料、算力和费用另开一笔账。新的训练阶段叫监督微调,SFT。名字先放在一旁,眼前要做的,是把我希望收到的答案认真写出来。
监督微调(SFT):用输入与理想回答组成的示范,让模型学习怎样完成任务。
中期训练:在基础预训练与最终助手训练之间,围绕知识、长文本等特定能力继续训练的阶段。不同项目对阶段边界有不同划分。
把想收到的回答写进教材
同一段材料整理成了一条对话:
用户:
请根据下面的材料,用三句话解释雨是怎样形成的,适合小学生阅读。
材料:太阳使地表的水蒸发。水汽升到高处,遇冷凝结成小水滴。
小水滴不断聚集,足够重时就落到地面。
助手:
太阳把地面的水晒成水汽,水汽慢慢升到空中。
到了比较冷的地方,水汽变成小水滴,小水滴又聚在一起。
当它们重到空气托不住时,就落下来,形成了雨。
这三句话同时承担了三件事:符合材料、让小学生读得懂、遵守句数。审核表也按这三项检查。数出三个句号很容易,确认句子里的意思正确,要再读一遍。
接着遇到一个更小、也更实际的问题:文件里写着“用户”和“助手”,模型怎么知道这两个名字是角色,而不是正文?
数据记录把角色和内容分开放,例如用messages保存对话,用user和assistant标明谁在说话。真正送入模型前,聊天模板把这些字段排成token序列,加上角色边界和结束标记。训练与上线共用同一套规则,提问与回答的位置才接得上。
第十篇里制作、筛选的合成材料,也沿着这条路径进入训练。但到了这一步,文件里留下的是审核通过的具体记录。教师写了多少条、最终采用了哪些条,都能沿版本追溯。
一条雨水问答可以把流程跑通。要教会助手处理更多要求,教材里还得有“请详细解释”“请先问我缺少什么信息”,以及“材料没有给出这个日期”这样的回答。否则,三句话会变成它到处套用的新习惯。
聊天模板:把用户、助手等结构化角色转换为模型输入序列的规则,包括角色标记和结束标记。
标准答案已经在这里,模型还要学什么?
查看第一条训练记录时,我把输入和预测目标一起打印出来。用户的要求在前,刚才写好的三句话在后。正确答案已经提供了,训练程序接下来做的,是检查模型在每个位置能否预测出它。
比如,前文已经到“太阳把地面的水”,下一个token的标准答案来自那份审核过的回答。模型给出下一个token的概率,程序与标准答案比较,再继续检查后面的位置。
第一处回答只能根据完整问题预测。第二处回答可以看到问题和标准答案中的第一处。后面的每个位置也只能看到自己的前文。因为这些前文已经写在样本里,训练时可以同时计算很多位置的预测,不必先让模型自由写完一段,再回来评分。
打印结果里还有一排0和1。它们决定哪些预测误差进入训练损失:用户要求与材料标0,助手回答与结束标记标1。整段内容都要读,评分集中在我们想教会它写出的部分。
图用雨水例子的英文短语展示这条记录。顶部卡片是用户要求与材料,绿色词块是回答的预测目标和结束标记。上下文标0,绿色块下标1,表示是否评分。词块是一段内容的示意,实际分词会更细。
这排标记叫损失掩码。标0的位置仍然影响回答:模型怎样理解问题,决定了回答位置会产生什么误差。误差沿网络反向传播,Attention、前馈网络和其他可训练参数都能因此调整。
我逐项核对角色、预测目标和掩码,又放入一条多轮对话。只有每个该学的回答都被选中,结束位置也正确,这份数据才继续往下走。一个边界错位,会让整批教材教错地方。
损失掩码:标记哪些token位置参与训练评分的数组。这里保留助手回答,跳过用户题目和填充位置。
接回原来那套训练程序
雨水样本现在有了输入、标准答案和评分位置。接下来要把它放进前面已经搭好的Megatron训练流程。
机房、Slurm和多卡通信还在原来的位置。变化主要发生在材料怎样读进来、怎样组织成一批,以及损失怎样汇总。我把需要调整的地方列到同一张表上,照着样本逐项核对:
| 位置 | 预训练时做什么 | 这次SFT怎样调整 |
|---|---|---|
| 数据读取 | 从材料中取token序列 | 读取审核后的对话,经聊天模板生成输入 |
| 输入组织 | 按文档边界组织材料 | 固定用户、助手及结束标记,训练与上线共用 |
| 预测目标与损失 | 根据前文预测下一个token,按原规则评分 | 仍预测下一个token,只汇总助手回答和结束标记的误差 |
| 参数更新 | 按第十六篇计划运行AdamW与学习率日程 | 从基础权重开始SFT任务,比较较小学习率,重新记录批量与有效回答token |
| 分布式运行 | 多张卡共同计算、通信和保存 | 保留已验收的并行组合,复查对话长度、掩码传递与显存峰值 |
所选Megatron版本的GPT训练入口已经把逐位置损失与loss_mask相乘,并统计选中的位置。这里需要接好的是对话数据:正确的掩码必须跟着对应预测目标一起切分、一起组批。
截至2026年11月,Hugging Face的SFT文档也提供assistant_only_loss选项,并要求聊天模板能够给出助手区间。它把同一件事封装成了自己的接口。我的500B任务继续用Megatron,在既有数据和损失路径上落实这条规则。
小批次跑通以后,再看显存和通信记录。输入长度改变了,参与评分的位置也改变了,旧配置需要重新验收。到这里,一条对话才真正接上了那套能更新500B参数的系统。
一条样本通了,还需要准备多少?
接下来的问题从程序回到教材。只教会雨水这道题,距离一个通用助手还很远。我把第一批任务分成五类:遵循要求、基于材料回答、多轮澄清、数学与代码,以及边界与信息不足处理。
每类再铺开语言、长度和难度。这样的清单让缺口变得具体:是中文长文少了,还是要求澄清的对话太少,或是数学答案有了、过程审核却没跟上。
首轮先做1万条,检查错误类型和生产成本,再扩到10万条。完整配额按3万、3万、1万、2万、1万安排。前两类承担通用助手最常见的交互,另外三类补上不同的处理方式。新增额度给哪一类,之后看审核通过率、覆盖缺口与独立任务收益。
按每条输入与回答合计2,000个token、其中回答600个做预算,10万条读一遍就是约2亿输入token,约6,000万个位置参与回答损失。题目上下文也需要计算,所以算力账看整条输入;分析学习信号时,再单独看回答部分。
材料终于有了可数的边界。但它们要读多久,仍然需要训练结果回答。我在四分之一、二分之一和一遍的位置保存版本,首轮先安排一遍。第七篇讨论过重读的收益,这里继续沿用同一个办法:用中间版本检查进步和退步,再决定下一轮是否值得读第二遍。
输入token:模型实际读入并参与计算的内容位置,包含题目与回答。
回答token:助手输出部分的位置,本篇主要从这些位置取得训练损失。
让它学会新要求,也留住原来的能力
开始更新前,我又回头看了一次那份基础权重。10T材料的积累都在里面,这轮要调整的是它使用能力的方式。于是先用1万条开发训练集比较几个较小的学习率,每次都从同一份基础权重开始。
首轮仍完整更新模型参数,让整个网络适应任务。短程对照同时检查指令遵循、事实准确和原有能力,选出调整幅度合适的候选,再扩大到10万条。学习率、输入token、有效回答token和每次更新量一起记,比较才有共同尺度。
首轮学习率与低秩适配怎样安排?
三个峰值学习率候选为2×10⁻⁶、5×10⁻⁶、1×10⁻⁵,都低于第十六篇主训练8×10⁻⁵的峰值候选。对照使用同一份1万条开发训练集、相同有效回答token数,并保存相同位置的检查点。三档覆盖五倍范围,先寻找能改变行为又保持基础能力的区间,再收窄。
完整更新需要保留全部可训练参数的梯度与优化器状态。低秩适配冻结原权重,只训练较小的新增参数,可以减少可训练状态和保存量。我把它留作快速比较数据或窄任务的开发工具。通用助手的首轮主候选使用完整更新,最后按独立任务成绩与成本选择版本。
最容易让人放松警惕的,是雨水题终于只剩三句话。这个变化还不够。我换成雪的形成,要求两句话;再给一段设备说明,要求详细列出操作步骤;最后问一个材料没有提供的日期。
这些新题检查的是同一种能力:根据眼前的要求决定怎样回答。与此同时,基础模型原有的知识、数学、代码和长文题也继续跑。某一类明显退步,就回查样本配比和更新幅度。必要时补入少量通用材料,并单独记录它的损失规则与数量。
灾难性遗忘:模型学习新任务时,先前获得的部分能力明显下降的现象。
评审看不到版本名字,答案顺序也会轮换。每份回答按事实、要求、读者和信息边界分别检查。最终留下的版本,要在新题上更会回应用户,也要保住值得保留的旧能力。
我把选中的检查点、训练集版本、聊天模板和对照报告放在一起。最初那道雨水题留在记录开头,提醒我这轮训练从哪里开始:模型已经能讲很多知识,我们教它先看清要求,再决定怎样开口。
可下一张测试纸很快又暴露了别的问题。同一道计算题,模型问一次会错,重试几次却能答对。它已经能走到正确答案,只是还不够稳定。我把几次回答并排放好,准备看看这些尝试能不能反过来教会它。
新文章,直接发到你的邮箱。
AI、工程与实验,每月 1–2 封。
无垃圾邮件,随时取消。