这一篇对应视频 06:“DeepSeekMath-v2, 自我验证, verifier & meta verifier,验证&微调迭代”(BV1AaSTBEEeS)。

我会把它按“论文精度”的方式拆开讲清楚:为什么 verifier 必须升级成 verifier + meta-verifier,以及如何把“外部验证能力”逐步迁移到 generator(自我验证 / self-verification)上,从而降低 RL4LLM 中最典型的 reward hacking。

系列导航:


0. 资料对齐(视频 + GitHub)

  • 视频 06:BV1AaSTBEEeS
  • 配套 notebook(视频简介里直接给了路径):
    • agentic_rl/reasoning/math/deepseekmath-v2.ipynb
    • 你本地路径:/Users/wangpeng/Downloads/modern_genai_bilibili-main/agentic_rl/reasoning/math/deepseekmath-v2.ipynb

本文会以该 notebook 的符号与公式为主,补上视频里强调的工程直觉:rollout case 分析 -> 发现 hacking -> 改 reward/rubric -> 再训练


1. 先把问题说清楚:reward hacking 不是“模型坏”,是 reward 不够 faithful

RL4LLM/Agentic RL 里最危险的失败模式不是“优化不收敛”,而是:

  • policy 学会了“骗判卷人”(reward model / verifier),reward 曲线很好看,但答案是错的。

从视频的表述来看,核心原则只有一句:

external reward signal 必须足够 faithful:正确要高分,错误要低分。

但现实里你很难一步到位写出完全 faithful 的 reward。最常见的工作流是:

  1. identify:看你的 rollouts(模型输出样例)里出现了哪些“投机取巧”的模式。
  2. solve:在 reward function / rubrics 里加约束项,专门打击这些 hack。
  3. 重新训练,继续循环。

DeepSeekMath-v2 的 verifier + meta-verifier 本质上就是这个循环的“系统化版本”:它试图让判卷人自己也更难被 hack。


2. Generator + Verifier:为什么这是一个稳健的 agentic workflow

把它抽象成最简单的两角色系统:

  • generator:产出解题过程/证明(proof)
  • verifier:检查 proof,指出问题并打分

这个“生成 -> 验证 -> 改写/精炼”的闭环,本质上就是 agentic loop,只不过工具不是检索/代码执行,而是“数学验证”。

重要直觉(视频强调):iterative verification & refinement 本身就是提升 generation 质量的过程


3. Initial Verifier:输入/输出长什么样,怎么训练

3.1 Verifier 的输入与输出

用 notebook 的符号:

  • 高层 rubrics:$I_v$(文本 prompt 驱动)
  • verifier policy:$\pi_\varphi(\cdot\mid X,Y,I_v)$
  • 输出包含两部分:
    • $V$:先总结识别到的问题(analysis)
    • $s’$:再给一个分数(论文里用三档离散分:$s’\in{0,0.5,1}$)

这里的关键不是“有打分”,而是 verifier 必须把“为什么这么判”说出来,这给后续的 refinement 提供了可操作的 feedback。

3.2 Verifier 的训练数据

数据集形式:

  • $\mathcal D_v={(X_i,Y_i,s_i)}$
  • $Y_i$:generator 产生的 proof
  • $s_i$:数学专家给的标注分数

3.3 为什么 verifier 也用 RL(而不是只做 SFT)

notebook 给的训练目标是一个 RL 结构(它把“格式正确”和“打分正确”拆成两个 reward):

$$\max_{\pi_\varphi}\ \mathbb{E}_{(X_i,Y_i,s_i)\sim\mathcal D_v,\ (V’_i,s’_i)\sim\pi_\varphi(\cdot\mid X_i,Y_i,I_v)}[R_{\text{format}}(V’_i)\cdot R_{\text{score}}(s’_i,s_i)]$$

直觉:

  • $R_{format}$:保证输出结构可解析(例如必须先列问题再给分数)
  • $R_{score}$:保证分数和专家标注一致

