GRPO-Zero 是一个从零实现 DeepSeek R1 所采用 GRPO(Group Relative Policy Optimization,组相对策略优化)算法的开源项目。项目强调极简依赖与低显存占用:几乎全部组件自行实现,只依赖 tokenizers 进行分词、依赖 pytorch 进行训练,不使用 transformers,也不依赖 vLLM。
在硬件需求方面,默认配置面向单张 A40 GPU(48GB 显存),训练数小时即可获得较好结果;同时也支持在 24GB 显存 GPU(例如 RTX 4090)上训练,方式是将优化器卸载到 CPU。由于整个训练过程中策略网络只更新数百次,这种卸载带来的额外开销较小。
算法层面,GRPO 的核心思路是:对每个问题随机采样多个答案,某个答案的优势值定义为其奖励的归一化结果,从而省去价值估计网络。项目实现的具体流程为:每个训练步随机采样 N 个问题;对每个问题采样 M 个答案;计算每个答案的奖励;计算每个问题奖励的均值与标准差;对答案中的每个 token,用(奖励减均值)除以标准差得到优势;使用 PPO 替代目标计算策略梯度(为简化,每次迭代只做一次策略更新,此时 PPO 目标的梯度等价于逐 token 的朴素策略梯度估计);最后更新策略网络并回到第一步。
项目在原版 GRPO 基础上支持来自 DAPO 项目的若干改进:
- Token 级策略梯度损失:在策略梯度损失中每个 token 等权。
- 移除 KL 散度:策略梯度损失中不使用 KL 散度,从而不再需要参考策略网络,降低 GPU 显存占用。
- 过长回合过滤:跳过超过上下文长度限制的未完成回合,以稳定训练。该功能默认关闭,以便在有限上下文长度下观察模型学习情况,可通过设置 skip_unfinished_episodes 为 true 启用。
训练任务方面,项目在 CountDown 任务上训练 Qwen2.5 模型。任务描述为:给定 3 或 4 个数字以及一个目标数字,模型需要生成一个仅使用常见四则运算(+、-、*、/)且结果等于目标数字的数学表达式。为完成该任务,项目使用 GRPO 训练模型在给出最终表达式前先生成思维链推理,并按要求格式输出。
奖励函数由两部分之和构成:
- 格式奖励:当模型正确遵循包含 thinking 与 answer 标签的指定格式时获得 0.1 奖励,否则为 0。
- 答案奖励:当最终答案恰好使用每个给定数字一次且正确求值为目标值时获得 1 奖励,否则为 0。
项目使用 Qwen2.5-3B-Instruct 模型进行训练。资料给出了运行训练的命令入口,但未展示命令具体内容。
致谢方面,项目建立在多个优秀项目基础上:DeepSeekMath 提出 GRPO 算法;DAPO 对原版 GRPO 算法进行增强;TinyZero 提供 GRPO 实现并创建 CountDown-Tasks-3to4 数据集;nano-aha-moment 提供清晰的 GRPO 实现与教程;Qwen2.5 提供项目使用的高质量预训练模型。