搜狐技术产品

DeepSeek-R1群相对策略优化(GRPO)算法深度解析

作者: 捏太阳

链接: https://zhuanlan.zhihu.com/p/27454498505

前言

用四篇文章按照层层深入的方式,依次介绍强化学习基础,基于人类反馈的强化学习(RLHF),近端策略优化 (PPO) ,群相对策略优化(GRPO)。

前面三篇文章分别介绍了强化学习的主要知识点、基于人类反馈的强化学习(RLHF)、近端策略优化 (PPO) 算法。

一、动机与背景

1.1 强化学习在大语言模型中的挑战

传统的强化学习方法,特别是PPO(近端策略优化)算法在应用到大语言模型(LLM)训练中时面临几个关键挑战:

  1. 计算资源消耗:PPO需要同时维护策略网络和价值网络。在大语言模型环境中,价值网络通常需要与策略网络相当的规模,这带来了巨大的内存和计算开销。
  2. 价值估计困难:在语言生成任务中,奖励通常只在序列末尾给出,而不是每个token都有即时反馈。这使得价值网络难以准确地预测中间状态的价值。
  3. 训练不稳定性:大型语言模型的价值函数训练常常不稳定,容易出现过拟合或欠拟合,影响整体学习效果。
  4. 优势估计精度问题:PPO依赖于准确的优势函数估计来指导策略更新,但在语言模型中,这种估计往往不够精确。

1.2 GRPO的创新思路

基于上述挑战,DeepSeek团队提出了群相对策略优化(Group Relative Policy Optimization, GRPO)算法,其核心创新思路是:

  1. 完全避开价值网络:GRPO不再需要训练价值网络,大幅减少计算和内存开销。
  2. 群体相对评估:针对同一问题,生成多个不同的回答,通过比较这些回答之间的相对质量来计算优势,而不是依赖绝对值预测。
  3. 与奖励模型本质匹配:RLHF中的奖励模型本身就是通过比较同一问题下不同回答的相对优劣进行训练的,GRPO的相对评估机制与此天然匹配。
  4. KL散度正则化改进:改进了KL散度控制方式,使训练更加稳定。

GRPO的提出旨在解决PPO在大语言模型训练中的效率和稳定性问题,特别适合于计算资源受限或需要高效训练的场景。

Image

PPO和GRPO的演示。GRPO放弃了价值模型,而是从群体分数中估计基线,显著减少了训练资源。

二、GRPO的数学原理

2.1 标准PPO回顾

标准PPO算法的目标函数为:

其中:

  •  是当前策略模型
  •  是旧策略模型
  •  是问题或提示词
  •  是模型生成的输出序列
  •  是在时间步  的优势函数
  •  是裁剪参数

在PPO中,优势函数  通常通过广义优势估计(GAE)计算,需要一个额外的价值网络:

其中  是TD误差。

2.2 GRPO的核心公式

GRPO的目标函数改进如下:

关键区别在于:

  1. 群体采样:针对每个问题  ,从旧策略中采样  个不同的输出(通常  )
  2. 优势计算方式:  不再依赖于价值网络,而是基于组内的相对奖励计算
  3. KL散度正则化:直接在目标函数中添加KL散度项,而不是在奖励中添加KL惩罚
  4. 无偏KL估计:使用更准确的KL散度估计: 

### 2.3 结果监督与过程监督
GRPO支持两种监督方式,分别使用不同的优势计算方法:

2.3.1 结果监督 (Outcome Supervision)

仅对最终输出进行评估:

  • 对每个输出  计算奖励 
  • 对组内奖励进行标准化: 
  • 所有token的优势值相同: 

2.3.2 过程监督 (Process Supervision)

对推理过程中的每个步骤进行评估:

  • 对每个输出  中的每个推理步骤计算奖励: 
  • 标准化这些奖励: 
  • 计算每个token的优势为后续步骤奖励之和: 

2.3.3 迭代GRPO

为解决训练过程中奖励模型可能滞后于策略模型的问题,GRPO还引入了迭代训练机制:

  1. 使用策略模型采样生成新数据
  2. 利用这些数据更新奖励模型,同时保留部分历史数据(10%)
  3. 将当前策略设为参考模型
  4. 使用更新后的奖励模型继续训练策略模型

三、GRPO算法的实际实现过程

下面详细介绍GRPO的完整实现流程:

3.1 初始化阶段

  • 策略模型  :通常初始化为经过监督微调(SFT)的大语言模型
  • 奖励模型  :训练一个能评估回答质量的模型
  • 参考模型  :通常是SFT模型的副本,用于KL散度计算
  • 超参数:裁剪参数  、KL系数  、组大小  等

