返回 AICAP-180
B11 · Day 103GRPO/后训练机理 + 首跑

R1 训练范式 (arXiv:2501.12948)

Day 102 把 GRPO 的「优势怎么算」钉死了——但 GRPO 只是优化器,奖励 r_i 从哪来才决定训出的模型对不对。昨天用的 0/1 奖励是哪来的?今天进入 R1(DeepSeek-R1, arXiv:2501.12948)的核心答案:RLVR——可验证奖励。对 math/code 这类有 ground truth 的任务,用确定性 grader 直接给 0/1,把整个 RM 省掉。这是

阶段: B11 · GRPO/后训练机理 + 首跑(Day 101-110) 标签: #rlvr #r1 #verifiable-reward #cold-start

今日导引(由浅入深)

Day 102 把 GRPO 的「优势怎么算」钉死了——但 GRPO 只是优化器,奖励 r_i 从哪来才决定训出的模型对不对。昨天用的 0/1 奖励是哪来的?今天进入 R1(DeepSeek-R1, arXiv:2501.12948)的核心答案:RLVR——可验证奖励。对 math/code 这类有 ground truth 的任务,用确定性 grader 直接给 0/1,把整个 RM 省掉。这是 B1→B18 曲线上「会改模型」的奖励侧拼图,紧接昨天的优化器侧。今天复用本仓的确定性 grader 写一个可验证 reward,对 10 道算术样本打分——今天的「最小可判定产出」:10 样本得分准确率%(确定性,无需 key)。

优化器(Day 102 GRPO)+ 奖励(今天 RLVR)= R1 的两块基石。理解了「奖励由程序给而非由 RM 学」,就理解了 2025-2026 开源推理模型为什么能在不堆 RM 标注的前提下做强推理。

1. 机理精读

RLVR(Reinforcement Learning with Verifiable Rewards)的核心:当任务有 ground truth 时,奖励应由确定性程序给出,而不是由学来的 reward model 近似。 R1 用一个 grader(如正则提取模型答案中的数值 + 与标准答案精确匹配)对 math/code 任务直接产出 0/1 奖励——答对得 1,答错得 0。这比 RM 范式有三个硬优势:零标注成本(grader 是写出来的不是训出来的)、零奖励噪声(精确匹配没有 RM 的拟合误差)、不可被 reward model 漏洞利用(grader 漏洞另说,见误区)。

R1-Zero:纯 RL 无 SFT 冷启的涌现与代价。 R1 论文最反直觉的发现是 R1-Zero——完全不做 SFT,直接在 base 模型上跑 RLVR,reasoning 能力(自我验证、回溯、长链思考)会自发涌现,AIME 等数学基准大幅提升。但代价是输出可读性差:语言混杂、格式混乱、有时夹杂多语言碎片——因为纯 RL 只优化「答对」,不优化「人能读懂」。

R1:用少量 cold-start SFT 修格式,再 RL。 完整版 R1 在 RL 前先用少量高质量 cold-start SFT 数据把输出格式、可读性、语言一致性修好,给 RL 一个干净的起点,再跑 RLVR。结果是「既保留了涌现的推理能力,又有可读的输出」。这条「冷启 SFT → RLVR」的两段式,是 2026 开源推理模型训练的标准配方。

R1-Zero 涌现说明了什么? 它证明了推理能力不必由示范「教」出来——只要奖励正确答案、给足探索(GRPO 采样),模型会自己发现自我验证、回溯、拉长思考链这些策略。这把「能力从哪来」的答案从「模仿更强的老师」改写成「在可验证奖励下自我搜索」。但它也暴露纯 RL 的盲区:reward 没奖励的东西(可读性、语言一致性)就会退化——这正是为什么要 cold-start SFT 兜底。对本仓 AML 场景的启示:若只奖励「typology 命名对」,模型可能学会给对名字却写不出合规叙述,所以 reward 必须同时覆盖「对」和「可用」(Day 105)。

为什么 RLVR + GRPO 是天作之合。 GRPO 需要对每个 prompt 采样一组 rollout 并打分;RLVR 的 grader 打分又快又确定,正好喂满 GRPO 的组采样。若用 RM 打分,每个 rollout 都要过一遍 RM 前向,慢且有噪声。所以 R1 = GRPO(优化器)× RLVR(奖励)的组合拳。资源:DeepSeek-R1(arXiv:2501.12948,2025-01)。

RLVR grader vs RM 的取舍表(定性):

