大模型GRPO后训练实战:奖励设计与熵坍缩应对

作者:php是最好的2026.11.04 11:24浏览量:0

简介:本教程面向大模型算法与后训练工程师,系统讲解推理模型强化学习后训练的完整路径:从格式奖励与正确性奖励设计,到GRPO组内相对优势估计的实现细节;重点剖析多奖励求和引发的奖励坍缩与策略熵坍缩两大结构性问题,并给出监控指标、缓解配置、结果验证与排查方案,帮助读者稳定提升模型在数学、代码与科学问答等任务上的推理能力。

一、教程目标

让推理模型在数学、代码、科学问答等任务上变强,当前主流的后训练手段大致有两条路线:基于可验证奖励的强化学习,以及基于高质量推理样本的蒸馏监督。两条路线都很有效,但前者存在一些结构性缺陷,若不加处理,训练很容易在中途失去学习信号。本教程将带你完整走一遍强化学习后训练的落地流程,完成后你将能够:

  1. 为数学、代码、科学问答、翻译等任务设计可验证的奖励函数,包括约束输出格式的格式奖励;
  2. 理解并实现组相对策略优化(GRPO)的训练循环:组内采样、奖励计算、相对优势估计与策略更新;
  3. 识别多奖励场景下的“奖励坍缩”问题,并掌握分维度归一化等通用改进思路;
  4. 监控策略熵的变化,及时发现并缓解“熵坍缩”,避免模型过早丧失探索能力。

适合读者:大模型算法与后训练工程师、RLHF方向的研究与开发人员、需要评估推理模型训练质量的团队技术负责人。阅读前建议具备基础的深度学习与强化学习概念(策略、奖励、优势函数),以及一定的分布式训练经验。

二、适用场景

  • 数学、代码、科学问答等“答案可验证”任务的后训练:正确性可通过答案比对或测试执行直接判定;
  • 翻译、摘要等需要同时约束格式与质量的任务:需要在多个奖励维度之间权衡;
  • 已完成监督微调(SFT)、需要进一步提升推理能力与稳定性的模型;
  • 多奖励联合优化场景:正确性、格式合规、语言风格、长度控制等维度同时存在时。

三、前置准备

3.1 基础知识:先理解你的底座模型

后训练并不改变模型结构,底座的表达能力决定了强化学习探索的上限,因此先快速回顾两个核心组件。

(1)标准注意力层的四个阶段。输入为序列矩阵(形状为“序列长度×隐藏维度”):

  1. QKV线性投影:通过可学习的权重矩阵,把输入分别映射为查询(Query)、键(Key)、值(Value),每个注意力头有独立的子空间维度,这一步将原始输入转换到注意力计算所需的表征空间;
  2. 注意力得分计算:对查询与键做缩放点积,得到token之间的相关性得分;
  3. 归一化:通过softmax将得分转换为权重分布;
  4. 加权聚合:用权重对值向量加权求和,再经输出投影得到该层输出。

部分新式架构还会在注意力上引入门控机制来缓解“注意力沉降”(前几个token权重异常集中的现象),但这属于结构选型问题,不影响本教程的后训练流程。

(2)旋转位置编码。RoPE将位置信息以“旋转操作”注入查询与键:把每个注意力头的维度两两分组,按token位置旋转相应角度,内积结果自然携带相对位置信息。二维变体(2D-RoPE)将维度拆分为横、纵两组分别旋转以匹配平面坐标;多模态变体(M-RoPE)将文本、图像等不同模态的位置分配到不同维度组,用统一方式表达混合模态的相对位置。把这三类编码统一理解为“旋转+维度拆分”,概念上就会非常直观。

3.2 环境与资源

  • 训练框架:任意支持自定义损失与采样循环的分布式训练环境即可,可使用自建集群或云上GPU算力(例如百度智能云提供的通用GPU计算实例类目);
  • 显存预估:至少容纳策略模型(训练态)与参考模型(冻结,用于KL约束),再加上组采样产生的激活值;建议开启梯度检查点与混合精度以降低开销;
  • 数据准备:每条样本包含问题与参考答案(或可执行校验逻辑);建议按难度分层,难度过于极端的样本在训练中期几乎不产生有效梯度(原因见步骤4的排查部分)。

