一文吃透:不依赖成熟 RL 库,如何实现 REINFORCE、REINFORCE-baseline 与 GRPO;数理推理模型的强化学习微调实践;训练/参考/采样模型的多卡调度。
引言
你是否也遇到过:模型“会思考”,但少数题正确,格式还常常不合规?我在 Qwen/Qwen2.5-Math-1.5B 上亲历这一痛点——zero-shot 在 GSM8K 只有约 1%。本文分享我从零实现的llm-from-scratch 仓库中的 alignment 模块,从零实现 REINFORCE、带基线的 REINFORCE 与 GRPO,把准确率稳定拉升到 63.4%,并把训练策略模型、参考模型与采样模型拆到不同 GPU 上高效协同。
读完你将掌握:奖励设计与计算、方差降低的工程化做法、GRPO 的分组偏好更新与裁剪、以及一套可复现的多卡调度与评估 pipeline。
阅读本文前,强烈建议先阅读我的前一篇介绍 SFT 的文章:从 1.56% 到 62.9%:SFT 推理微调优化实战
如果你对强化学习的知识还不熟悉的话,可以参考我之前的文章:强化学习从入门到放弃 —— 跟着 OpenAI 学强化学习
我的其他系列文章:
- 从 0 搭建 LLM 不再难!这个 PyTorch 项目帮你吃透大模型底层逻辑
- 突破性能瓶颈:深入解析 Flash Attention 内核优化技术
- 深入解析:使用 Triton 实现 Flash Attention2 - 让大模型训练飞起来
- 手撸大模型的分布式训练:深刻理解大模型训练的“起飞”原理
- 从0到1:揭秘LLM预训练前的海量数据清洗全流程
- 从 1.56% 到 62.9%:SFT 推理微调实战
问题与目标
- 问题:zero-shot 推理准确率极低(~1%),且格式不稳定,难以可靠评估与训练。
- 目标:设计严格且高召回的奖励函数,配合从零实现的策略梯度与 GRPO,逐步把 Qwen2.5-Math-1.5B 在 GSM8K 的 zero-shot 准确率提升到 63.4%。
我只在必要处简述 SFT,上文已分析过;本文将把重点落在强化学习微调(RLFT)的训练循环与实现细节。
奖励与格式:答案正确 + 格式遵循的双指标
本仓库采用 R1 风格的格式约束与数学习题的严格判定。核心在 alignment/drgrpo_grader.py 的 r1_zero_reward_fn:
- 格式要求:必须出现
</think> <answer>与</answer>。不合格式直接奖励为 0。 - 答案正确:借助多种规范化与符号等价检查(含 LaTeX 解析、Sympy 简化、数值近似),保障较高召回率。
- 组合奖励:
format_reward与answer_reward都满足则总奖励reward=1,否则为 0。评估脚本会统计三者的平均值。
代码摘录(路径与作用标注):
- 文件:
llm-from-scratch/alignment/drgrpo_grader.py - 作用:计算 GSM8K 的格式与正确性奖励
- 完整代码参考:llm-from-scratch
def r1_zero_reward_fn(response, ground_truth, fast=True):
# We are strict about format to evaluate our models.
if "</think> <answer>" in response and "</answer>" in response:
model_answer = response.split("<answer>")[-1].replace("</answer>", "")
if "\\boxed" in model_answer:
model_answer = extract_answer(model_answer)
if model_answer is None:
return {
"format_reward": 1.0, "answer_reward": 0.0, "reward": 0.0}
# 严格的数学等价判断(字符串规范化、Sympy、可选 math_verify)
is_correct = grade(model_answer, str(ground_truth), fast)
if is_correct:
return {
"format_reward": 1.0, "answer_reward": 1.0

最低0.47元/天 解锁文章
178

被折叠的 条评论
为什么被折叠?