维度确定性 grader(RLVR)reward model(RM)
标注成本写代码(一次性)收偏好数据 + 训 RM(持续)
奖励噪声零(精确匹配)有(拟合误差)
可被 hackgrader 漏洞可被钻RM 弱点可被钻(更隐蔽)
适用任务有 ground truth(math/code/字段)开放式偏好(无唯一答案)
打分速度快(正则/规则)慢(一次前向)

结论:任务可验证 → 用 grader(RLVR);任务靠主观偏好 → 才需要 RM。R1 把可验证任务这条路走到极致,这也是它能在不堆 RM 的前提下做出强推理的原因。

2. 推导 / 手算 / 代码走读

可验证 reward 的最小实现:从模型输出里正则提取数值答案,与标准答案精确匹配。本仓 src/agent/train/grpo.ts 已提供两块积木:

  • exactMatchReward(output, target)(grpo.ts:17):output.trim() === target.trim() ? 1 : 0——最朴素的精确匹配 grader。
  • composeRewards(parts)(grpo.ts:26):把多个 {weight, reward} 加权平均,用于「答案正确 + 格式合规」组合。

注:seed 里口语化地写「exactMatch/composeRewards」,本仓的实际导出符号是 exactMatchReward(grpo.ts:17)与 composeRewards(grpo.ts:26);引用以源码符号为准。

走读一个 RLVR reward 函数(对算术任务):

  1. 从模型自然语言输出里用正则提取最后一个数值,例如 /(-?\d+(?:\.\d+)?)\s*$/ 抓结尾数字,或抓 答案[::]\s*(-?\d+) 这类锚点。
  2. 把提取到的数值串 trim 后交给 exactMatchReward(extracted, gold) 得 0/1。
  3. 可选叠加格式分:formatReward(output, /<think>[\s\S]*<\/think>/)(grpo.ts:21)检查是否含思考块,再用 composeRewards([{weight:0.8, reward:correct}, {weight:0.2, reward:fmt}]) 合成。

10 样本手算示例(演示口径,真实准确率以脚本跑出为准):给 10 道形如「12+7=?」的题,模型输出经正则提取后与标准答案精确匹配,命中数 / 10 = 准确率。例如若提取后 8 题数值匹配、1 题格式没抓到数、1 题算错,则准确率 = 8/10 = 80%——具体数字以本日脚本实测为准,这里仅说明计算口径。

关键点:这套打分完全确定性,不调任何 LLM、不需 key——这正是 RLVR「V」的价值:reward 可手验、可单测、可对拍。

10 样本得分表骨架(演示口径,真实命中以脚本跑出为准;下表数值仅示意计算方式):

#promptgold提取值exactMatch备注
112+7=?19191命中
223−9=?14141命中
36×8=?48481命中
481÷9=?9(未抓到)0正则漏抓 → 须修提取
515+27=?42410模型算错

准确率 = Σ exactMatch / 10。第 4 行是关键陷阱:模型可能答对但正则没抓到数(假 0 分),所以「实测准确率」前必须先抽检提取覆盖率——否则你测的是正则质量不是模型质量。

RLVR 的「软可验证」边界:算术/代码有唯一 ground truth,exact match 干净;但很多任务(如 SAR 字段完整性)没有唯一答案却仍可规则判定(字段在不在、锚点解析不解析)——这类是 Day 105 用 rubric 代码检查做「软可验证 reward」的入口。RLVR 不等于只能 exact match,它等于「奖励由确定性程序给,而非学出来的 RM」。

reward 强度谱(从硬到软),决定该用哪种 grader:

  • 硬可验证:唯一数值/字符串答案 → exactMatchReward(math、单选、抽取)。
  • 半可验证:格式/结构可正则判 → formatReward + 规则检查(含字段、含锚点)。
  • 软可验证:质量需语义判但有 rubric → LLM-judge + 代码型子检查(SAR 叙述,Day 105/109)。
  • 不可验证:纯主观偏好 → 才退回 RM/DPO(开放式对齐)。 本仓 AML 作品横跨「半可验证 + 软可验证」两档,这正是 Day 105 要落地的奖励层。

3. 今日实战

  1. 复用 src/agent/train/grpo.tsexactMatchReward(grpo.ts:17)与 composeRewards(grpo.ts:26)。
  2. 写一个 arithmeticReward(output, gold):正则提取 output 末尾数值 → exactMatchReward(extracted, gold);可选叠加 formatRewardcomposeRewards
  3. 准备 10 道算术样本(prompt + gold + 一段模拟模型输出),逐条打分。
  4. 统计命中数 / 10 = 准确率%,并核对若干条提取是否正确(防正则漏抓导致假 0 分)。
  5. 写入 docs/aipa/day103-r1.md,附 reward_fn + 10 样本得分表 + 准确率%。

arithmeticReward 的最小实现伪码(确定性,可单测):

