用 group sampling 和 rule-based reward 理解组内相对 advantage。
uv run python -m llm_tutor.experiments.train_grpo_bandit --epochs 40 --group-size 4训练型脚本通常支持 --output-dir,可以把配置、指标、日志和模型产物保存到 runs/ 下,便于复盘。
本章学习契约
- 新增概念:group sampling、rule-based reward、组内均值/方差、relative advantage。
- 实验要验证:同一个 prompt 的多次采样可以互相比较,从而在不训练 value model 的情况下构造优势信号。
- 实验不验证:它不是生产级 GRPO,也没有 token-level rollout、旧策略 ratio 或完整 trust-region 训练。
- 跑完重点看:组内 reward、relative advantage、目标 action 概率和 KL 是否朝合理方向变化。
GRPO 可以理解成一种更适合可验证任务的 PPO 变体。它常用于数学、代码、Countdown 这类任务:答案可以用规则打分,不一定需要训练 reward model。
这一章继续使用 tiny bandit 实验,但会加入 GRPO 的关键动作:
同一个 prompt 采样多条 action -> 规则 reward -> 组内相对 advantage -> 更新 policy为什么要 Group Sampling
PPO 通常需要 value model 来估计 baseline。GRPO 的思路是:对同一个 prompt 采样一组回答,用这组回答的 reward 均值和方差构造相对优势。
给定同一个 prompt 的一组 reward:
[0, 1, 1, 0]组内相对 advantage 是:
advantage = (reward - group_mean) / group_std这样就不需要单独训练 value model。
如果一组 reward 全都一样,例如 [0, 0, 0, 0] 或 [1, 1, 1, 1],组内比较就会退化:每个样本都没有“比同组更好或更差”的信息。实现时通常需要加一个很小的 epsilon 避免除以 0,也需要让采样保持一定多样性,否则 relative advantage 很难提供有效训练信号。
可验证 Reward
本章使用三个可验证 prompt:
2+2?
capital of france?
first letter of abc?动作空间是:
4 / paris / a如果 action 等于目标答案,reward = 1;否则 reward = 0。
真实 GRPO 可以把这个规则替换成:
- 数学答案是否正确;
- 代码是否通过测试;
- JSON 格式是否可解析;
- 工具调用结果是否满足条件。
GRPO Loss
本章使用一个教学版 loss:
loss = -mean(log_prob(action) * group_relative_advantage)
+ kl_coef * KL(policy || reference)本章的 bandit 实验可以直接计算完整 categorical KL,所以输出里的 mean_kl 是非负的完整分布 KL。真实语言模型通常不会枚举整个生成分布,工程里会用 token 级近似来约束 policy 不要偏离 reference 太远。
和 PPO / DPO 的区别
PPO:
- 在线采样;
- reward 打分;
- 常用 value model / advantage;
- clipped objective。
DPO:
- 离线 chosen/rejected 偏好对;
- 不需要在线采样;
- 不需要显式 reward model。
GRPO:
- 在线采样多条;
- 使用规则 reward;
- 不用 value model;
- 用组内相对 reward 构造 advantage。
真实 GRPO 系统里往往仍会保留 PPO-style ratio/clipping 或类似 trust-region 约束。本章教学版主要保留 group sampling、rule reward 和 relative advantage 这条主线。
换句话说,本章更准确地说是“GRPO-inspired 教学实验”:它保留了同组采样、规则奖励、组内相对 advantage 和 KL 约束,但没有实现生产系统里常见的旧策略 ratio、token-level objective、复杂 rollout buffer 或分布式生成。
运行实验
uv run python -m llm_tutor.experiments.train_grpo_bandit --epochs 40 --group-size 4smoke 版:
uv run python -m llm_tutor.experiments.train_grpo_bandit --epochs 3 --group-size 4样例输出:
prompts=3 actions=3 group_size=4
epoch=001 mean_reward=... greedy_reward=... adv_mean=... adv_std=... mean_kl=...
policy
prompt='2+2?' action='4' target='4'
...这个实验仍然不是完整大模型 GRPO。它没有 token-level generation,也没有复杂 rollout buffer。它只负责把 group sampling、rule reward 和 relative advantage 讲清楚。
下一步
下一章会做 Capstone,把预训练、SFT、DPO/GRPO 这些概念整理成一条 Mini LLM Pipeline。
上一章:18. DPO:直接偏好优化