[AI]DeepSeek-R1的GRPO算法

GRPO (Group Relative Policy Optimization)是 DeepSeek 在训练 DeepSeek-R1 推理模型时提出并推广的策略优化算法。它本质上是对 PPO 的极简手术砍掉 Critic 网络 ,用组内采样的相对奖励来估计优势函数,从而将 RLHF 的显存占用和实现复杂度降低一个数量级。


一、背景:PPO 的"四模型之痛"

在标准 RLHF-PPO 中,你需要同时维护 4 个模型

  1. Actor(策略网络,正在训练)
  2. Critic(价值网络,估计状态价值)
  3. Reward Model(奖励模型,打分)
  4. Reference Model(参考模型,防止偏离)

痛点

  • 显存爆炸:4 个大模型同时驻留 GPU,70B 参数模型训练需要数百 GB 显存
  • Critic 训练困难:语言生成的状态空间几乎无限,Critic 要准确估计"每个 token 位置的未来累积奖励"极其困难,训练不稳定
  • 实现复杂:Actor-Critic 架构、GAE 计算、重要性采样修正,工程调试成本高

GRPO 的洞见:对于生成任务,与其费劲训练一个 Critic 去预测未来价值,不如对同一个问题采样多个答案,用它们之间的相对好坏来定义"优势"


二、核心原理:组内相对奖励

GRPO 的核心就三步:

1. 组采样(Group Sampling)

对于同一个问题(prompt)qqq,从旧策略 πθold\pi_{\theta_{old}}πθold 采样 GGG 个不同的输出
{o1,o2,...,oG}∼πθold(⋅∣q)\{o_1, o_2, \dots, o_G\} \sim \pi_{\theta_{old}}(\cdot|q){o1,o2,...,oG}∼πθold(⋅∣q)

GGG 通常取 4~16

2. 奖励打分(Reward)

用奖励模型(或规则)给每个输出打分:
R={r1,r2,...,rG}R = \{r_1, r_2, \dots, r_G\}R={r1,r2,...,rG}

3. 相对优势计算(Relative Advantage)

这是 GRPO 的灵魂。不依赖 Critic,直接用组内统计量定义优势:

A^i=ri−mean(R)std(R)=ri−1G∑j=1Grj1G∑j=1G(rj−mean(R))2\hat{A}i = \frac{r_i - \text{mean}(R)}{\text{std}(R)} = \frac{r_i - \frac{1}{G}\sum{j=1}^G r_j}{\sqrt{\frac{1}{G}\sum_{j=1}^G (r_j - \text{mean}(R))^2}}A^i=std(R)ri−mean(R)=G1∑j=1G(rj−mean(R))2 ri−G1∑j=1Grj

直觉

  • 比组内平均水平的输出 → 优势为正 → 策略增加其概率
  • 比组内平均水平的输出 → 优势为负 → 策略降低其概率
  • 好坏程度由组内标准差归一化,自动适应不同问题的奖励尺度

三、数学公式:完整目标函数

GRPO 的策略更新目标与 PPO 几乎一致,只是把 A^i\hat{A}_iA^i 的来源从 Critic 换成了组内相对奖励:

JGRPO(θ)=Eq∼P(Q),{oi}i=1G∼πθold(⋅∣q)[1G∑i=1G(min⁡(ri(θ)A^i,  clip(ri(θ),1−ϵ,1+ϵ)A^i)⏟PPO-Clip 策略损失−β⋅DKL(πθ(⋅∣q)∥πref(⋅∣q))⏟KL 惩罚)]J_{GRPO}(\theta) = \mathbb{E}{q \sim P(Q), \{o_i\}{i=1}^G \sim \pi_{\theta_{old}}(\cdot|q)} \left[ \frac{1}{G} \sum_{i=1}^G \left( \underbrace{\min\left( r_i(\theta)\hat{A}i, \; \text{clip}(r_i(\theta), 1-\epsilon, 1+\epsilon)\hat{A}i \right)}{\text{PPO-Clip 策略损失}} - \underbrace{\beta \cdot D{KL}(\pi_\theta(\cdot|q) \| \pi_{ref}(\cdot|q))}_{\text{KL 惩罚}} \right) \right]JGRPO(θ)=Eq∼P(Q),{oi}i=1G∼πθold(⋅∣q) G1i=1∑G PPO-Clip 策略损失 min(ri(θ)A^i,clip(ri(θ),1−ϵ,1+ϵ)A^i)−KL 惩罚 β⋅DKL(πθ(⋅∣q)∥πref(⋅∣q))

其中:

  • ri(θ)=πθ(oi∣q)πθold(oi∣q)r_i(\theta) = \frac{\pi_\theta(o_i|q)}{\pi_{\theta_{old}}(o_i|q)}ri(θ)=πθold(oi∣q)πθ(oi∣q):新旧策略的概率比
  • ϵ\epsilonϵ:Clip 阈值(通常 0.2)
  • β\betaβ:KL 惩罚系数(防止 Actor 偏离参考模型太远)
  • πref\pi_{ref}πref:冻结的参考模型(通常是 SFT 后的模型)

四、算法流程(伪代码)

python 复制代码
# 初始化:Actor (可训练), Reference (冻结), Reward Model (冻结)
# 无需 Critic!