注意:不需要价值网络,这是GRPO相对于PPO的重要简化。

3.2 主循环迭代过程

3.2a. 创建参考模型副本

  • 设置参考模型为当前策略模型: 
  • 这个参考模型在本次迭代中保持固定

3.2b. 收集群组数据

针对每个问题  ,执行以下步骤:

  1. 使用当前策略  生成  个不同的回答 
  2. 记录每个回答中每个token的生成概率 
  3. 对于结果监督,使用奖励模型对每个完整回答评分,得到 
  4. 对于过程监督,对每个回答的推理步骤评分,得到更详细的奖励信号

3.2c. 计算相对优势

根据选择的监督类型(结果监督或过程监督)计算优势:

结果监督情况:

  1. 计算组内奖励的均值和标准差
  2. 对每个奖励进行标准化: 
  3. 将标准化后的奖励作为该回答中所有token的优势值: 

过程监督情况:

  1. 标准化每个推理步骤的奖励
  2. 对于每个token,其优势值为该token之后所有步骤奖励的总和

3.2d. 更新策略模型

  1. 为每个小批量计算GRPO目标函数:
J_GRPO(θ) = 1/G * sum(min(ratio * advantage, clip(ratio, 1-ε, 1+ε) * advantage)) - β * KL

2. 计算梯度并使用优化器(通常是Adam)更新策略模型参数

3. 对于每个问题的群组数据,进行多次更新(通常1-5次)

3.2e. 奖励模型迭代更新(可选)

如果使用迭代GRPO:

  1. 使用当前策略模型生成新数据
  2. 结合少量历史数据(10%)更新奖励模型
  3. 将当前策略模型设为新的参考模型
  4. 使用更新后的奖励模型继续训练策略模型

3.3 伪代码实现

def train_GRPO(
    policy_model,             # 初始策略模型(通常是SFT模型)
    reward_model,             # 奖励模型
    train_data,               # 训练数据集
    group_size=64,            # 每个问题的回答数量
    epsilon=0.2,              # PPO裁剪参数
    kl_coef=0.04,             # KL散度系数
    iterations=10,            # 总迭代次数
    updates_per_iteration=1,  # 每次迭代的更新次数
    batch_size=16,            # 小批量大小
    supervision_type="outcome"# 监督类型:'outcome' 或 'process'
):
# 主循环
for iteration in range(iterations):
# 设置参考模型
        reference_model = copy.deepcopy(policy_model)

# 收集数据
        group_data = []

for question in train_data:
# 生成G个回答
            responses = []
for _ in range(group_size):
                response = policy_model.generate(question)
                responses.append(response)

# 计算奖励
            rewards = []
if supervision_type == "outcome":
# 对完整回答评分
for response in responses:
                    reward = reward_model.score(question, response)
                    rewards.append(reward)
else:  # process supervision
# 对推理步骤评分
for response in responses:
                    step_rewards = reward_model.score_steps(question, response)
                    rewards.append(step_rewards)

            group_data.append({
'question': question,
'responses': responses,
'rewards': rewards
            })

# 进行多次更新
for _ in range(updates_per_iteration):
# 随机选择一批数据
            batch_indices = random.sample(range(len(group_data)), batch_size)
            batch_data = [group_data[i] for i in batch_indices]

# 计算优势
for group in batch_data:
if supervision_type == "outcome":
# 结果监督
                    rewards = group['rewards']
                    mean_reward = sum(rewards) / len(rewards)
                    std_reward = calculate_std(rewards)

for i, reward in enumerate(rewards):
                        normalized_reward = (reward - mean_reward) / std_reward
# 为所有token设置相同的优势值
                        group['responses'][i]['advantages'] = [normalized_reward] * len(group['responses'][i]['tokens'])
else:
# 过程监督(处理步骤奖励)
                    process_advantages(group)

# 计算GRPO目标并更新策略
            compute_grpo_objective_and_update(policy_model, reference_model, batch_data, epsilon, kl_coef)

# 可选:更新奖励模型
# update_reward_model(reward_model, policy_model, train_data)
return policy_model

四、GRPO的优势与创新

4.1 计算效率提升

GRPO通过以下方式显著提高了计算效率:

  • 避免价值网络:不再需要与策略网络规模相当的价值网络,减少了约50%的参数量
  • 更少的前向/反向传递:由于不需要训练价值网络,计算量大幅降低
  • 内存使用减少:不需要存储价值网络的参数和优化器状态

