第 16 讲:后训练 II —— 可验证奖励的强化学习(RLVR)

目录 · ← l15 · l17 →

第 16 讲:后训练 II —— 可验证奖励的强化学习(RLVR)

日期:5 月 20 日(周三,Spring 2026) | 讲师:Tatsu Hashimoto | 材料:lecture_16.pdf | 截止:作业 4 到期、作业 5 发布

概览

RLHF 难以干净地扩展(过度优化);而可验证奖励的强化学习(RLVR)可以——在奖励精确可验证的领域(数学答案对错、测试是否通过)中优化你真正想要的东西。本讲覆盖 PPO→GRPO、GRPO 的变体与缺陷(baseline 的合法性、长度偏差),以及三个案例研究:DeepSeek-R1(GRPO、R1-zero、SFT+RL 配方、蒸馏)、Kimi K1.5(长度控制、课程学习、RL 基础设施)与 Qwen 3(低数据量 RLVR、思考模式融合、智能体 RL)。

核心概念与定义

  • RLVR:奖励可验证(答案与标准答案一致、测试通过)而非从人类偏好学来的强化学习。它绕开了奖励模型的过度优化问题,并支持干净的扩展(即通向 o1/r1 的路径)。
  • 策略梯度谱系:∇E[R] = E[R·∇log p](高方差)→ TRPO(信任域)→ PPO(裁剪重要性比)→ GRPO(去掉价值模型、使用组内归一化奖励)。
  • LM 中的 PPO 回顾:动作 = token;末尾一个大的稠密奖励;逐 token KL 惩罚;γ=λ=1 的 GAE(bandit 设定:优势 = reward-to-go − value)。实现复杂度:外层 rollout 循环、内层优化、价值模型(吃显存、需额外调参)、奖励塑形(末 token 奖励 + KL)、裁剪。
  • 为什么不用 PPO / 为什么不用 DPO 做推理:PPO 复杂且价值模型吃显存;DPO 需要成对(Bradley-Terry)数据且是离线的。GRPO:没有价值函数、不需要成对数据、同策略在线——”你完全可以(而且确实有人)写出极小的 GRPO 实现”。
  • GRPO
    • 优势:对每个提示采样一组 G 条回答;优势 = (奖励 − 组均值)/组标准差——”组内 z-score”。在同策略在线设定下,它就是”带组内归一化奖励的策略梯度”。
    • 目标:loss = −(1/G)Σ Σ_t [advantage·min(ratio, clip(ratio)) − β·KL](含对参考策略的逐 token KL 与长度归一化)。
    • 算法:为每条 rollout 计算奖励 → 按组做均值/方差归一化 → 计算 KL 项 → 对损失做梯度更新。
  • GRPO 的理论缺陷(一段”小型 RL 绕路”):减去组均值是合法 baseline(无偏),但除以组标准差不是合法 baseline——它会让梯度产生偏差。无偏变体(Liu 等 2025)接近于带 leave-one-out 的 REINFORCE。此外标准 GRPO 目标存在长度偏差:标准差项会放大过易/过难题目的权重;长度归一化与之相互作用,修法需要重新加权长度归一化项。
  • DeepSeek-R1——标志性的公开 RLVR 配方:
    • R1-zero(受控设定):底座 DeepSeek-V3,用 GRPO,奖励为 准确率奖励 + 格式奖励(使用思考标签)。涌现现象:CoT 变长、”aha moment”——不过后续分析(Dr. GRPO)认为长度增长部分来自有偏目标,且底座模型本就具备”aha”行为。
    • R1 增加了:SFT 冷启动(长 CoT 初始化:约 1000 道数学/科学题配 Gemini/R1 的长 CoT——”即使样本很少,也足以自举出推理能力”)、语言一致性奖励(RL 天然会让语言混杂)、第二阶段使用不可验证奖励(用 V3 做裁判,60 万条),随后是常规 SFT/RLHF 后训练(20 万条非推理 SFT + R1-zero 式 RLHF)。
    • 不用 PRM、不用 MCTS:R1 “终结了关于 MCTS/PRM 必要性的猜测”(过程奖励模型与蒙特卡洛树搜索试过,并不需要)。
    • 蒸馏:R1 生成 80 万条 CoT 轨迹 → 蒸馏进 Qwen 2.5——小模型也能推理。
  • Kimi K1.5
    • 数据构造:数学类语料按主题平衡;剔除多选/判断题(假阳性);只保留模型 best-of-8 失败的样本(难度筛选)。
    • RL:基于参考的奖励模型;用类 DPO 推导(非参数假设 + 解出 r);用平方损失作代理;带正则的 baseline 策略梯度。
    • 长度控制:每批次的长度奖励——λ ∈ [−0.5, 0.5];答对的被激励更短;答错的被激励短于组内中心;并且在训练后期才启用。
    • 课程学习:给数据打难度标签、由易到难;按 (1 − 成功率) 采样以避免重复已解出的题。
    • 奖励:代码——有标准解的题目 + 自动生成新测试用例;数学——用 80 万条样本训练 CoT 奖励模型做答案等价性校验。
    • RL 基础设施:同策略 rollout 即(慢速)推理;训练与推理框架切换;长 CoT 造成批次不均——利用率是一等问题。
  • Qwen 3:SFT + 推理 RL,GRPO 只用了 3995 条样本(低数据量 RLVR!);难度筛选(best-of-n、剔除不用 CoT 也能做对的题、剔除与验证集相似的题);思考模式融合(thinking-mode fusion)——把非思考与思考数据用标签混合,并用特殊字符串提前终止;随后再做通用 RLHF(数学/STEM 能力会略有下降)。Qwen 3 Coder Next:中训练(GitHub、600B 长上下文”仓库级”token、PR + RAG 检索仓库状态、合成代码问答、agent 轨迹)+ 专家模型(web dev、UX、QA、SWE)+ 智能体 RL(80 万个自动构建的 SWE-bench 式环境)。
  • 整体图景:SFT + 推理 RL(GRPO)→(可选蒸馏)→ 通用 RLHF——RLHF 排在推理 RL 之后

