1. 从PPO到GRPO:为什么我们需要一个新的强化学习算法?

如果你玩过强化学习,或者听说过ChatGPT、Claude这些大模型背后的训练技术,那你对PPO(Proximal Policy Optimization)这个名字一定不陌生。它就像是强化学习领域的“瑞士军刀”,过去几年里,几乎所有的AI对齐和模型微调都绕不开它。我自己在早期做智能体项目时,也深度依赖PPO,它确实稳,但那个训练速度,还有动不动就爆掉的内存,真是让人又爱又恨。

PPO的核心思想很聪明,它通过一个“裁剪”操作,把策略更新的步子限制在一个安全的范围内,防止模型“学坏”或者“学崩”。但为了实现这个“安全”,它需要请一个“裁判”——也就是价值网络(Value Network)。这个裁判的任务是评估每一个状态(State)的好坏,告诉策略模型(Policy Model):“你这个动作在当前状态下,到底有多好?”问题就出在这里。当我们的策略模型本身就是一个拥有数百亿甚至上千亿参数的大语言模型时,这个裁判也得是个同级别的“大块头”。这意味着,训练时我们不仅要维护和更新一个巨大的策略模型,还要同时维护和更新一个同样巨大的价值网络。计算开销和内存占用直接翻倍,训练速度慢得像蜗牛,对硬件的要求也高得吓人。我实测过一个百亿参数模型的PPO微调,光是加载两个模型,显存就快见底了,更别提流畅训练了。

这就是DeepSeek团队推出GRPO(Group Relative Policy Optimization)最直接的动机。他们问了一个很本质的问题:我们真的需要一个独立的、庞大的价值网络来当裁判吗? 在很多任务里,尤其是像数学推理、代码生成这类任务,我们其实很难精确地定义“中间状态”的价值。比如,让模型解一道数学题,你很难说“写出第一个等式”这个动作值0.3分,“化简第二步”值0.5分。我们最终只关心答案对不对。GRPO的思路就是,绕开这个复杂的“中间裁判”,用一种更直接、更“朴素”的方式来指导模型学习。

GRPO的想法其实来源于我们人类的一种学习方式:比较学习。想象一下,你教一个新手写代码,你不会给他每一行代码都打分,而是会给他几个不同的写法样例,然后告诉他:“A方案比B方案好,因为更简洁;C方案虽然结果对,但逻辑有点绕。” 学习者通过比较这一组方案(Group)的相对(Relative)好坏,就能领悟到什么样的代码是优秀的。GRPO做的就是这个事。它不再依赖一个价值网络去估算抽象的“优势”,而是直接采样一组动作(比如模型针对同一个问题生成的多个不同回答),计算每个回答的奖励(比如答案的正确性、代码的可执行性),然后通过比较这组回答内部的奖励高低,来更新模型。奖励高的回答,其生成方式会被强化;奖励低的,则会被弱化。

这种转变带来的好处是革命性的。首先,最直观的就是计算效率的飙升。GRPO完全摒弃了价值网络,训练时只需要跑通策略模型(即大语言模型本身)和奖励计算。内存占用大幅下降,训练速度自然就上去了。其次,训练过程更稳定。PPO的更新严重依赖于价值网络估计的准确性,如果这个“裁判”没训练好,判断失误,整个策略模型就可能被带偏。而GRPO的更新基于一组样本的相对表现,方差更小,更像是在一群候选里选优,而不是盲目追求一个绝对高分,这让学习曲线平滑了很多。最后,它在某些特定任务上表现出了惊人的优势,尤其是在那些“结果导向”而非“过程导向”的任务上,比如数学、代码、创作等,GRPO往往能更快地找到高质量的策略。

2. GRPO算法原理拆解:像选秀比赛一样训练AI

理解了GRPO“比较学习”的核心思想后,我们来看看它具体是怎么运作的。你可以把整个过程想象成一场AI的“选秀比赛”。

2.1 第一步:海选——采样动作组