四、实施步骤

步骤1:明确任务目标与奖励维度

做什么:把任务拆解为“可被机器判定的信号”。数学题用最终答案比对;代码题用预置测试用例执行;科学问答用结构化答案抽取比对;翻译任务则需额外考虑译文质量与输出格式。

为什么:可验证奖励是当前推理后训练主流路线的基石,奖励的可靠性直接决定训练上限,不可靠的奖励会诱发“钻空子”行为。

注意:先用单奖励跑通全流程,再引入多奖励。GRPO这类方法最初是为单奖励优化设计的,直接迁移到多奖励场景时合理性并未被充分验证,需要额外处理(见步骤4)。

步骤2:设计奖励函数

以翻译任务为例,要求模型按如下格式输出:以两个特殊token界定思考内容的边界,先输出“思考段”,再输出“译文段”。奖励由两部分组成:

  • 格式奖励:检查特殊token是否成对出现、思考段与译文段是否正确分离,取0或1;
  • 质量奖励:译文与参考译文之间的匹配程度,可通过规则比对或独立评测模型打分。

通用伪代码:

  1. def compute_reward(response, sample):
  2. r_format = 1.0 if has_valid_think_tags(response) else 0.0
  3. r_quality = score_translation(extract_answer(response), sample.reference)
  4. return w_format * r_format + w_quality * r_quality

注意:格式奖励本质是“入门门槛”信号,权重不宜过高。若格式权重过大,模型会优先学会“永远输出合法格式”而牺牲译文质量,这本身就是一种轻度的奖励坍缩。

步骤3:实现GRPO训练循环

机制核心:对每个问题采样一组(G个)回答,用组内相对表现替代价值网络来估计优势,从而省去critic,显著降低显存占用与训练复杂度。

  1. for batch in loader:
  2. group = [sample(policy, prompt, temperature) for _ in range(G)]
  3. rewards = [compute_reward(r, gt) for r in group]
  4. mean, std = avg(rewards), std(rewards)
  5. adv_i = (r_i - mean) / (std + eps) # 组内相对优势
  6. loss = -avg(adv_i * logprob(policy, r_i)) + beta * KL(policy, ref)
  7. update(loss)

为什么用相对优势:同题组内比较天然消除了题目难度带来的基线差异,同时避免了维护一个难以训练好的价值网络。

注意:当组内奖励全部相同(全对或全错)时,优势为零,该组不产生梯度。这说明训练数据难度应贴近模型当前能力的“边界区域”,过难或过易的样本都是无效开销。

步骤4:识别并缓解多奖励场景的“奖励坍缩”

问题本质:GRPO把多个奖励先加权求和成一个标量,再做组内相对估计。求和是不可逆的信息压缩:不同的奖励组合会映射为相同的总分,进而映射为相同的优势值。后果包括:

  • 各奖励维度之间的结构信息丢失,优势估计的区分度下降;
  • 容易拿满的强维度(如格式分)会淹没难以提升的弱维度(如正确性);
  • 模型学会牺牲难维度换取易维度的分数,表现为“投机”。

排查方法:分维度统计组内均值与方差,计算每个维度与最终优势值的相关性。若某个维度与优势几乎不相关,说明它已被其他维度淹没。

通用改进思路:

  1. 分维度归一化:每个奖励维度先在组内标准化,再加权融合,避免量纲与难度差异互相干扰;
  2. 分组分别估计优势:把不同奖励维度视为独立信号源,分别计算相对优势后再融合,这是近期业界针对该结构性缺陷提出的代表性改进方向;
  3. 课程式引入:训练早期只启用格式奖励,中后期逐步提高质量奖励的权重。

步骤5:监控策略熵,识别熵坍缩

策略熵衡量模型生成token时的不确定性:高熵意味着采样多样、探索性强,可能发现更优的推理路径;低熵意味着输出趋于确定、过度依赖已有策略、缺乏创新探索。