import { exactMatchReward, formatReward, composeRewards } from '@/agent/train/grpo'
function arithmeticReward(output: string, gold: string): number {
  const m = output.match(/(-?\d+(?:\.\d+)?)\s*$/)         // 抓结尾数值
  const correct = m ? exactMatchReward(m[1]!, gold) : 0   // 漏抓即 0(须监控覆盖率)
  const fmt = formatReward(output, /<think>[\s\S]*<\/think>/) // 含思考块加分
  return composeRewards([{ weight: 0.8, reward: correct }, { weight: 0.2, reward: fmt }])
}

权重 0.8/0.2 编码「答对压倒一切,格式是次要加分」——若把格式权重调高,模型会学会写思考块却算错(reward hacking 预演,Day 105 深入)。

4. 今日实测 / 产出

  • docs/aipa/day103-r1.md + reward_fn(基于 grpo.ts exactMatchReward + 10 样本得分准确率%
  • exactMatchReward / composeRewards 已建 + 单测绿
  • 10 样本准确率为本日实测产出(确定性,无需 key)
  • 状态如实:本日全程确定性,准确率%是真跑脚本得出的实测数(非估算),无 GPU/无 key 依赖。

5. 常见误区 / 陷阱

  • 对开放式生成任务硬套精确匹配:摘要、SAR 叙述这类没有唯一 ground truth 的任务,exact match 会把所有合理改写判 0 分,reward 噪声爆炸——需配 LLM-judge 或 rubric(Day 105 主题)。
  • 正则漏抓当模型答错:模型答对了但数值藏在句中、被正则漏掉,会被判 0 分,污染准确率。提取逻辑要先在样本上抽检覆盖率。
  • 把 R1-Zero 的「可读性差」当 bug:那是纯 RL 只优化答对、不优化可读的必然结果;R1 用 cold-start SFT 修它,不是 GRPO 本身的缺陷。
  • 以为 RLVR 能省掉所有标注:grader 是写出来的,但题目的 ground truth 答案仍需可靠来源;ground truth 错了,0/1 全错。
  • 把格式分权重设太高:给「含 <think> 块」过高权重,模型会学会刷格式不刷正确性——composeRewards 的权重就是 reward hacking 的开关,0.8/0.2 这类比例要刻意压低格式分。
  • 0/1 太稀疏导致组内无区分度:若一组 8 个 rollout 全答错(全 0),std=0、advantage 全≈0,这一步白训。可加部分分(如「思路对但末步算错」给 0.3)缓解,但部分分本身是新的 hacking 面。

6. 学习资源(每条带 YYYY-MM)

  • DeepSeek-R1《Incentivizing Reasoning Capability in LLMs via RL》(arXiv:2501.12948,2025-01)——RLVR + R1-Zero 涌现 + cold-start 两段式的权威源。
  • DeepSeekMath《GRPO》(arXiv:2402.03300,2024-02)——R1 用的优化器。
  • 《Let's Verify Step by Step》(arXiv:2305.20050,2023-05)——过程监督/可验证奖励思想的早期打底(历史坐标)。
  • 项目源码 src/agent/train/grpo.ts(本仓,grpo.ts:17/21/26)——exactMatchReward / formatReward / composeRewards 复用对象。

一句话总结今天:R1 = GRPO(优化器)× RLVR(确定性奖励),对可验证任务用程序 grade 取代训 RM;本仓 exactMatchReward/composeRewards 就是 RLVR「V」的最小可对拍实现。

SOTA检查 (2026-06 更新)

  • 当前主流:RLVR 仍是 2026 主流可验证奖励范式,arXiv:2501.12948 为权威源;「cold-start SFT → RLVR」两段式是开源推理模型标准配方。
  • 过时黑名单:对开放式生成任务硬套精确匹配(需 LLM-judge / rubric,否则 reward 噪声大);把 R1-Zero 当成最终形态(缺可读性修复)。
  • 下次复查点:RLVR 在非数学/代码的「软可验证」任务上的扩展(如 rubric-based verifiable reward)是否成新主线;与 Day 105 reward 设计、Day 111 RLVR 原理一并复查。

衔接

  • 昨天:Day 102 — GRPO 原论文精读:手算组相对 advantage 对拍 groupRelativeAdvantage
  • 今天:R1 的 RLVR——确定性 grader 替 RM,复用 exactMatchReward 对 10 道算术样本打分得准确率%
  • 明天:Day 104 — DPO vs GRPO 机理(Unsloth GRPO guide):偏好优化 vs 在线采样的权衡 + Unsloth LoRA+GRPO 流水线(待 GPU 冒烟)