← 返回系列总览
[从零训练一个500B大语言模型] 22/25:模型自己做题,怎样从结果里学会改进?

[从零训练一个500B大语言模型] 22/25:模型自己做题,怎样从结果里学会改进?

上一轮微调结束后,模型已经更会按要求回答。我又给它出了一道题:“一辆车先行驶60公里,再行驶90公里,总共用时3小时,平均速度是多少?”

第一次回答是每小时50公里。重新生成,答案变成75;再试两次,又得到50和45。四份回答放在一起,问题变得很具体:正确的路它走得到,却没有稳定地走那条路。

我把四份回答保存下来。既然这次可以核对谁对谁错,也许就能让模型从自己的尝试里学习。接下来要接通的,是从“这份回答更好”到“下次更容易答好”之间的那段路。

四份回答,先怎样打分?

这道题的总路程是150公里,总时间3小时,平均速度就是每小时50公里。评分程序先识别答案和单位,再核对计算结果,四份回答依次得到1、0、1、0。

文件里保存的内容比这四个数字多。每份都有完整的题目、模型实际写出的token,以及生成时给这些token分配的概率。一份正确回答写着:“总路程是150公里,150除以3,平均速度为每小时50公里。”另一份在中间算错,最后写出75。

这些记录之后都有用。分数告诉我们这次尝试好不好;回答和概率记录,帮助训练程序找到模型是怎样写出它的。

这里与上一篇有了一处分岔。SFT把审核好的答案放进教材,模型按它练习;眼前这批答案由当前模型自己生成,再从结果中取得反馈。我给记录加上模型版本号,让每一次尝试都能追到生成回答时使用的那份参数。

采样:按照模型给出的概率生成一次回答。改变随机数,可以得到不同的候选。

奖励:评分器给一次尝试的分数,用来告诉训练过程哪些行为更值得增加。

强化学习:模型通过行动及其结果获得反馈,并据此调整后续行为的训练方法。

一个1分,怎样走回模型里面?

看到评分表时,最容易跳过的一步恰好在这里。答案已经打了分,可模型有5,000亿个参数。一个1,究竟该改动其中哪些数?

我先把四份回答拉到同一条比较线上。这组分数平均为0.5;每份减去平均值,得到+0.5、−0.5、+0.5、−0.5。正号表示比这组通常表现好,负号表示更差。现在每份回答都有了自己的方向,而不是所有回答共用一个平均分。

四份回答分别获得奖励,与组内平均比较形成各自信号,再通过训练损失和梯度更新参数

图中四张纸代表四份完整回答,1和0是核对结果,+0.5和−0.5表示减去组平均值后的差异。正式GRPO还会处理信号尺度、比较新旧模型的概率,并限制更新幅度。这些步骤一起把反馈组织成训练目标。

有了方向,训练程序重新读取题目和这四份回答,计算当前模型给回答中各个token的概率。相对表现好的回答,为增加这类回答的概率提供鼓励;较差的回答提供相反信号。把这些信号与概率结合,就能构造一个可以对模型参数求导的损失。

走到损失这里,事情终于接回了我们熟悉的训练流程。反向传播计算参数怎样影响这个损失,优化器再根据梯度调整Attention、前馈网络等可训练参数。新的参数会改变下一轮回答的概率分布。

评分器只需要知道50公里每小时是否正确;找出该改哪些参数,是训练计算图和优化器的工作。奖励也不是直接写进参数里的改变量。许多词和能力共享同一套参数,一次更新综合整批记录,具体效果要在新回答上看。

我选GRPO来组织这一轮训练。TRL的GRPO文档给出了组内比较、训练目标和奖励接口。它适合眼前这种可以反复尝试、又能核对结果的任务,先把“生成、评分、更新、再生成”的循环接起来。

相对奖励信号:把一次尝试与同题其他尝试比较后得到的训练信号。本文先用奖励减去组平均值说明好坏方向。

GRPO:组相对策略优化,通过同一问题的一组回答及其奖励构造学习信号。