这点对“工程可控”非常重要:你的 verifier 如果输出格式漂了,整个 pipeline 会直接崩。


4. 为什么必须引入 Meta-Verifier:verifier 也会“判错”

视频里给了一个非常关键的 failure case:

  • verifier 指出了某些问题,但这些“问题本身是错的”。

也就是说,verifier 可能在“自信地胡说”。如果你把它当 reward model 去训 generator,generator 会被强行推向错误偏好。

因此 DeepSeekMath-v2 再加一层:

  • meta-verifier:专门判“verifier 的分析是否靠谱”。

5. Meta-Verifier:它判什么,怎么训练

5.1 Meta-Verifier 的输入与输出

符号对齐 notebook:

  • rubrics:$I_{mv}$(文本 prompt 驱动)
  • 数据集:$\mathcal D_{mv}={(X_i,Y_i,V_i,ms_i)}$
    • $ms_i$:数学专家对 verifier 分析 $V_i$ 的打分标注(meta score)
  • meta-verifier policy:$\pi_\eta(\cdot\mid X_i,Y_i,V_i,I_{mv})$
  • 输出包含:
    • 对 verifier 分析“本身的问题”的总结
    • 一个质量分(衡量 verifier 的分析是否准确、是否有充分依据)

5.2 训练目标

notebook 里写得很直接:meta-verifier 的 RL objective 结构和 verifier 训练相同,也是 format + score 的组合(只不过 score 的对齐对象变成了 $ms_i$)。


6. Final Verifier:把三件事乘在一起,才叫“更难被 hack 的 reward”

notebook 给了 final verifier 的组合方式:

$$R_v = R_{\text{format}}\cdot R_{\text{score}}\cdot R_{\text{meta}}$$

你可以把它理解成“三道闸门”:

  1. format 过关:输出结构必须可用
  2. score 过关:判分必须接近专家标注
  3. meta 过关:判卷人的分析必须也被“更强的判卷人”认可

这一步的核心作用是:把 reward hacking 的空间压缩。generator 想“骗分”,得同时骗过 verifier 和 meta-verifier,这会显著提高作弊成本。

6.1 乘法组合不是银弹:它会让 reward 变稀疏,训练更依赖 curriculum

把多个 reward “相乘”相当于设置了多个硬闸门:任何一个环节失败,整体 reward 就会被压到接近 0。它确实能显著减少“只骗过其中一项”的漏洞,但也带来一个很现实的工程副作用:

  1. 早期训练很容易全是 0 分:generator 还不够强时,format/score/meta 任意一项失败都会把信号切断,导致学习信号稀疏。
  2. 你会更依赖 curriculum:先把 format 训稳(让输出可解析),再逐步提高 score/meta 的要求;否则你可能会误以为“RL 不 work”,其实只是 reward 太硬。
  3. 错误归因更难:reward 变成 0 之后,你需要额外的日志把三项分别打出来,否则很难知道到底是格式挂了、判分挂了,还是 meta-verifier 在否决分析。

如果你要把这套思想迁移到 deep research agent,建议你一开始就把 reward 拆开记录(哪怕最终训练用乘法),让 case analysis 可定位。


7. Proof Generator 的训练:把 verifier 当成 reward model

generator policy:$\pi_\theta(\cdot\mid X)$,目标是最大化 verifier 给出的 reward:

$$\max_{\pi_\theta}\ \mathbb{E}_{X_i\sim\mathcal D_p,\ Y_i\sim\pi_\theta(\cdot\mid X_i)}[R_Y]$$

其中 $R_Y$ 来自 verifier(对齐 notebook:$R_Y=\pi_\phi(\cdot\mid X_i,Y_i,I_v)$,可理解为“final verifier 对 proof 的打分/奖励”)。

这里你应该马上联想到 RLHF:只是 RM 从“偏好模型”换成了“数学 verifier 系统”。