首先,对于给定的一个“状态”(在语言模型里,状态就是当前的对话历史或问题提示词),我们让当前的策略模型(也就是待训练的大模型)像海选一样,生成一组(Group) 候选动作。这个“组”的大小是一个超参数,比如N=4或N=8。也就是说,对于同一个问题,模型要独立地生成N个不同的回答。

# 伪代码示意:采样动作组
prompt = "请用Python编写一个函数,计算斐波那契数列的第n项。"
responses = []
for _ in range(group_size):  # group_size = N
    # 使用当前策略模型(policy_model)进行采样生成
    response = policy_model.generate(prompt, sampling=True)
    responses.append(response)

这一步很关键,它确保了比较的多样性。如果只生成一个回答,那就没有比较的意义了。这N个回答就是参加本轮“选秀”的选手。

2.2 第二步:评委打分——奖励评估

接下来,“评委”要上场了。这个评委就是奖励函数(Reward Function)。它会给每一个生成的回答打一个分数。这个奖励函数可以是基于规则(比如代码是否能通过单元测试、数学答案是否与标准答案一致),也可以是一个训练好的奖励模型(Reward Model),用来评估回答的质量、安全性或与人类偏好的对齐程度。

# 伪代码示意:奖励评估
rewards = []
for response in responses:
    score = reward_function(prompt, response)  # 奖励函数计算得分
    rewards.append(score)
# 假设 rewards = [0.8, 0.5, 0.9, 0.2]

现在,每个“选手”都有了一个绝对的分数。但GRPO的精髓不在于绝对分数,而在于相对位置。

2.3 第三步:排名与归一化——计算相对优势

单纯的分数高低还不足以指导模型更新。因为奖励函数的尺度可能每次都不一样,而且我们关心的是在同一批选手中谁更好。所以,GRPO会对这组奖励分数进行归一化处理,计算出每个动作的相对优势(Relative Advantage)

最常见的做法是使用“减去均值,除以标准差”的标准化方法,或者直接使用一种基于排序的变换。其目的是将原始的奖励值转换为均值为0、能够反映相对好坏的“优势值”。表现高于平均水平的动作会得到正的优势,鼓励模型多采用;低于平均水平的则得到负的优势,模型会减少其生成概率。

# 伪代码示意:计算相对优势 (标准化方法)
import numpy as np
rewards = np.array(rewards)
mean_reward = np.mean(rewards)
std_reward = np.std(rewards) + 1e-8  # 防止除零
advantages = (rewards - mean_reward) / std_reward
# 假设 advantages = [0.2, -0.6, 0.8, -1.4]

通过这一步,我们得到了一个关键信息:在本次生成的N个回答里,回答3(优势0.8)显著优于回答2(优势-0.6)。模型要学习的,就是如何让回答3的生成方式成为主流,同时避免回答2和回答4的生成方式。

2.4 第四步:策略更新——引入KL散度约束

最后,我们要用这个相对优势来更新策略模型(大语言模型)的参数。更新目标是增大高优势动作的概率,减小低优势动作的概率。这通过优化一个策略梯度损失函数来实现。

但是,直接根据优势值猛烈更新模型参数是危险的,这可能导致模型“忘记”之前学到的知识,或者行为发生剧变,训练不稳定。PPO用的是“概率比裁剪”来限制更新幅度,而GRPO采用了另一种经典且有效的方法:KL散度(Kullback-Leibler Divergence)约束

KL散度衡量的是新旧两个策略(即更新前后的模型)输出概率分布的差异。GRPO在损失函数中直接加入了一个KL散度惩罚项,强制要求新策略不能离旧策略太远。

# 伪代码示意:GRPO损失函数(简化版)
import torch.nn.functional as F

def grpo_loss(old_log_probs, new_log_probs, advantages, kl_coef=0.1):
    # 策略梯度损失:优势 * 新策略的对数概率
    ratio = torch.exp(new_log_probs - old_log_probs)  # 概率比
    pg_loss = -torch.mean(advantages * ratio)

    # KL散度惩罚项:新旧策略分布的差异
    kl_div = F.kl_div(new_log_probs, old_log_probs, reduction='batchmean')
    # 或者更常见的是计算对称KL或直接使用log_probs的差异近似

    total_loss = pg_loss + kl_coef * kl_div
    return total_loss