反向传播:从训练损失出发,计算参数怎样影响损失,再把这些梯度交给优化器。

全对和全错,也会让训练停下来想一想

沿着同一批题继续看,有些题四次全对,有些题四次全错。在这套二元评分下,两组都没有谁比同组更好,比较很难给出有用的区分。

这让我开始回头整理题目。太容易的题已经做得很稳,太难的题又找不到值得加强的尝试。首批训练要保留一部分模型有机会做对、又尚不稳定的题,让不同回答能够拉开差别。完全不会的题,也可以先补入经过审核的示范,再回来练习。

每题四份回答先成为首轮配置。接下来比较四份和八份时,我给它们相同的GPU小时预算,看额外尝试带来的改善值不值得生成成本。候选更多,题目也不再只是评分表上的一行,它会变成更多需要生成、验证和保存的文字。

为什么首轮选GRPO,PPO放在哪里?

PPO通常再训练一个价值模型估计后续回报,帮助组织更新。当前先做可核对的单轮数学与代码任务,我选择GRPO,利用同题多份回答作比较,减少额外价值模型的工程负担。任务扩展到长程工具操作以后,再按反馈的稀疏程度、训练稳定性和成本比较算法。

PPO:近端策略优化,通过限制新旧策略变化来组织更新的强化学习方法,常配合价值估计。

分数对了,解释却不一定对

回看那两份得到1分的回答时,评分规则又暴露出一个空缺。只检查最后的50,前面写什么都可能被放过去。一段错误推导碰巧落到正确数字,也会得到同样的分数。

我把验收拆开:最终答案承担主要分数,单位与格式单独核对,解释内容抽样审核。要进一步训练推理过程,就先收集步骤可验证或经过人工审核的解答,再把过程反馈加入训练。模型输出的推理文字是一份可以检查的解答,我们能评它是否清楚、是否正确,却不能仅凭这些文字认定它完整展示了内部计算。

这个问题放到代码上更明显。沿用前面讲过的排序任务,如果测试只检查前三个数,那么只处理前三个数的程序也可能得高分。训练会追着分数走,测试漏掉的部分就变成了捷径。

于是评分器本身也进入检查清单。测试补上不同长度、重复值、空输入等情况,留出模型看不到的测试,再用随机输入检查边界。程序在隔离环境中运行,时间、资源和网络权限按任务限定,测试文件放在它不能修改的位置。每一次得分,都要能追到实际执行了什么。

2026年Anthropic的Reward Seeker研究讨论了模型利用环境漏洞追逐奖励的行为。眼前的排序测试让我更容易理解这个问题:评分器给出的每一分,都在告诉模型哪些路径值得重复。

改过评分器以后,我把保留的旧回答重新跑了一遍。新规则和旧规则的成绩分开放,避免把“试卷改了”记成“模型进步了”。

奖励投机:模型利用评分规则的漏洞获得高分,实际任务能力却没有相应提高。

可验证奖励:通过计算、测试或明确规则核对结果后给出的分数。

雨水解释没有唯一答案,怎么办?

数学题能核对数字,排序代码能运行测试。可回到上一篇的雨水解释,两份回答都可能正确,差别在于谁更适合小学生,谁更听得懂“三句话”这个要求。

我把同一问题的两份回答交给审核者。A写得很长,遗漏了水汽遇冷这一步;B更短,把条件和过程讲完整。审核者按事先写好的标准选择B,并记录原因。下一组交换展示顺序,隐藏版本名字,再看选择是否稳定。

这样得到的数据是一对回答,以及哪份更合适。开放任务先走DPO,用这批审核过的成对偏好训练模型。DPO的公开实现以问题、较好回答和较差回答为基本输入,把偏好连接到两份回答的相对概率上。

首轮实验因此分成两条,都从同一个SFT版本出发。数学与代码用GRPO和可验证奖励,开放回答用DPO和审核后的成对数据。分别评估以后,再决定组合顺序。这样看到某项能力改变,还能追到是哪一轮训练带来的。

