为什么推理能力需要专门训练
普通大模型在预训练和指令微调阶段学到的,更多是「快速联想」式的回答能力:看到一个问题,直接顺着最可能的模式把答案写出来。遇到需要多步推理的数学题、逻辑题或复杂代码任务时,这种能力就不够用了——模型会在中途出错,然后沿着错误方向一路错下去。o1 一类推理模型的出现,说明「推理」是可以被专门训练出来的:让模型在给出最终答案之前,先产出一段长长的思维链,一步一步想清楚再回答。
把推理能力训练出来,靠的不是堆更多普通文本,而是强化学习。核心思路是:让模型自由生成思考过程,然后用一个明确的奖励信号(比如数学题答案对不对、代码能不能通过测试)去强化那些「想对了」的路径,弱化那些「想错了」的路径。经过大量这样的强化,模型会逐渐学会自我纠错、回溯重试、分步验算,推理能力就自然涌现了。
推理模型的核心不是「更聪明的底座」,而是「更会思考的过程」:用强化学习把长程思考的行为固化进模型参数。
- 思维链数据推理模型训练的基础:高质量分步思考样本。
- 可验证奖励数学、代码等有客观答案的任务,奖励信号容易设计。
- PPO经典强化学习算法:策略网络加价值网络,带 KL 约束。
- GRPO去价值网络的群体相对策略优化,显存更省、实现更简单。
推理数据:思维链与可验证奖励
强化学习训练推理模型之前,通常先做一轮监督微调(SFT),让模型见过「什么是好的思考过程」。这批思维链数据从哪里来?早期的做法是人工编写,成本极高;现在更多是用大模型蒸馏:让一个已经很强的推理模型去解数学题,把它的思维链抽出来,作为训练样本。数据覆盖的题型越广、难度越有梯度,后面强化学习的起点就越好。
有了基础能力之后,强化学习阶段不再需要人工写思维链,只需要一个奖励信号。这里的关键是「可验证奖励」:数学题直接比对最终答案,编程题让代码跑测试用例,这类任务答案是客观的,模型无法靠耍小聪明骗过奖励。反观开放式问答,奖励要么依赖人工打分,要么依赖另一个模型判断,噪声大、成本高,强化学习的效果就不那么稳定。所以推理模型的训练,一般先从数学和代码这两类「答案可验证」的任务做起。
# 可验证奖励的判定思路(以数学题为例)
# 1. 模型输出分为两部分:思维链部分 + 最终答案部分
# 2. 用规则提取最终答案(比如 \boxed{...} 里的内容)
# 3. 与标准答案比对:字符串相等或数值等价
# 4. 答对给 +1,答错给 0;格式不合规(没提取出答案)也给 0
# 5. 注意:奖励只看最终结果,不评过程对不对
def verifiable_reward(response, ground_truth):
answer = extract_final_answer(response)
if answer is None:
return 0.0
return 1.0 if is_equivalent(answer, ground_truth) else 0.0
PPO 算法拆解:策略、价值与 KL 约束
PPO(Proximal Policy Optimization)是强化学习训练语言模型最常用的算法,也是 RLHF 里那一步「强化学习」的默认选择。它的基本流程是:让当前策略模型(Policy)生成一批回答,算出每条回答的奖励,再用奖励去更新策略,让「高奖励的回答」出现概率变大。为了防止一次更新步子迈得太大把模型改崩,PPO 用「重要性采样」和「裁剪」控制每次更新的幅度。
PPO 在语言模型场景里通常还带一个价值网络(Critic),用来估计「从某个 token 开始,最后能拿到多少奖励」。价值网络的存在是为了算 Advantage(优势值)——比平均表现好多少,决定该把这个 token 的概率调高还是调低。另外,PPO 里几乎一定会加 KL 散度约束:新策略不能离参考策略(一般是 SFT 之后的模型)太远,否则模型会为了奖励彻底放飞,说胡话甚至自我重复。
# PPO 单步更新的核心伪代码
# 1. 策略模型 pi_theta 生成回答,记录每个 token 的概率
# 2. 价值网络 V 估计状态价值,计算优势 A_t
# 3. 计算新旧策略概率比 r_t = pi_new / pi_old
# 4. 裁剪目标:min(r_t * A_t, clip(r_t, 1-eps, 1+eps) * A_t)
# 5. 加上 KL 惩罚项:- beta * KL(pi_new || pi_ref)
# 6. 梯度更新,多轮 epoch 内重复采样与优化
GRPO 算法拆解:去价值网络的群体优化
GRPO(Group Relative Policy Optimization)是 DeepSeek-R1 带火的一类做法,核心思想很直接:不再训练一个价值网络,而是让策略模型对同一个问题生成一组(比如 8 条)回答,用这组回答内部的相对表现来定义优势。哪条回答比组内平均水平好,就奖励它;比平均差,就压制它。这样 Advantage 的计算完全来自采样组本身,不需要额外的价值网络。
去掉价值网络带来的好处非常实际:少了一个和策略模型差不多大的网络,显存占用明显下降,训练吞吐更高,分布式实现的复杂度也低很多。GRPO 同样保留 KL 约束,让新策略贴着参考策略走。对训练推理模型这种「采样轨迹特别长」的场景来说,GRPO 把每个问题采样多条回答的开销摊进了批次里,工程上比 PPO 更好落地。
# GRPO 单步更新的核心伪代码
# 1. 对问题 q,从策略模型采样一组回答 a_1 ... a_G(比如 G=8)
# 2. 逐条计算可验证奖励 r_i = verifiable_reward(a_i)
# 3. 组内归一化:A_i = (r_i - mean(r)) / std(r)
# 4. 优势为正的回答概率调高,为负的调低
# 5. 同样加 KL 惩罚,控制与参考策略的距离
# 6. 一个组内完成优势计算,不需要价值网络
- 省显存没有价值网络,少一个和策略同规模的网络。
- 省实现优势直接来自组内采样,无需时序差分估计。
- 够用可验证奖励噪声小,组内相对比较已经足够稳定。
PPO 与 GRPO 的工程取舍
两种算法没有绝对的优劣,只有适不适合你的场景。PPO 理论上更通用:价值网络可以处理奖励不明确的连续型任务,适合通用对齐(RLHF)这类奖励模型打分的情况;代价是显存翻倍、超参数多(学习率、裁剪阈值、KL 系数、价值网络损失权重),调起来费时费力。GRPO 是为「批量采样、奖励可验证」量身定做的,数学和代码任务里效果与 PPO 相当,但显存省、实现快,很多开源推理模型项目直接选它起步。
| 对比项 | PPO | GRPO |
|---|---|---|
| 价值网络 | 需要,显存开销大 | 不需要,省显存 |
| 优势计算 | 价值估计 + 时序差分 | 组内相对归一化 |
| 奖励类型 | 可验证奖励、奖励模型均可 | 更适合可验证奖励 |
| 实现复杂度 | 较高,超参数多 | 较低,易复现 |
| 典型场景 | RLHF 通用对齐 | 数学 / 代码推理训练 |
训练流水线:从 SFT 到 RL 再到蒸馏
一套完整的推理模型训练流水线分四步。第一步是数据准备:收集数学、代码等领域的题目和标准答案,并准备一批思维链样本。第二步是监督微调:用思维链样本做 SFT,让模型学会「先思考再回答」的基本格式,这是强化学习的起点,起点太差后面很难救。第三步是强化学习:用 PPO 或 GRPO 配可验证奖励,在题目池上迭代若干轮,每轮采样一批回答、算奖励、更新参数,逐步把推理能力压进模型。第四步是蒸馏与对齐:训练好的推理模型生成大量思维链样本,去微调一个更小或更快的模型,把推理能力迁移出去,同时补一轮偏好对齐保证输出风格可用。
整个流水线里最耗资源的是第三步强化学习。一个常见经验是:题目池要有足够的规模和难度分布,训练中要持续监控「正确率有没有在涨、回答长度有没有失控、KL 是否被压到合理范围」。如果正确率一直不动,多半是模型已经能靠格式蒙混奖励,需要检查奖励设计;如果回答长度暴涨,说明模型在靠长度碰运气,要加长度惩罚或收紧 KL。
推理模型的训练不是一步到位的:SFT 教会格式,RL 强化能力,蒸馏扩大规模,对齐保证可用,四步缺一不可。
测试时计算与持续迭代
训练之外,推理模型还带火了「测试时计算」这个概念:既然模型会思考,那让它多思考一会儿,是不是就更准?实际部署里确实可以这么做——给模型更多生成预算(允许更长的思维链)、多次采样取最优、或者用搜索(比如思维树)在推理过程中做回溯和剪枝。测试时计算和训练时的强化学习是互补的:训练把「会思考」写进参数,推理时再给「多思考」的时间和空间。
最后提醒一点:推理模型的评测要跟着能力一起升级。传统的单选题评测看不出推理模型的差距,更合理的做法是测多步数学、竞赛题、复杂代码任务,并同时记录正确率、平均思考长度和成本。持续迭代的思路是:每跑一轮强化学习,就在评测集上对比上一版,确认能力真的在涨,再决定要不要扩大题目池、调高难度或换奖励函数。推理模型这条技术路线还在快速演进,但「数据—训练—评测」这个闭环,是任何时候都不会过时的基本功。