简介:本文面向算法工程师与大模型应用开发者,系统讲解GRPO与PPO两类策略优化算法的本质差异。教程从目标函数、优势估计、资源开销三个维度展开对比,给出选型判断依据,并提供通用伪代码示例、效果验证方法与常见问题排查思路,帮助读者结合任务特性与算力条件选择合适的算法方案。
本教程旨在帮助读者完成一项明确任务:在为大语言模型(LLM)设计强化学习训练流程时,能够准确判断应该选择GRPO(Group Relative Policy Optimization,组相对策略优化)还是PPO(Proximal Policy Optimization,近端策略优化),并理解两者的设计哲学差异、数学本质差异以及工程落地差异。
读完本文,你将能够:
本教程适合算法工程师、大模型训练工程师、技术负责人阅读,要求读者具备策略梯度方法的基础知识,了解优势函数、重要性采样等通用概念。
| 场景 | 推荐算法 | 判断依据 |
|---|---|---|
| 有成熟奖励模型、任务奖励可逐token评估 | PPO 或 GRPO 均可 | 两者都能工作,GRPO工程更简单 |
| 奖励为序列级标量(如答案对错、整体打分) | GRPO | 组内相对优势天然适配序列级奖励 |
| 缺乏可靠价值网络、价值估计误差大 | GRPO | GRPO不需要critic |
| 显存/算力预算紧张,需要降低训练成本 | GRPO | 省去与策略等大的价值网络 |
| 训练早期策略与参考策略差异较大、需要强约束 | PPO | PPO的clip机制配合价值基线更稳健 |
| 需要细粒度、逐步的信用分配 | PPO | 价值网络可提供逐状态基线 |
需要强调:两者并非互斥的“新旧替代”关系,而是针对不同约束条件的两种工程取舍。选型的本质是回答一个问题——优势估计的方差与偏差,你愿意用哪种代价来平衡?
在动手实现前,请确认具备以下条件:
建议先在中小规模模型(如参数量较小的模型)上跑通流程,再迁移到大规模训练。
两类算法都源自策略梯度框架。朴素策略梯度的估计形式为对采样动作的回报加权,其方差随轨迹长度增长而急剧上升。降低方差的主流手段是引入基线(baseline),用优势函数替代原始回报:
A(s, a) = Q(s, a) - V(s)
其中 V(s) 是状态价值。PPO与GRPO的分歧,恰恰出现在“如何获得这个基线”上。
PPO维护一个与策略网络规模相当的价值网络(critic),通过回归目标学习 V(s),再用广义优势估计(GAE)把多步回报与价值基线结合,得到逐token的优势估计。其目标函数为裁剪形式:
L_CLIP(θ) = E[ min( r_t(θ) * A_t, clip(r_t(θ), 1-ε, 1+ε) * A_t ) ]r_t(θ) = π_θ(a_t|s_t) / π_old(a_t|s_t)
裁剪的含义是:当优势为正(好动作)时,策略提升该动作概率的幅度被限制在比率不超过 1+ε;当优势为负(坏动作)时,降低概率的幅度被限制在比率不低于 1-ε。这样单次更新不会让策略偏离旧策略过远,从而兼顾样本复用与训练稳定性。
PPO的代价:价值网络带来额外显存与计算开销,且价值估计本身存在偏差;当奖励稀疏或序列级奖励难以逐token分解时,价值网络的学习信号会很弱,GAE的优势估计质量下降。
GRPO的核心洞察是:对于同一个输入(prompt),采样一组(group)多个输出,用组内奖励的统计量作为基线,从而完全绕开价值网络。对第 i 个输出,其优势估计可写为:
A_i = (r_i - mean(r_1..r_G)) / std(r_1..r_G)
即用组内均值做基线、组内标准差做归一化。这样得到的优势是“相对组内平均水平好多少”,天然适配序列级奖励,且不需要critic。其目标函数沿用PPO的裁剪形式,并通常叠加对参考策略的KL正则:
L_GRPO(θ) = E[ min( r_t(θ) * A_i, clip(r_t(θ), 1-ε, 1+ε) * A_i ) ] - β * KL(π_θ || π_ref)
GRPO的代价:每个prompt需要采样多个输出,采样成本随组大小线性增长;组内比较隐含“同组样本可比”的假设,若组内奖励方差极小(例如全部正确或全部错误),归一化会放大噪声,优势信号退化。
| 维度 | PPO | GRPO |
|---|---|---|
| 优势估计来源 | 价值网络 + GAE | 组内奖励均值与标准差 |
| 是否需要critic | 需要 | 不需要 |
| 显存占用 | 策略+价值+参考,约3份模型 | 策略+参考,约2份模型 |
| 奖励形态适配 | 逐token稠密奖励更佳 | 序列级标量奖励天然适配 |
| 采样效率 | 单prompt采样较少 | 单prompt需采样一组 |
| 主要风险 | 价值估计偏差、critic不收敛 | 组内奖励同质化导致信号退化 |
一句话概括:PPO用“学出来的基线”换稳定性,GRPO用“多采样换基线”换工程简洁性。
先对任务奖励做分类:是逐token可评估的稠密奖励,还是只能对完整输出打分的序列级奖励。这一步决定后续算法选择。若奖励必须等整段输出生成完毕才能计算(如数学题答案对错、代码通过测试),GRPO的组内基线更自然;若可在生成过程中逐步给分,PPO的GAE更具优势。
加载SFT模型作为初始策略,复制一份冻结作为参考策略用于KL约束。注意参考策略不参与梯度更新,仅用于计算KL惩罚,防止策略过度偏离基座能力。
按算法选择采样方式:PPO对每个prompt采样若干条轨迹并记录逐token的log概率;GRPO对每个prompt采样G条输出(G常取4至16,需结合显存与奖励方差调整),计算每条输出的标量奖励。
注意:GRPO的组大小不是越大越好。组太大增加采样成本,组太小则均值方差估计不稳。建议先用小规模实验观察组内奖励分布,再确定G。
PPO侧:用价值网络前向得到逐状态价值,结合轨迹回报做GAE,得到逐token优势。GRPO侧:对组内奖励做标准化,得到每条输出的标量优势,再广播到该输出的所有token。
通用伪代码示意:
# GRPO 优势计算示意rewards = [reward_fn(prompt, out) for out in group_outputs] # 长度 Gmean_r = mean(rewards)std_r = std(rewards) + epsadvantages = [(r - mean_r) / std_r for r in rewards]# 将标量优势广播到每条输出的每个tokentoken_advantages = [[adv] * len(out_tokens) for adv, out_tokens in zip(advantages, group_outputs)]
按裁剪目标计算策略损失,叠加KL正则项。PPO需同时计算价值网络回归损失(通常用裁剪的价值损失)。更新时注意学习率、裁剪系数ε(常用0.1至0.2)、KL系数β的取值,建议先用保守超参跑通再逐步放宽。
按“采样—计算优势—更新—评估”循环迭代,定期保存检查点与采样日志。建议每轮记录平均奖励、KL散度、裁剪触发比例、梯度范数等指标。
训练是否有效,可从以下维度验证:
本教程围绕“GRPO与PPO如何选型”这一目标,梳理了两者的共同起点与本质分歧:PPO以价值网络提供基线并配合裁剪约束,GRPO以组内相对奖励替代价值网络。选型的关键在于奖励形态、算力预算与对价值估计的信任程度。落地时按“奖励分类—搭建策略与参考策略—采样与奖励计算—优势估计—裁剪更新—验证排查”的顺序推进,并通过奖励曲线、KL散度、裁剪比例与组内方差等指标持续验证。后续可进一步关注两类算法在长序列生成、多奖励融合与分布式训练下的工程优化方向。