告别 Value Model:深度解析 GRPO 与 PPO 的核心差异
告别 Value Model:深度解析 GRPO 与 PPO 的核心差异
大家好,我是你们的老朋友,一名在代码世界摸爬滚打多年的技术博主。
最近,随着 DeepSeek-R1 等开源模型的爆火,GRPO(Group Relative Policy Optimization) 这个词频繁出现在大家的视野中。很多开发者朋友在后台留言问我:“GRPO 到底是什么?它和经典的 PPO 有什么区别?为什么现在大模型训练都在转向 GRPO?”
今天,我们就抛开晦涩的数学公式,用最通俗易懂的语言,结合图表和代码逻辑,彻底讲清楚 GRPO 和 PPO 的核心区别,特别是它们在信用分配、优势估计和方差控制这三个关键维度上的不同。
一句话概括核心差异
如果要用最简短的话来总结两者的区别,那就是:
PPO:依赖一个额外的“价值模型(Value Model)”来估计当前状态的好坏,通过
Reward - Value计算优势。GRPO:不再训练价值模型,而是让同一个 Prompt 生成一组回答,通过“组内相对奖励”来计算优势。
本质上,GRPO 是 PPO 在大语言模型(LLM)场景下的一种简化与改进。它砍掉了最难训练的 Value Model,用更简单的统计方法实现了更稳定的训练效果。
一、 PPO 的传统流程与痛点
要理解 GRPO 的好,先得看看 PPO 在 LLM 场景下的“难”。
1. PPO 是如何工作的?
在传统的 PPO(Proximal Policy Optimization)算法中,训练流程通常包含两个模型:
- 策略模型(Actor):负责生成文本。
- 价值模型(Critic/Value Model):负责评估当前生成的文本状态值 V ( s ) V(s) V(s)。
其核心计算公式为:
A d v a n t a g e = R e w a r d − V ( s ) Advantage = Reward - V(s) Advantage=Reward−V(s)
也就是说,PPO 认为一个动作(Token)好不好,要看它的实际奖励比“预期价值”高多少。
2. PPO 在 LLM 中的困境
虽然 PPO 在游戏控制等领域表现优异,但在面对动辄几十亿参数、序列极长的 LLM 时,它暴露出了严重的问题:
- Value Model 极难训练:文本的状态空间是离散且巨大的,Token 序列很长,导致 Value Model 很难准确预测每一步的价值。
- 训练成本高昂:你需要额外维护一个和 Actor 参数量相当的 Critic 模型,显存占用翻倍。
- 误差传播:如果 Value Model 估计不准(这在 LLM 中很常见),那么计算出的 Advantage 就会偏差巨大,直接导致策略更新方向错误,训练不稳定甚至崩溃。
图中红色部分展示了 PPO 中难以训练的 Value Model 模块。
二、 GRPO 的核心思想:化繁为简
GRPO(Group Relative Policy Optimization)由 DeepSeek 团队提出,它的核心思想非常直观:既然绝对价值很难估,那我们就比相对好坏。
1. 不需要 Value Model
GRPO 直接移除了 Critic/Value Model。这意味着:
- 显存节省:少训练一个大模型。
- 稳定性提升:消除了 Value 估计误差带来的噪声。
2. “分组”生成与比较
GRPO 的做法是:对于同一个 Prompt,让 Actor 模型一次性生成 G G G 个不同的回答(例如 4 个或 8 个)。
举个例子:
Prompt: “请解释糖尿病的成因。”
生成的回答组:
- 回答 A: 详细且准确… (Reward: 0.9)
- 回答 B: 较为准确… (Reward: 0.7)
- 回答 C: 有错误… (Reward: 0.2)
- 回答 D: 一般… (Reward: 0.5)
3. 如何计算 Advantage?
GRPO 不再使用 R − V R - V R−V,而是计算组内均值,然后看每个回答偏离均值多少。
-
计算组内平均奖励:
μ = 0.9 + 0.7 + 0.2 + 0.5 4 = 0.575 \mu = \frac{0.9 + 0.7 + 0.2 + 0.5}{4} = 0.575 μ=40.9+0.7+0.2+0.5=0.575 -
计算每个回答的优势(Advantage):
- A d v A = 0.9 − 0.575 = 0.325 Adv_A = 0.9 - 0.575 = 0.325 AdvA=0.9−0.575=0.325 (比平均好,强化!)
- A d v B = 0.7 − 0.575 = 0.125 Adv_B = 0.7 - 0.575 = 0.125 AdvB=0.7−0.575=0.125 (比平均好,轻微强化)
- A d v C = 0.2 − 0.575 = − 0.375 Adv_C = 0.2 - 0.575 = -0.375 AdvC=0.2−0.575=−0.375 (比平均差,抑制!)
- A d v D = 0.5 − 0.575 = − 0.075 Adv_D = 0.5 - 0.575 = -0.075 AdvD=0.5−0.575=−0.075 (略低于平均,轻微抑制)
本质逻辑:谁比这一组的平均水平好,就强化谁;谁比平均水平差,就惩罚谁。
图中绿色部分展示了 GRPO 如何通过统计组内数据来替代复杂的 Value Model。
三、 深度对比:信用分配、优势估计与方差控制
这是大家最关心的技术细节,我们从三个维度逐一拆解。
1. 信用分配(Credit Assignment)
信用分配指的是:如何判断某个具体的动作(Token)对最终结果贡献了多少?
-
PPO(绝对视角):
- 依赖 Value Model 来判断当前状态 s s s 的绝对价值。
- 问题:在长文本生成中,中间某个 Token 的好坏很难通过一个标量 V ( s ) V(s) V(s) 准确体现。Value 模型容易“瞎猜”,导致信用分配偏差。
-
GRPO(相对视角):
- 不依赖绝对价值,而是基于组内相对比较。
- 优势:在同一个 Prompt 下,不同回答之间的语义差异是可控的。如果回答 A 比回答 B 得分高,那么 A 中特有的那些 Token 就更值得被强化。这种“排序优化”的思路更符合 LLM 的训练直觉——我们往往很难定义什么是“绝对完美”的回答,但很容易判断“A 比 B 好”。
2. 优势估计(Advantage Estimation)
-
PPO:
- 通常使用 GAE (Generalized Advantage Estimation)。
- 公式涉及 λ \lambda λ 和 γ \gamma γ 等超参数,且严重依赖 Value Network 的输出。
- 属于绝对优势估计。
-
GRPO:
- 直接使用统计量:
A i = r i − mean ( g r o u p ) std ( g r o u p ) + ϵ A_i = \frac{r_i - \text{mean}(group)}{\text{std}(group) + \epsilon} Ai=std(group)+ϵri−mean(group) - 这里不仅减去了均值,还除以了标准差进行标准化。
- 属于相对优势估计。这种方法简单粗暴但极其有效,因为它自动适应了不同 Prompt 的难度分布。
- 直接使用统计量:
3. 方差控制(Variance Reduction)
在强化学习中,高方差会导致训练震荡,无法收敛。我们需要降低方差。
-
PPO 的做法:
- 引入 Value Baseline。因为 V ( s ) V(s) V(s) 是一个基准线,减去它可以减少 Reward 波动带来的影响。
- 风险:如果 Baseline ( V ( s ) V(s) V(s)) 本身估计不准,反而会增加噪声。
-
GRPO 的做法:
- 利用 组内均值归一化。
- 为什么有效? 因为同一组回答是针对同一个 Prompt 生成的,它们的 Reward 分布天然具有相似性(同分布)。减去组内均值,相当于去除了该 Prompt 本身的“难度基线”(有些问题本身就难,得分普遍低;有些简单,得分普遍高)。
- 除以标准差则进一步将优势映射到统一的尺度上,极大地稳定了梯度更新。
四、 为什么 GRPO 特别适合 LLM?
总结起来,GRPO 在大模型领域取代 PPO 成为主流,主要归功于以下三点:
-
工程极简,成本降低:
不需要训练和维护庞大的 Value Model,显存占用显著降低,训练链路更短,调试更容易。 -
符合“排序”直觉:
LLM 的本质往往是 Next Token Prediction,而在 RLHF 阶段,我们更关心的是偏好排序(Preference Ranking)。GRPO 的组内比较机制天然契合“优选法”,即在一堆候选中挑出最好的进行强化。 -
训练更稳定:
避免了 PPO 中常见的“Value Model 崩塌”问题。在 PPO 训练中,经常会出现 Actor 和 Critic 互相博弈导致发散的情况,而 GRPO 通过统计归一化,使得梯度方向更加稳健。
五、 代码逻辑示例
为了让大家更直观地理解 GRPO 的优势计算过程,这里提供一段简化的 Python 伪代码逻辑:
import numpy as np
def compute_grpo_advantages(rewards):
"""
计算 GRPO 的优势值
:param rewards: 同一组 prompt 生成的多个回答的奖励列表, e.g., [0.9, 0.7, 0.2, 0.5]
:return: 优势值列表
"""
rewards = np.array(rewards)
# 1. 计算组内均值
mean_reward = np.mean(rewards)
# 2. 计算组内标准差
std_reward = np.std(rewards)
# 3. 计算优势 (标准化处理)
# epsilon 防止除以零
advantages = (rewards - mean_reward) / (std_reward + 1e-8)
return advantages
# 示例数据
group_rewards = [0.9, 0.7, 0.2, 0.5]
advantages = compute_grpo_advantages(group_rewards)
print(f"Rewards: {group_rewards}")
print(f"Advantages: {advantages}")
# 输出类似:
# Rewards: [0.9, 0.7, 0.2, 0.5]
# Advantages: [ 1.18, 0.59, -1.48, -0.29]
# 正值表示优于平均,负值表示劣于平均
这段代码清晰地展示了 GRPO 如何通过简单的统计运算,完成了原本需要复杂神经网络才能完成的优势估计任务。
六、 总结
| 特性 | PPO | GRPO |
|---|---|---|
| 价值模型 (Critic) | 需要,且难以训练 | 不需要,直接移除 |
| 优势估计方式 | 绝对优势 ( R − V R - V R−V) | 相对优势 ( R − Mean g r o u p R - \text{Mean}_{group} R−Meangroup) |
| 方差控制手段 | Value Baseline | 组内均值与标准差归一化 |
| 信用分配逻辑 | 依赖状态价值估计 | 依赖组内相对排序 |
| LLM 训练稳定性 | 较低,易受 Critic 误差影响 | 高,统计特性更稳定 |
| 资源消耗 | 高 (需额外显存跑 Critic) | 低 (仅需 Actor + Reward Model) |
最后总结一下:
PPO 像是一个严谨但沉重的会计师,试图精确计算每一笔账目的绝对价值,但常常因为账目太复杂(LLM 状态空间大)而算错。
GRPO 则像是一个聪明的竞赛评委,它不关心绝对分数是多少,只关心在这一组选手中,谁比平均分高,谁就是优胜者。这种相对主义的智慧,恰恰解决了大模型训练中的诸多难题。
希望这篇文章能帮你理清 GRPO 和 PPO 的关系。如果你正在尝试微调大模型,不妨试试 GRPO,它可能会给你带来惊喜!
参考资料
- DeepSeek Technical Report: DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning
- PPO Original Paper: Proximal Policy Optimization Algorithms
- Hugging Face Transformers RLHF Docs: Reinforcement Learning from Human Feedback
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)