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(持续) |
| 奖励噪声 | 零(精确匹配) | 有(拟合误差) |
| 可被 hack | grader 漏洞可被钻 | 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 函数(对算术任务):
- 从模型自然语言输出里用正则提取最后一个数值,例如
/(-?\d+(?:\.\d+)?)\s*$/抓结尾数字,或抓答案[::]\s*(-?\d+)这类锚点。 - 把提取到的数值串 trim 后交给
exactMatchReward(extracted, gold)得 0/1。 - 可选叠加格式分:
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 样本得分表骨架(演示口径,真实命中以脚本跑出为准;下表数值仅示意计算方式):
| # | prompt | gold | 提取值 | exactMatch | 备注 |
|---|---|---|---|---|---|
| 1 | 12+7=? | 19 | 19 | 1 | 命中 |
| 2 | 23−9=? | 14 | 14 | 1 | 命中 |
| 3 | 6×8=? | 48 | 48 | 1 | 命中 |
| 4 | 81÷9=? | 9 | (未抓到) | 0 | 正则漏抓 → 须修提取 |
| 5 | 15+27=? | 42 | 41 | 0 | 模型算错 |
| … | … | … | … | … | … |
准确率 = Σ 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. 今日实战
- 复用
src/agent/train/grpo.ts的exactMatchReward(grpo.ts:17)与composeRewards(grpo.ts:26)。 - 写一个
arithmeticReward(output, gold):正则提取 output 末尾数值 →exactMatchReward(extracted, gold);可选叠加formatReward再composeRewards。 - 准备 10 道算术样本(prompt + gold + 一段模拟模型输出),逐条打分。
- 统计命中数 / 10 = 准确率%,并核对若干条提取是否正确(防正则漏抓导致假 0 分)。
- 写入
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.tsexactMatchReward) + 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 冒烟)