[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) \\rightJGRPO(θ)=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 相当甚至更好的效果。

相关推荐
Deepoch12 分钟前
Deepoc VLA开发板:采摘机器人的环境鲁棒作业与不确定性应对
人工智能·机器人·采摘机器人·deepoc
小宋加油啊29 分钟前
机械臂抓取物体 PVN3D算法调研学习
学习·算法·3d
lqqjuly30 分钟前
前沿算法深度解析(一)
算法
云栖梦泽在30 分钟前
AI安全专项:AI人脸识别的安全风险与防护
人工智能·安全
欧阳天羲37 分钟前
【开源资料】AI激光灭蚊机器人|YOLOv8数据集标注模板+完整训练配置文件一键拿走(适配ESP32-S3/树莓派双版本)
人工智能·机器人·开源
Dust-Chasing1 小时前
Claude Code源码剖析 - Claude Code 上下文压缩机制
人工智能·python·ai
8125035331 小时前
第 9 篇:子网掩码:如何划分“小区”
开发语言·php
甲维斯1 小时前
MiMo Code 初体验,免费,易上手,适合新手!
人工智能
小欣加油1 小时前
leetcode1926 迷宫中离入口最近的出口
数据结构·c++·算法·leetcode·职场和发展