代码示例:GRPO 损失(作业 5 必修部分的核心)

代码(Python):

import torch
import torch.nn.functional as F

def grpo_loss(log_probs, old_log_probs, rewards, kl, beta=0.01, clip_eps=0.2):
    """带组内归一化优势的 GRPO。
    log_probs/old_log_probs: [G, T],一个提示组内(G 条回答、T 个 token)
    rewards: [G] 每条回答的标量奖励
    kl: [G, T] 相对参考策略的逐 token KL
    """
    # 优势:组内 z-score(注意:不是无偏的——见第 16 讲)
    adv = (rewards - rewards.mean()) / (rewards.std() + 1e-4)

    ratio = torch.exp(log_probs - old_log_probs)          # [G, T]
    clipped = torch.clamp(ratio, 1 - clip_eps, 1 + clip_eps)
    # token 级损失:min(ratio, clip(ratio)) * adv,加 KL 惩罚
    per_token = -torch.min(ratio, clipped) * adv.unsqueeze(1) + beta * kl
    return per_token.mean()                                # + 长度归一化

代码做了什么: 实现 GRPO 目标:组内归一化优势(均值/标准差)、逐 token 的裁剪重要性比、以及对参考策略的逐 token KL 惩罚——即讲义提到的完整”tiny GRPO”(nano-aha-moment 风格)。

实现深挖:

  • 为什么要组内归一化:每个提示有 G 条 rollout,组均值是合法 baseline(降低方差、无偏);除以标准差能跨提示统一奖励尺度,但会使梯度有偏(讲义中的 RL 绕路——无偏版本是 leave-one-out REINFORCE)。作业 5 正是要求你实现两者并做对比!
  • 为什么要裁剪:与 PPO 同理——给重要性比设上界;作业会探索不裁剪裁剪两种变体。
  • 为什么要 KL 项:让策略贴近参考策略(SFT 模型),防止奖励被薅与模型崩塌;作业还加入了长度归一化项(按 1/|y| 重加权),因为原始 GRPO 偏好更长的回答。
  • 为什么标准差里要加 1e-4:当组内奖励全部相同时(std = 0)的稳定因子——实践中的真实坑。

与作业的联系:作业 5 的必修部分:(1) 在数学数据上做 zero/few-shot 与 CoT prompting 基线;(2) 端到端实现 GRPO(vLLM rollout + 策略梯度更新 + 指标);(3) 实现策略梯度估计器变体——baseline 选择(组均值 vs 其他)、重要性权重裁剪、长度归一化。这个代码块就是这三项任务的数学核心。

代码示例:同策略 rollout 循环(RL 基础设施模式)

代码(Python):

def train_step(policy, ref_policy, vllm_server, prompts, tokenizer, g=8):
    # 1. Rollout:从当前策略采样每提示 G 条回答(同策略!)
    responses, response_masks = vllm_server.sample(prompts, n=g)
    # 2. 打分:可验证奖励(精确匹配 / 单元测试)
    rewards = score(responses, answers)               # [num_prompts, G]
    # 3. 计算当前策略与参考策略下的对数概率
    log_probs = policy.log_probs(prompts, responses)          # [P, G, T]
    old_log_probs = policy.log_probs.detach().clone()          # 更新前先存好
    ref_log_probs = ref_policy.log_probs(prompts, responses)   # KL 锚点
    kl = log_probs - ref_log_probs
    # 4. 对 GRPO 损失做一次(或多次)优化器更新
    loss = grpo_loss(log_probs, old_log_probs, rewards, kl)
    loss.backward(); optimizer.step()