这使得GRPO特别适合在资源受限环境下训练大型语言模型。

4.2 优势估计的改进

GRPO的群体相对评估机制具有几个优点:

  • 更准确的优势估计:通过同一问题下多个回答的比较,减少了噪声影响
  • 无需精确拟合值函数:避开了价值网络训练中的困难问题
  • 与奖励模型训练方式一致:奖励模型本身通常是通过比较训练的,GRPO的相对评估与之自然契合

4.3 灵活的监督机制

GRPO支持两种不同的监督机制,增加了算法的灵活性:

  • 结果监督:简单直接,适合评估整体输出质量
  • 过程监督:更细粒度,适合需要关注推理步骤质量的任务(如数学推理)

4.4 改进的KL正则化

GRPO对 KL 散度控制做了改进:

  • 直接在目标函数中添加 KL 项,而不是在奖励中,使训练更加稳定
  • 使用更准确的无偏 KL 估计器,提高了计算精度

4.5 迭代训练机制

迭代 GRPO 通过同步更新奖励模型和策略模型,解决了RLHF中的一个常见问题:随着策略模型改进,奖励模型可能变得不够准确。

五、GRPO的应用效果

根据DeepSeekMath论文中的实验结果:

  1. 数学推理任务:DeepSeekMath-RL 7B(使用GRPO训练)在GSM8K和MATH等基准测试上取得了88.2%和51.7%的准确率,超过了所有7B到70B的开源模型,甚至超过了部分闭源模型。
  2. 计算效率:相比PPO,GRPO显著减少了内存使用和训练时间,使得在资源受限环境下训练大型模型成为可能。
  3. 跨任务泛化:虽然DeepSeekMath-RL 7B仅在GSM8K和MATH的数据上训练,但它在MGSM-zh和CMATH等中文数学基准上也表现出色,展示了GRPO良好的泛化能力。
  4. 与工具结合:在允许使用工具的评估设置中,DeepSeekMath-RL 7B达到了接近60%的MATH准确率,表明GRPO训练的模型在与工具集成方面也具有优势。

在DeepSeek-R1模型的训练中,GRPO结合规则奖励进一步证明了其在实际应用中的有效性,挑战了传统认为过程奖励模型优于规则奖励的观点。

六、GRPO与PPO的详细比较

特性
PPO
GRPO
网络架构
需要策略网络和价值网络
仅需策略网络
优势计算
使用广义优势估计(GAE)
使用群体相对评估
计算复杂度
较高(需要训练两个网络)
较低(仅训练一个网络)
内存需求
高(两个网络的参数)
低(仅策略网络参数)
KL散度控制
通常在奖励中加入KL惩罚
直接在目标函数中添加KL项
样本效率
取决于价值网络的准确性
受益于群体相对评估
适用任务
广泛适用于各种RL任务
特别适合有比较型奖励的任务
实现复杂度
相对复杂(需要调整两个网络)
相对简单(只需关注策略网络)

七、GRPO的局限性与未来发展方向

可能的局限性

  1. 采样数量增加:GRPO需要为每个问题生成多个回答(通常是64个),这增加了采样的计算成本。
  2. 群体规模敏感性:算法性能可能受群体大小G的影响,需要在多样性和计算效率之间权衡。
  3. 奖励分布依赖:如果组内奖励分布过于集中,相对优势估计可能不够精确。
  4. 通用性有待验证:虽然在数学推理任务上表现出色,但在其他领域的效果还需更多验证。

可能的未来发展方向

  1. 动态群体大小:根据问题复杂度自适应调整群体大小,平衡计算效率和估计准确性。
  2. 混合优势估计:结合传统GAE和群体相对评估的优点,进一步提高估计准确性。
  3. 多目标优化:扩展GRPO以同时优化多个奖励信号,更好地满足复杂的人类偏好。
  4. 分布式实现:开发更高效的并行计算框架,进一步提高GRPO的计算效率。
  5. 与其他技术结合:探索GRPO与其他先进技术(如宪法AI、自监督RLHF等)的结合。

GRPO作为PPO的一个重要改进,为大语言模型的高效训练提供了新思路,特别是在计算资源有限的条件下。随着研究的深入,我们可以期待GRPO及其变体在更广泛的任务和更大规模的模型上的应用。

关于AINLP

AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括LLM、预训练模型、自动生成、文本摘要、智能问答、聊天机器人、机器翻译、知识图谱、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLP小助手微信(id:ainlp2),备注工作/研究方向+加群目的。