这个kl_coef参数就像一个“保守系数”,控制着模型更新的激进程度。系数越大,模型越倾向于保持原有行为,更新越保守;系数越小,模型对新信号的响应越快,但也越容易失控。在实际调参中,找到一个合适的KL系数至关重要,我个人的经验是从一个较小的值(如0.01)开始,根据训练稳定性慢慢调整。

3. GRPO vs PPO:一场算法架构的正面较量

光说GRPO自己的原理可能还不够直观,我们把它和它的前辈PPO放在一起,从几个关键维度进行一场详细的“拆机对比”,你就能明白GRPO到底“新”在哪里,“强”在哪里了。

为了更清晰地展示,我们先看一个核心架构的对比表格:

对比维度 PPO (Proximal Policy Optimization) GRPO (Group Relative Policy Optimization)
核心评估机制 依赖独立的价值网络(Critic) 评估状态价值。 完全摒弃价值网络,依靠组内动作的相对奖励进行评估。
优势函数计算 使用广义优势估计(GAE),结合价值网络预测和实际奖励,估算长期优势。 同一状态下采样的一组动作的即时奖励进行归一化,得到相对优势。
策略更新约束 使用概率比裁剪(Clip),硬性限制新旧策略概率比的范围。 在损失函数中引入KL散度(KL Divergence) 作为软约束,控制分布变化。
内存与计算开销 。需同时加载和训练策略网络(Actor)和价值网络(Critic),参数量翻倍。 。只需加载和训练策略网络,省去了价值网络的全部开销。
训练稳定性 较高。裁剪机制能有效防止破坏性更新,但依赖价值网络的准确性。 很高。基于组内比较,方差小;KL约束平滑,对奖励尺度不敏感。
采样复杂度 较低。每个状态通常只需采样一个动作(或一条轨迹)。 较高。每个状态需要采样一组(N个)动作,采样成本增加。
适用任务特点 适用于过程奖励明确、状态价值可估的任务(如控制游戏、机器人控制)。 更擅长结果导向、过程奖励稀疏或难以定义的任务(如数学推理、代码生成、文本创作)。

下面,我们针对几个关键点展开聊聊我的实际体会:

首先是价值网络这个“大家伙”。PPO的价值网络是个“必需品”,但也是个“负担”。在微调一个700亿参数的大模型时,这个价值网络通常也有相近的参数量。这意味着你的GPU显存不仅要放下模型本身、优化器状态、激活值,还要再放下一个几乎同样大的网络。我遇到过最常见的情况就是,模型刚加载完,还没开始训练,显存就用了80%以上,批量大小(batch size)被压得极小,严重拖慢训练。GRPO砍掉了这个负担,相当于给训练过程做了一次“瘦身手术”,同样的硬件,你能用更大的批量、更快的速度进行训练,这个体验提升是立竿见影的。

其次是优势估计的“哲学”差异。PPO的GAE试图回答:“这个动作从长远看,比平均情况好多少?”它需要价值网络对未来进行预测,这个预测本身就有误差,而且GAE的计算涉及多个时间步的奖励折扣,比较复杂。GRPO则非常“务实”,它问的是:“在刚才针对这个问题想出的5个主意里,哪个最好?”它不关心绝对的好坏,也不做长期预测,只关心当下这批候选里的相对排名。这种方法在奖励信号清晰但难以进行多步估计的任务中,反而更直接、更鲁棒。比如判断一段代码是否正确,奖励(单元测试通过与否)是明确且即时的,用GRPO就非常合适。