熵坍缩的典型形态:在没有任何熵干预的训练初期,策略熵快速单调下降,模型过早锁定单一解题模板,此后准确率增长停滞,甚至因重复生成而退化。

必须在训练中持续记录以下指标:

  • 每步的平均token熵与熵分布(是否出现双峰或长尾塌陷);
  • 组内奖励方差(区分度是否仍然存在);
  • 响应长度分布(异常变短或变长往往是坍缩前兆)。

步骤6:缓解熵坍缩

  1. 损失中加入熵正则项:总损失 = 策略损失 + KL约束项 − 熵系数×策略熵,熵系数可从0缓慢升温;
  2. 采样侧干预:保持适中的采样温度,或对熵低于阈值的生成片段动态提升温度;
  3. 数据侧干预:保留部分存在多种解法的样本,避免数据本身只包含单一推理路径;
  4. 训练节奏:降低学习率、适当提高KL系数,放缓策略收缩速度。

五、关键配置说明

  • 组大小G:常见取值在8~64之间。过小则优势估计噪声大、训练抖动;过大则采样与显存成本线性上升;
  • 采样温度:直接决定初始熵水平,温度过低等同于提前人工坍缩;
  • KL约束系数:控制策略偏离参考模型的幅度,过大会抑制学习,过小则模型容易“跑飞”输出不可读内容;
  • 熵系数:控制熵干预强度,过大会让模型“为了多样而多样”、牺牲任务奖励;
  • 奖励权重:各维度配比应随训练阶段动态调整,建议做成可热更新的配置项而非硬编码常量。

六、结果验证

训练是否成功,从四个维度判断:

  1. 任务指标:留出验证集上的准确率或通过率相对SFT基线有稳定提升,且后期不再回落;
  2. 熵曲线:下降平缓并最终稳定在非零区间,而非趋近于零;
  3. 格式合规率:界定思考内容的特殊token成对出现率接近100%,思考段长度分布正常;
  4. 行为分布:响应长度与组内奖励方差保持健康,无整体性塌缩。

七、常见问题与排查

问题1:训练几十步后熵迅速归零。原因:0/1式奖励信号过密导致全组得分趋同、学习率过大、采样温度过低。处理:加入熵正则并逐项检查上述配置,必要时回滚到较早检查点重新起训。

问题2:格式合规率很高但准确率停滞。原因:典型的奖励坍缩,格式维度淹没了正确性维度。处理:降低格式权重、启用分维度归一化、按维度检查与优势的相关性。

问题3:大量组内奖励完全一致、梯度为零。原因:数据难度与模型当前能力错配。处理:按通过率过滤数据,保留通过率处于中间区间的“边界样本”。

问题4:后期响应越来越长且出现重复循环。原因:熵坍缩叠加缺乏重复惩罚。处理:加入重复惩罚或长度惩罚项,配合熵干预,必要时早停。

问题5:输出“看起来正确”但校验失败。原因:奖励函数存在可利用漏洞。处理:加固校验逻辑(例如严格抽取最终答案后再比对),并对奖励函数做对抗性自查。

八、优化建议

  • 性能:组采样与奖励计算并行化;奖励打分优先使用轻量规则而非大模型评测,缩短训练关键路径;
  • 稳定性:为策略熵、组内方差设置自动告警阈值,触发即暂停训练而非硬扛;
  • 可维护性:奖励函数版本化并配套回归评测集,任何改动先通过回归再进入训练环境;
  • 成本控制:优先训练边界难度样本,过易或过难的样本期望梯度贡献接近零,属于纯开销;
  • 安全:对来源不明的训练题目做清洗,防止提示注入借助奖励通道影响训练方向。

九、总结

本教程从奖励函数设计出发,走通了GRPO组内相对优势估计的完整训练循环,并重点处理了两个结构性问题:多奖励求和导致的奖励坍缩(分维度归一化、分组分别估计优势)与训练过程中的策略熵坍缩(熵监控与正则干预)。后续值得继续深入的方向包括:对推理步骤而非仅最终答案打分的过程奖励、更精细的多奖励分解与融合策略、面向探索的采样算法设计,以及训练数据难度的动态课程编排。