数据截至 (上游 commit 1416fa0cf215)
02 · GRPO 配方与可验证奖励函数
这一章讲什么: Open R1 的 GRPO 训练怎么跑起来(脚本、vLLM 拓扑、关键旋钮),然后逐个拆
rewards.py的奖励函数——这是全仓库算法密度最高的文件,也是「RLVR(可验证奖励强化学习)怎么做奖励工程」的最小完整教材。
1. 它要解决的小问题
GRPO 的想法一句话:一道题让模型采 N 个答案,按组内相对好坏给优势,省掉 value model。但它有个前提——你得能自动判断「哪个答案好」。
这个「判断器」就是奖励函数。数学题可以符号判等、代码题可以真跑测试,但每个领域都要解决自己的坑:
- 数学:答案写法千奇百怪(
0.5vs\frac{1}{2}),怎么判等价? - 格式:怎么逼模型守
<think>…</think><answer>…</answer>的规矩,又不被钻空子? - 长度:RL 训着训着推理越来越长,怎么罚?
- 代码:执行生成的代码,安全和并发怎么管?
rewards.py 就是这一串问题的答案集。
2. GRPO 脚本:薄壳里有什么
src/open_r1/grpo.py 的 main(grpo.py:35)与 sft.py 几乎同构,差别只在三处:
- 按名字取奖励函数:
get_reward_funcs(script_args)(grpo.py:88)把 YAML 里的名单翻译成函数列表; - prompt 拼装:
make_conversation(grpo.py:91-101)把数据集的一列包成 system+user 消息列表——GRPO 只需要 prompt,答案是采样出来的; - 清掉
messages列(grpo.py:105-107):带推理轨迹的数据集若直接拿来做 RL,旧messages列会干扰,必须删掉。
RL 循环本体(采样、组内优势、PPO clip)全部在 trl 的 GRPOTrainer 里,本仓库零实现。
2.1 关键旋钮
以数学演示配方 recipes/DeepSeek-R1-Distill-Qwen-1.5B/grpo/config_demo.yaml 为例:
| 参数 | 值 | 作用 |
|---|---|---|
num_generations | 16(:36) |