最后是策略更新的“安全阀”。PPO的裁剪就像给更新幅度加了一个硬性的“天花板”,不管优势值多大,更新都不能超过某个范围。这个方法简单粗暴但有效。GRPO的KL散度约束则更像一个“弹性阻尼器”。它不直接限制更新幅度,而是惩罚新旧策略的“差异度”。如果模型试图改变太多,KL惩罚项就会急剧增大,从而拉回更新方向。在我的实践中,KL约束在应对奖励函数突然变化或出现异常值时,表现得更加平滑,不容易导致训练崩溃。

当然,GRPO也不是没有代价。最大的代价就是采样成本。PPO跑一个时间步,可能只需要模型推理一次(生成一个动作),而GRPO需要推理N次(生成一组动作)。这对于那些模型推理本身就很耗时的场景,会增加时间开销。不过,考虑到它节省了价值网络的前向传播和反向传播,以及更大的批量大小带来的梯度更稳定等好处,在很多情况下,总体的训练wall-clock时间(即实际挂钟时间)依然是下降的。

4. GRPO的实战表现:在DeepSeek-R1中看到了什么?

理论说得再漂亮,不如实际跑一跑看效果。DeepSeek团队将GRPO算法应用于他们的DeepSeek-R1模型训练中,取得的结果确实让人眼前一亮。我们来看看它在具体任务上是如何发力的。

DeepSeek-R1的训练流程并不是单纯只用GRPO,而是一个多阶段的组合拳,GRPO在其中扮演了强化学习阶段的“核心发动机”角色。整个流程大致可以分为四个阶段:

  1. 监督微调(SFT)阶段:这是起点。使用高质量的指令-回答对数据,以标准的语言模型训练方式,让模型学会遵循指令和生成基本合理的回答。这相当于给学生打好知识基础。
  2. 强化学习(RL)阶段 - GRPO登场:在SFT模型的基础上,引入GRPO进行训练。这里的目标不再是模仿,而是优化。例如,在数学推理任务上,奖励函数就是答案的最终正确性。模型通过生成一组解题步骤,根据最终答案的对错获得相对优势,从而学习到“哪种推理路径更可能通向正确答案”。这个阶段,GRPO高效、稳定的特性得到了充分发挥。
  3. 拒绝采样(RS)阶段:这个阶段可以看作是对GRPO的补充和“提纯”。对于同一个问题,让模型生成大量(比如数百个)回答,然后直接用奖励函数筛选出其中最好的几个,用这些高质量回答数据反过来对模型进行一次监督微调。这相当于在GRPO初步筛选的基础上,进行一次“精英选拔”,进一步拉高模型的上限。
  4. 最终强化学习阶段:最后,可能还会用一个更小的学习率,结合GRPO或其它方法进行一轮微调,以稳定模型性能。

那么,GRPO在实际任务中的表现如何呢?根据已公开的论文和报告,在数学推理(如MATH、GSM8K数据集)和代码生成(如HumanEval、MBPP数据集)这类典型任务上,采用GRPO训练的DeepSeek-R1模型,相比传统PPO方法,展现出了几个显著优势:

首先是训练效率的提升。 由于去掉了价值网络,训练速度提升了30%到50%是常见的。这意味着研究人员可以用更少的机器、更短的时间进行实验迭代,试错成本大大降低。对于创业团队或算力有限的开发者来说,这是一个巨大的福音。

其次是最终性能的突破。 在多个数学和代码基准测试上,GRPO版本的模型不仅收敛更快,而且最终得分也超过了PPO基线。这证明了GRPO的优化方向是有效的,它没有因为简化架构而损失性能,反而因为更直接的优化目标和更稳定的训练过程,挖掘出了模型更大的潜力。特别是在一些需要多步复杂推理的任务上,基于组内比较的GRPO似乎更能帮助模型学会“择优而选”的推理策略。

最后是训练曲线的平滑度。 从我观察到的训练损失和奖励曲线来看,GRPO的训练过程通常比PPO更平滑,抖动更少。PPO的训练曲线有时会像心电图一样上下起伏,需要仔细调整学习率和裁剪系数。而GRPO的曲线更像是一条平稳上升的斜坡,这对超参数调优不那么敏感,让开发者能更专注于模型结构和奖励函数的设计。