8. Toward Self-Verification:把验证能力迁移回 generator

视频里用“学生 vs 外部检查员”的直觉解释得很好:

  • generator(学生)往往“有能力改正错误”(能根据外部反馈 refine)
  • 但它缺乏自己发现自己错误的能力,尤其当它既当作者又当检查员时,很难像外部 verifier 一样严厉客观

所以论文做的是:让 generator 不只输出 proof $Y$,还输出一段自我分析/自我验证 $Z$。

notebook 给出的组合 reward(我把 align 改成单行,避免 Hexo 渲染问题):

$$R = R_{\text{format}}(Y,Z)\cdot(\alpha\cdot R_Y + \beta\cdot R_Z)$$

其中:

$$R_Z = R_{\text{score}}(s’,s)\cdot R_{\text{meta}}(Z)$$

解释:

  • $R_Y$:对 proof 本身的奖励(外部 verifier)
  • $R_Z$:对自我分析/自我验证的奖励(用 meta-verifier 判“分析质量”)
  • $\alpha,\beta$:权衡“答案质量”和“自我验证质量”

这一步非常关键:它让 generator 学到的不只是“把题做对”,还包括“把自己为什么做对/哪里可能错讲清楚”,从而逐步拥有 genuine verification capabilities。


9. 迭代验证 + 迭代微调:你应该从这篇论文学到的工程方法

我把视频里强调的做法总结成一个可复用模板(不只适用于数学):

  1. 先把 task 变成“可验证”或“伪可验证”
    • 数学题天然可验证;开放领域任务需要你设计 proxy verifier(引用一致性、可执行性、事实核查、结构约束)。
  2. 先别急着训 generator
    • 先把 verifier 做到“基本 faithful”,否则 RL 一定会把 generator 训歪。
  3. verifier 一定要有结构化输出
    • 否则你没法把它接入 refinement loop,更没法做 case analysis。
  4. 用 meta-verifier 约束 verifier
    • 判卷人也会被 hack;对判卷人做“二次判卷”是降风险的关键。
  5. 不断循环 case 分析
    • rollout -> 找 hack -> 改 rubrics/加惩罚 -> 继续训练。

9.1 我会如何做评测与 ablation(防“判卷系统”自嗨)

把 verifier/meta-verifier 引入训练闭环之后,一个常见风险是:系统内部的分数变得越来越高,但它只是学会了“更好地说服判卷人”,而不是更正确。为了避免这种自嗨,我会强制做几类评测与消融:

  1. 相关性与校准(calibration)
    • 在 holdout 数据上测 verifier 分数和真实 correctness 的相关性(AUC/accuracy/分桶统计)。
    • 重点看“高分但错”的比例:这是 reward hacking 的温床。
  2. 对抗样本
    • 专门构造“格式完美但逻辑错误”的 proof,测试 format reward 是否掩盖了 correctness。
    • 对 open-domain 任务,加 prompt injection / citation hallucination / tool-output 篡改,测试 judge 是否会被带偏。
  3. 组件消融
    • 去掉 meta-verifier、去掉 format gate、把乘法改加法、只训 score 不训 analysis,分别观察:
      • generator 的正确率、分布多样性、训练稳定性(是否更容易崩/更容易 hack)。
  4. 训练外泛化
    • 用完全不同分布的题目/任务做评测(例如题型变化、难度变化、模板变化),看 verifier 是否只是记住了训练分布的“判卷套路”。

把这些评测固定成周期性报告,你才能放心把 verifier 当成 reward 去做 RL,而不是把 pipeline 变成“自我说服机器”。

如果你最终要做 deep research agentic RL,这篇的价值不在“数学”,而在“评测闭环”:

  • 你需要 verifier(引用/事实/覆盖/结构/成本)
  • 你也需要 meta-verifier(判卷质量,防止 judge 被 prompt injection 或投机输出骗过)
  • 然后才能谈得上用 RL 去做稳定迭代