Raschka《从零搭推理模型》第3-6期:数学 Verifier + RLVR + GRPO 完整解读 · 干货攻略

  • 链接: https://x.com/rasbt/status/2099231450411290900
  • 分类: x-tips
  • 来源: X @rasbt
  • 作者: Jay
  • 更新: 2026-10-08
  • 仓库: rasbt/reasoning-from-scratch

这是什么

这是一条关于 Raschka《Build a Reasoning Model (From Scratch)》第 3–6 期系列的实战解读。

该系列第 3 期(2026-09-13 发布)聚焦如何从零实现一个数学 Verifier,用于: - 评估阶段:对 LLM 的数学答案打分(基于 MATH-500 数据集) - 训练阶段:作为 RLVR(Reinforcement Learning with Verifiable Rewards)的 reward 函数

第 6 期(2026-10-03 发布)则把这个 Verifier 复用为 RLVR 训练的奖励信号,驱动 GRPO(Group Relative Policy Optimization)算法更新模型权重。

核心逻辑链条:Verifier(第3期)→ reward function → RLVR 训练(第6期)→ reasoning model


为什么值得关注

谁在推——@rasbt

Sebastian Raschka 是前威斯康星大学统计学教授,著有《Build a Large Language Model (From Scratch)》。他在 X 有 52 万关注者,分享特点是代码级实现 + 真实 benchmark,每条结论都有实验支撑。

解决什么问题

推理模型的评估和训练长期缺乏可复用基础设施。 具体痛点:

  1. 评估难:传统 LLM 评估依赖 GPT-4 打分,成本高且不稳定。数学问题有唯一答案,却没有一个可靠的开源验证流程。
  2. RL 训练缺少 reward:LLM 的 RLHF 需要 reward model,而 reward model 本身难训练、难校准。数学领域的"可验证奖励"(verifiable rewards)绕过了这一步骤。
  3. 代码稀缺:市面上的 RLVR/GRPO 实现多是调用 TRL 库的黑盒脚本,Raschka 做了逐行 PyTorch 实现。

核心价值

Raschka 在 LinkedIn 帖子中写道:

"This verifier is a useful method for evaluating LLMs. It's one of the more useful evaluation methods in our repertoire. In addition, it also doubles as an important component for reinforcement learning, which has become a cornerstone of LLM training in 2025."

一条代码,两个用途——这正是这系列的核心亮点。


核验过程

官方来源

来源 读取内容 核验结论
rasbt/reasoning-from-scratch GitHub 主仓库 README 全书章节结构:ch03 评估模型、ch05 inference scaling、ch06 RLVR/GRPO ✅ 确认
rasbt/reasoning-from-scratch ch03/README.md ch03 三部分:主代码、math500-verifier-scripts、advanced-parser ✅ 确认
rasbt/reasoning-from-scratch ch03/02_math500-verifier-scripts/README.md(raw) 完整 benchmark 表、设备/耗时数据、accuracy 数据 ✅ 读取完整
rasbt/reasoning-from-scratch ch03/02_math500-verifier-scripts/evaluate_math500.py(raw) evaluate_math500_stream / load_model_and_tokenizer / load_math500_test 函数签名 ✅ 读取完整
rasbt/reasoning-from-scratch ch05/README.md ch05 主题:Inference-Time Scaling via Self-Refinement ✅ 确认(ch05 包含 log-probability scoring)
rasbt/reasoning-from-scratch ch06/02_rlvr_grpo_scripts_intro/README.md RLVR/GRPO 基准对比(10 种方法)、ch03 verifier 作为 reward 来源 ✅ 交叉确认
YouTube: Build A Reasoning Model From Scratch 3(2026-09-13) 视频时间戳确认 verifier 复用为 RLVR reward ✅ 确认
Raschka LinkedIn 帖子(Chapter 3 发布) "176 pages now available" + "doubles as RL component" ✅ 确认
sebastianraschka.com reasoning-from-scratch 页面 各章节主题 + RL overview bonus material ✅ 确认

交叉验证关键说法

说法 官方来源 验证来源 结论
Qwen3-0.6B Base MATH-500 = 15.6%(78/500) ch03 verifier-scripts README benchmark 表 ch06 README 同值 ✅ 确认
Qwen3-0.6B Reasoning MATH-500 = 48.2%(241/500) ch03 verifier-scripts README benchmark 表 ch06 README 同值 ✅ 确认
H100 batched(base, 500题) = 3.3 分钟 ch03 verifier-scripts README ch06 README 同值 ✅ 确认
H100 batched(reasoning, 500题) = 14.6 分钟 ch03 verifier-scripts README ch06 README 同值 ✅ 确认
Verifier 复用为 RLVR reward(第6期使用第3期代码) YouTube ch03 视频 7:20 + ch06 README ch03 引用 LinkedIn "doubles as RL component" ✅ 确认
ch05 包含 log-probability scoring ch05 README YouTube 视频描述 ✅ 确认