代码做了什么: 勾画 RLVR 的训练步:从在线策略采样(同策略)、用可验证奖励打分、计算当前/旧/参考策略的对数概率,并优化 GRPO 损失——用梯度累积跨 micro-batch 以节省显存。

实现深挖:

  • 为什么必须同策略:rollout 必须来自当前策略;这正是 RL”同策略”的含义,也是作业若每个推理批次跑 32 步训练就变成”32× 离策略”的原因——重要性比要用来修正漂移。
  • 为什么用 vLLM:rollout 就是规模化推理;作业里的 VLLMServer(带 CoT 停止字符串)就是工程实现。长 CoT 造成的批次不均(见 Kimi 部分)是真实的基建问题。
  • 为什么需要参考策略的对数概率:KL 锚点;每个批次只算一次(冻结参考)是标准的高效做法。

与作业的联系:作业 5 的完整 GRPO 训练循环 = 这段草图:VLLMCompletion/VLLMServer 接口、response_mask 处理、checkpoint 保存/加载(get_model_and_tokenizer)、指标(奖励均值、KL、回答长度)以及梯度累积。”GRPO 变体”任务(不裁剪/裁剪、baseline、长度归一化)就是作业的估计器部分。

关键要点

  1. RLVR 是 RLHF 在”奖励可验证”领域的可扩展继任者——它优化你真正想要的东西,回避了奖励模型的过度优化。
  2. GRPO = PPO 减去价值函数:组内归一化优势 + 裁剪比 + KL 惩罚;简单到约 20 行就能写出来——但它的标准差归一化理论上是有偏的(无偏版本约等于 leave-one-out REINFORCE),并且存在长度偏差。
  3. DeepSeek-R1 的配方:冷启动 SFT(约 1000 条长 CoT 样本)→ 用准确率 + 格式(+ 语言一致性)奖励做 GRPO → 通用 RLHF;不需要 PRM/MCTS;蒸馏可以把推理能力迁移到小模型。
  4. Kimi K1.5 展示了工程面:难度筛选、课程学习、长度控制奖励以及繁重的 RL 基础设施(rollout 效率、批次不均)。
  5. Qwen 3 证明低数据量 RLVR 可行(约 4000 条样本上跑 GRPO),并展示了现代配方:SFT → 推理 RL → 通用 RLHF,配合思考模式控制与智能体中训练。

常见陷阱

  • 把标准差归一化后的优势当成无偏:组均值 baseline 没问题;除以标准差会使估计有偏——作业”GRPO vs 无偏变体”的对比正是为此。
  • 长度偏差:原始 GRPO(以及 RLHF 整体)会拉长回答;使用长度归一化目标(以及 Kimi 式的长度奖励,且在后期启用)。
  • 格式奖励被薅:R1 的格式奖励(思考标签)可被钻空子——要验证内容而不只是标签。
  • 用陈旧策略做 rollout:过度离策略且不做修正(重要性比/裁剪)会让估计器退化;作业中 32× 离策略的步数必须配合裁剪变体。
  • 忽视基础设施:规模化的 RL 是推理受限的;长 CoT 导致批次不均会浪费 GPU——要仔细做 padding/调度。
  • 跳过 SFT 冷启动:R1-zero 能工作,但 SFT 初始化(少量长 CoT 数据)会显著提升稳定性与质量。

复习题

  1. 问: GRPO 从 PPO 中去掉了什么?被去掉的部分由什么替代?
    • 答: GRPO 去掉了价值(critic)网络及其优势估计。取而代之的是按提示组计算优势:(奖励 − 组均值)/组标准差——即 G 条采样回答内的 z-score——因此不需要训练价值模型。
  2. 问: 为什么 GRPO 的标准差归一化在理论上存在问题?无偏替代方案是什么?
    • 答: 减去组均值是合法(无偏)的 baseline,但除以组标准差会改变估计量的期望——不是合法 baseline。无偏变体(Liu 等 2025)接近于带 leave-one-out baseline 的 REINFORCE(并对长度归一化项做了修正)。
  3. 问: 为什么 R1 不需要 MCTS 或过程奖励模型(PRM)?
    • 答: R1 用 GRPO + 结果级可验证奖励(准确率 + 格式)就得到了强推理能力(超过 o1),无需搜索或逐步监督;R1 论文的”不成功尝试”一节记录了 PRM 与 MCTS 被尝试过但并非必需——从而大幅简化了配方。