for iteration in range(num_iterations):
    # 1. 收集数据
    for each question q in batch:
        # 从旧策略采样 G 个答案
        outputs = [actor.generate(q) for _ in range(G)]
        rewards = [reward_model(q, o) for o in outputs]
        
        # 计算组内相对优势
        mean_r = mean(rewards)
        std_r = std(rewards) + 1e-8  # 防止除零
        advantages = [(r - mean_r) / std_r for r in rewards]
        
        store(q, outputs, old_probs, rewards, advantages)
    
    # 2. 策略更新(多 epoch,类似 PPO)
    for epoch in range(K_epochs):
        for each stored group (q, outputs, old_probs, advantages):
            new_probs = actor.get_probs(q, outputs)
            ratios = new_probs / old_probs
            
            # PPO-Clip
            surr1 = ratios * advantages
            surr2 = clip(ratios, 1-eps, 1+eps) * advantages
            policy_loss = -min(surr1, surr2).mean()
            
            # KL 惩罚(与参考模型)
            ref_probs = reference.get_probs(q, outputs)
            kl_loss = kl_divergence(new_probs, ref_probs).mean()
            
            total_loss = policy_loss + beta * kl_loss
            total_loss.backward()
            optimizer.step()

五、GRPO vs PPO 核心对比

维度 PPO GRPO
模型数量 4 个(Actor + Critic + Reward + Reference) 3 个 (Actor + Reward + Reference),无 Critic
显存占用 高(Critic 与 Actor 同规模) 低 25-30%
优势估计 Critic + GAE 组内相对奖励
实现复杂度 高(需训练 Critic、调 GAE 超参) (省掉整个 Critic 训练流水线)
适用任务 通用(对话、写作等开放式任务) 确定性奖励任务(数学、代码、逻辑推理)
样本效率 依赖 Critic 质量 依赖组内采样多样性
稳定性 Critic 崩溃则整体崩溃 无 Critic 崩溃风险,但 std=0 时无法更新

六、在 DeepSeek-R1 中的实战

DeepSeek-R1 使用 GRPO 进行强化学习训练,其奖励设计极具针对性:

1. 奖励函数(完全规则化,无需神经 Reward Model)

奖励类型 说明 示例
准确性奖励 答案是否正确 数学题最终答案匹配 = +1,否则 0
格式奖励 是否按要求格式输出思考过程 包含 <think>...</think><answer>...</answer> 标签 = +0.5
语言一致性 防止中英文混用 全中文或全英文 = +0.1

关键 :R1 的奖励是确定性的、可编程的,不需要像 ChatGPT 那样训练一个复杂的神经 Reward Model 来判断"这段话好不好"。

2. 为什么 GRPO 特别适合 R1?

  • 数学/代码任务 :答案对错是二元的 (0 或 1)。如果用 Critic 预测价值,它必须学会"这个推导步骤值 0.3 分,那个步骤值 0.7 分",极其困难。而 GRPO 直接看组内谁答对了谁没答对,简单有效。
  • 长思维链(CoT) :R1 生成长达数千 token 的推理过程。Critic 要评估"第 500 个 token 之后的未来回报"几乎不可能。GRPO 只看最终结果,规避了过程评估难题。

七、优势与局限性

优势

  1. 显存友好 :去掉 Critic 后,同等规模模型训练显存降低 20-30%,使 70B 模型的 RL 训练从"集群专属"变为"单节点可行"
  2. 实现极简 :代码量比 PPO 减少约 40%,调试维度大幅减少
  3. 避免 Critic 崩溃:语言生成的价值估计本身就不稳定,GRPO 直接绕过这个难题
  4. 奖励尺度自适应:组内归一化自动处理不同问题的难度差异(简单题全对时 std=0 除外)

局限性

  1. 组内多样性依赖 :如果 GGG 个输出高度相似(如模型已收敛),std 趋近于 0,优势全为 0,训练停滞
  2. 开放式任务表现一般:对于创意写作、开放式对话等奖励稀疏/主观的任务,组内相对奖励不如 PPO 稳定
  3. 推理成本 :每次更新需要采样 GGG 个完整序列,前向推理量是 PPO 的 GGG 倍(但省掉了 Critic 的前向+反向)
  4. std=0 陷阱:如果组内所有答案都正确(或都错误),标准差为 0,此时 advantage 无定义,需平滑处理(如加 epsilon 或跳过更新)

八、一句话总结

GRPO 的本质是"用统计学替代预测学":既然训练一个 Critic 去预测语言生成的未来价值那么难,不如对同一个问题采样一组答案,用它们之间的相对排名来告诉模型"这次你答得比同班同学好还是差"。这种"无 Critic 的 PPO"在数学、代码等确定性奖励任务上,以更低的显存和更简单的实现,达到了与 PPO 相当甚至更好的效果。

相关推荐
折哥的程序人生 · 物流技术专研1 小时前
WMS智能调度实战:构建机器学习特征表的完整指南
人工智能·机器学习
拓朗工控1 小时前
工控机在高精度视觉检测中的实际应用
人工智能·计算机视觉·视觉检测
后端小肥肠1 小时前
我把AI童装带货做成了一个Skill,一句话就能出视频
人工智能·aigc·agent
D_C_tyu1 小时前
JavaScript | 数独游戏核心算法实现
javascript·算法·游戏
qiqsevenqiqiqiqi1 小时前
MT2048三连 暴力→数学推导→O (n) 优化
数据结构·c++·算法
AI技术增长1 小时前
Pytorch图像去噪实战(二):用UNet解决DnCNN细节丢失问题(结构解析+完整代码+踩坑总结)
人工智能·pytorch·python
RD_daoyi1 小时前
GEO时代:AI 重构下,SEO的本质与破局之路
人工智能·重构
GJGCY1 小时前
金融AI Agent平台技术路线与落地能力对比:7家主流智能体优缺点分析
人工智能·ai·金融·数字化·智能体
码之气三段.1 小时前
十五届山东ccpc省赛补题(update)
数据结构·c++·算法