无法核验项

  • 第3期视频具体代码实现细节(未逐一阅读 ch03/01_main-chapter-code/ch03_main.ipynb):Verifier 内部解析逻辑(LaTeX 提取、答案归一化、数学等价验证)的具体实现代码未逐一核验
  • "176 pages" 的具体章节内容边界:Raschka LinkedIn 提及第3期发布时共 176 页,未独立验证总页数

上手步骤

1. 环境准备

git clone --depth 1 https://github.com/rasbt/reasoning-from-scratch.git
cd reasoning-from-scratch

uv venv
source .venv/bin/activate

# 安装核心依赖
pip install torch torchvision torchaudio
pip install transformers datasets accelerate math_verify matplotlib pandas

2. 核心:Verifier 的三层架构

Verifier 在 reasoning_from_scratch/ch03 模块中实现,分为三个层次:

第一层:答案提取(Answer Extraction)

从 LLM 输出中提取 \boxed{} 包裹的最终答案:

# ch03/01_main-chapter-code 中的实现思路
def extract_final_candidate(text: str, fallback=None) -> str | None:
    """从 \boxed{...} 中提取答案"""
    import re
    match = re.search(r'\\boxed\{([^}]+)\}', text)
    if match:
        return match.group(1).strip()
    return fallback

第二层:答案归一化(Answer Normalization)

将提取的答案标准化,处理 LaTeX 格式差异(如 frac{1}{2} vs 0.5):

# Section 3.5: Normalizing the extracted answer
def normalize_answer(answer: str) -> str:
    """去除空格、统一格式"""
    answer = answer.strip()
    answer = re.sub(r'\s+', '', answer)  # 去空格
    return answer

第三层:数学等价验证(Equivalence Checking)

验证归一化后的答案与 ground truth 是否等价:

# Section 3.6: Verifying mathematical equivalence
def grade_answer(extracted: str, ground_truth: str) -> bool:
    """判断提取答案是否与标准答案等价"""
    norm_extracted = normalize_answer(extracted)
    norm_truth = normalize_answer(ground_truth)
    # exact match after normalization
    if norm_extracted == norm_truth:
        return True
    # symbolic equivalence check (e.g., frac vs decimal)
    # ... 进阶等价判断逻辑
    return False

注意:Section 3.6 的"Verifying mathematical equivalence"不仅做字符串匹配,还支持符号等价判断(1/2 = 0.5 = 0.500)。这是与普通字符串匹配的本质区别。

3. 运行 MATH-500 评估脚本

# 顺序执行(更通用)
uv run evaluate_math500.py \
  --dataset_size 500 \
  --which_model base \
  --max_new_tokens 2048 \
  --device cuda

# 高速批处理(H100 GPU 推荐)
uv run evaluate_math500_batched.py \
  --dataset_size 500 \
  --batch_size 128 \
  --which_model base \
  --device cuda

benchmark 参考(官方数据):

设备 模式 Base 模型 Reasoning 模型
H100 GPU 批处理(batch=128) 3.3 分钟 14.6 分钟
DGX Spark 批处理(batch=128) 16.3 分钟 119.3 分钟
Mac Mini M4 GPU 顺序 37.5 分钟 未运行(过热)
Mac Mini M4 CPU 顺序 43.6 分钟 未运行

4. 用 Verifier 评估 checkpoint

# 评估 GRPO 训练后的 checkpoint(第6期产物)
uv run evaluate_math500.py \
  --dataset_size 500 \
  --which_model base \
  --checkpoint_path checkpoints/rlvr_grpo_original_no_kl/qwen3-0.6B-rlvr-grpo-step00050.pth \
  --device cuda

这里的 --checkpoint_path 指向第6期 GRPO 训练生成的 .pth 文件。加载方式与预训练模型不同(需要用 Qwen3Model + load_state_dict),具体见 evaluate_math500.py 源码中的 args.checkpoint_path 分支。

5. Verifier → RLVR Reward 的复用

第6期 GRPO 训练时,直接复用第3期的 grade_answer 函数作为 reward 来源:

# RLVR 训练循环中(第6期 ch06/02_rlvr_grpo_scripts_intro)
def reward_rlvr(answer_text: str, ground_truth: str) -> float:
    """verifiable reward: 答案正确=1.0,错误=0.0"""
    extracted = extract_final_candidate(answer_text, fallback=None)
    if not extracted:
        return 0.0
    return 1.0 if grade_answer(extracted, ground_truth) else 0.0