如果后来需要模型持续生成开放回答、自动评分、反复更新,就再考虑训练奖励模型。那会多出一个需要校准和维护的评分者,当前先把人工标准与成对数据做扎实。

偏好数据:针对同一输入,记录哪个回答更符合要求的数据。

DPO:直接偏好优化,利用较好与较差回答的相对关系训练模型的方法。

开始跑批次,时间花到了哪里?

把平均速度那道题接通以后,我开始安排第一批1,000道题,每题四份回答。按每份平均输出1,000个token计算,生成端要写出约400万个输出token。题目输入、未完成的回答和重试还会继续占用时间。

这时才看清,这轮训练同时养着两种工作。前半段让模型逐步写答案,后半段把答案和评分读回来计算更新。只盯更新时GPU有多忙,就会漏掉生成、验证和模型切换的开销。

首轮先让两段轮流工作。固定当前模型版本,生成并评分一批回答;然后交给训练程序完成参数更新,再用新版本生成下一批。记录里的版本号把整个循环串起来,回答来自谁、由哪次更新使用,都能找到。

生成先从一个16卡副本验收,也就是两台八卡服务器一起承载这份500B模型。第24篇会展开它怎样处理输入、逐步输出。更新仍回到前面已经验收的训练系统,加载这批记录、计算损失和梯度。两阶段先在同一资源池里分时运行,模型加载与切换也计入耗时。

我把成本账分成生成、验证、切换和更新四栏。若生成最慢,就比较增加生成副本的收益;若很多时间消耗在切换,就再检查批次大小和两段重叠的安排。回答长度也一起记录:把每份平均输出从1,000改到2,000,输出量直接从400万涨到800万,增加的文字要用能力改善来证明价值。

生成与更新怎样使用同一资源池?

首轮500B演练先保存当前策略版本,导出推理权重,退出训练进程释放显存;推理环境生成并保存回答记录;生成结束后退出推理进程,再由训练环境加载同一策略及优化器状态,计算更新。Slurm分别调度两个阶段,模型文件与回答记录携带同一个版本号。

16卡生成候选采用机内TP8、跨两台机器PP2。启用前验证架构支持、权重转换与峰值显存,再生成1,000题的四个候选,记录耗时。更新阶段沿用已验收的训练并行方案,重新核对回答长度和批量。权重读取、格式转换和冷启动都计入周期。

截至2026年11月,TRL已公开异步GRPO的实验实现。其示例分布式栈采用FSDP2,与本系列的Megatron并行组合不同。我先在小模型上验证生成与更新重叠的机制,再让500B实现经过并行、权重同步与恢复验收。异步方案记录生成时的策略版本,控制旧版本回答带来的更新偏差。

策略:这里指当前模型产生回答时的概率分布。

在线数据:由当前或近期模型版本生成、随后参与训练的数据。

换一张卷子,再看它学到了什么

一轮更新结束,最先看的仍然是平均速度题。但它已经参与训练,答对只能说明循环可能在起作用。我换掉数字和表达,再把条件组合改一改,检查新题是否也有改善。

旁边还放着雨水解释、普通问答和信息不足的任务。数学练得更稳以后,模型会不会对每个简单问题都写很长的推导?遇到材料缺失,会不会为了给出答案而补出不存在的条件?这些变化与正确率一起进入记录。

每个候选保留任务成功率、答案长度、工具错误、严重违规样本和总GPU小时。评分器升级时,旧回答重新评分;模型更新时,独立题重新作答。两件事分开记录,训练带来的变化才能被看清。

我把最初的四份回答留在实验记录首页。50、75、50、45,后来接上了四个奖励、各自的相对信号、训练损失和一次参数更新。那条从“答得好”走回模型的路,现在每一步都有了落点。

接下来,桌上会有多份模型:一份数学更强,一份解释更清楚,还有一份回答更快。把它们挑成一个可以交给用户的版本,需要另一套判断。下一篇,我会把这些候选放到同一张验收单上。

新文章,直接发到你的邮箱。

AI、工程与实验,每月 1–2 封。

无垃圾邮件,随时取消。