当然,GRPO也不是万能的。它在一些需要精确估计每一步状态价值的序列决策任务(比如玩星际争霸、机器人连续控制)中,可能不如PPO表现得好。因为在这些任务里,每一步的即时奖励和状态价值都很重要,GAE能提供更精细的长期指导。但对于大语言模型微调这个主战场——其任务本质是生成一个高质量的完整序列(一段话、一段代码、一个答案)——GRPO的“结果导向”和“组内比较”哲学,显得更加契合。

5. 超越对齐:GRPO与RLHF的范式之辩

谈到大语言模型的微调,除了PPO,另一个无法绕开的巨人是RLHF(基于人类反馈的强化学习),尤其是OpenAI将其成功应用于ChatGPT之后。那么,新生的GRPO和已成经典的RLHF范式相比,又有何不同呢?这不仅仅是两个算法的对比,更是两种技术路线的思考。

RLHF的核心是人类反馈的“蒸馏”。它的流程通常包括:1) 训练一个奖励模型(Reward Model),这个模型通过学习人类对不同回答的偏好排序数据,来模拟人类的评判标准;2) 使用这个奖励模型作为PPO算法中的奖励函数,去微调语言模型。整个过程复杂且昂贵,需要大量的人工标注数据来训练奖励模型,并且奖励模型的准确性直接决定了最终微调的效果。如果奖励模型有偏见或者没学好,整个RLHF过程就可能跑偏。

GRPO则试图走一条更“轻量化”的路径。它不一定需要训练一个复杂的奖励模型。在很多场景下,一个可自动计算的、确定性的奖励函数就足够了。比如,代码生成任务中,奖励就是单元测试的通过率;数学推理中,奖励就是答案与标准答案的匹配度。GRPO直接使用这个奖励函数,通过组内比较来驱动模型优化。它省去了RLHF中训练奖励模型这个最耗时、成本最高的环节。

我们可以从几个层面来对比它们:

  • 算法原理的出发点不同:RLHF的本质是对齐(Alignment),目标是让模型的输出符合复杂、多元且有时模糊的人类价值观和偏好。GRPO的本质是优化(Optimization),目标是针对一个明确、可量化的目标函数(如正确率、代码效率)提升模型性能。
  • 训练流程与成本:RLHF流程长、环节多、成本高(数据标注、奖励模型训练、PPO微调)。GRPO流程相对简短,直接针对任务目标进行优化,成本更低,更适合垂直领域或特定任务的快速迭代。
  • 策略更新的稳定性:RLHF的稳定性严重依赖于奖励模型的质量,存在“奖励黑客”(Reward Hacking)的风险,即模型找到奖励模型的漏洞,生成看似高分但实际无用的内容。GRPO由于奖励函数通常是确定性的(如测试用例),且通过KL散度约束,其更新可能更稳定、更可控。
  • 应用场景的侧重:RLHF更适合需要与开放式人类偏好对齐的通用对话助手、创意写作助手等。GRPO则在有明确对错、可自动化评估的任务上大放异彩,如数学解题、代码生成、特定格式的数据生成、翻译质量提升等。
  • 资源需求:RLHF对数据、算力、工程能力要求极高。GRPO降低了入门门槛,让更多研究团队和开发者能够在有限的资源下,对自己的模型进行有效的强化学习微调。

简单来说,RLHF试图教AI理解“什么是好”,而GRPO则教AI达成“怎样做对”。两者并不完全对立,未来很可能出现融合的方案。例如,可以先使用RLHF进行广泛的、基于人类偏好的对齐,然后在具体的、目标明确的任务上,再用GRPO进行一步到位的性能强化。DeepSeek-R1的工作向我们展示,在追求极致性能的赛道上,GRPO提供了一条高效且有力的新路径。它让强化学习不再只是巨头公司的游戏,也为更广泛的AI应用落地提供了新的工具箱。在我自己的项目尝试中,对于有明确评估指标的任务,我会优先考虑GRPO的思路,它的简洁和高效,在工程实践中带来的幸福感是实实在在的。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