# GRPO advantage 计算(复用 reward)
rollout_rewards = [reward_rlvr(response, gt) for response, gt in zip(responses, gts)]
rewards = torch.tensor(rollout_rewards, device=device)
advantages = (rewards - rewards.mean()) / (rewards.std() + 1e-4)

这就是 RLVR(Reinforcement Learning with Verifiable Rewards) 的核心——不同于传统 RLHF 需要训练 reward model,RLVR 直接用可验证的二元奖励(正确/错误)驱动训练。


坑与适用边界

⚠️ Verifier 依赖 \boxed{} 格式

当前 Verifier 要求 LLM 输出必须包含 \boxed{answer} 结构。如果模型不输出这个格式,extractor 返回 None,reward 默认为 0。开放式问题或无法格式化的答案不适用此方法。

⚠️ 数学等价判断仍有局限

Section 3.6 的 symbolic equivalence 检查虽然比纯字符串匹配强,但对于复杂的数学表达式等价性(如 sin(π/6) vs 0.5)仍可能判断失误。Raschka 在 ch03/03_advanced-parser 提供了进阶 LaTeX 解析器作为补充。

⚠️ Base vs Reasoning 模型评估差异巨大

官方数据:Qwen3-0.6B Base 准确率 15.6%,Reasoning 模型 48.2%。这个差距说明: - 评测时必须明确模型类型(--which_model base vs reasoning) - 训练后评估也要用相同配置对比,避免 apples-to-apples 错误

⚠️ 批处理对 Mac Mini M4 GPU 不稳定

官方 README 明确记载 Mac Mini M4 GPU 在 batched 模式下报错(原因:部分 PyTorch 算子 MPS 尚未支持)。解决方案:加 --disable_efficient_mode 或用 CPU 顺序模式。

⚠️ 训练超过 50 步性能反而下降(vanilla GRPO 限制)

vanilla GRPO(no-KL)在 50 步后准确率从 47.4% 降至 44.0%(100步),200 步可能崩溃。第7章会介绍 DeepSeek-V3.2 mod、Olmo3 mod 等改进变体来延长稳定训练窗口。

✅ 最适合的场景

  • 想从代码层面理解 Verifier 而非调用外部 API
  • 在有 GPU 的机器上快速评估 Qwen3-0.6B 系列模型
  • 构建自己的 RLVR 训练 pipeline,需要一个可靠的二元 reward 函数
  • 准备学习第6章 GRPO 前的预备知识

一句话结论

Raschka 第3期的 MATH Verifier(提取 \boxed{} → 归一化 → 数学等价判断)是整个系列的核心基础设施——它既是模型评估的打分器,也是第6期 RLVR/GRPO 训练的 reward 函数;Qwen3-0.6B Base 在 H100 批处理下 3.3 分钟跑完 MATH-500(15.6% 准确率),Reasoning 模型达 48.2%,两者差距即是 RLVR 训练的价值所在。


核验来源(按优先级):

  1. rasbt/reasoning-from-scratch ch03/02_math500-verifier-scripts/README.md(raw)— benchmark 表、accuracy 数据 ✅
  2. rasbt/reasoning-from-scratch ch03/02_math500-verifier-scripts/evaluate_math500.py(raw)— 核心函数签名和调用方式 ✅
  3. rasbt/reasoning-from-scratch ch03/README.md — ch03 三部分结构确认 ✅
  4. rasbt/reasoning-from-scratch ch05/README.md — ch05 主题:Inference-Time Scaling via Self-Refinement(log-probability scoring 所在)✅
  5. rasbt/reasoning-from-scratch ch06/02_rlvr_grpo_scripts_intro/README.md — RLVR/GRPO 使用 ch03 verifier 作为 reward 来源 ✅
  6. rasbt/reasoning-from-scratch GitHub 主仓库 README — 全书章节结构、各章节主题 ✅
  7. YouTube: Build A Reasoning Model From Scratch 3(2026-09-13)— 视频时间戳 7:20 verifier→RLVR ✅
  8. Raschka LinkedIn 帖子(Chapter 3 发布)— "doubles as RL component" + 176 pages ✅
  9. sebastianraschka.com/reasoning-from-scratch — 在线章节导航 ✅

不确定处: - ch03/01_main-chapter-code/ch03_main.ipynb 中 Verifier 内部解析逻辑(LaTeX 提取、归一化细节)的具体实现代码未逐一核验,以官方仓库实际代码为准 - "176 pages" 的总页数来自 Raschka LinkedIn 帖子,未独立验证 - 批处理模式下 Mac Mini M4 GPU 的具体错误类型未逐一复现,以官方 README 记载为准