后厨里,主厨们正在学一道新菜。传统方法 PPO 的做法,是请一位“品鉴管家”——价值网络——守在灶台边。这位管家每尝一口菜,都要预估这道菜将来能卖多少钱,主厨再根据这个预测决定下一勺该加盐还是减糖。管家很专业,但也极其昂贵,因为要多供起一个和主厨一样大的脑子,还要一天到晚跟着转。 DeepSeek 的 GRPO 换了一种思路:同一道菜,让六位厨师各做一份,做完端上同一张桌。大家不比绝对分,只看相对高下——谁高出平均水平,谁的菜谱就被推广强化;谁低于平均水平,谁的做法就被弱化修正。全场不再需要那位额外的品鉴管家,厨房省出了大量炉灶和冷藏空间。 这套“同题多答、组内比较”的打法,正在成为 DeepSeek 训练大模型推理能力的关键武器。今天我们就从零拆解,看看 GRPO 是如何把一只大模型训练成数学高手的。

岗位关联

学懂 GRPO,你就掌握了“以最小显存开销完成 LLM 推理对齐”的核心设计思路,能在训练成本受限时复用 DeepSeek 的实战经验,这是大模型落地中极具性价比的一课。

目录
  1. 可视化演示
  2. PPO基线问题
  3. GRPO核心思想
  4. 分组采样机制
  5. 相对优势计算
  6. 策略更新机制
  7. KL约束技巧
  8. 显存效率优势
  9. 应用与成效
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示GRPO算法移除Critic网络的核心创新、组内相对优势计算机制、与PPO的显存对比及KL散度约束,解析DeepSeek低成本RL对齐原理。

本节配有交互动效(进入视口后自动加载,约 3KB)。

组内相对优势计算 对同一prompt采样G个回答,用组内均值和标准差计算相对优势 A_i = (r_i - mean) / std GRPO用统计基线替代Critic网络,大幅降低显存开销。

PPO基线问题

想象这样一间厨房:主厨正在学做新菜,每一步动作之后,都需要一位“品鉴管家”站在旁边尝一口,然后报出这道菜最终能卖多少钱的预测。主厨听到预测后,才敢决定下一步是加盐还是改火。这位管家,就是 PPO 中的价值网络。

在 PPO 中,价值网络被用来计算优势函数。它的思路很直白:主厨当前做菜的价值,不仅看眼前这口锅的状态,还要看将来潜在的收益。管家给出的预测是“从当前状态出发,未来总收益的期望”,因此策略网络可以借助它判断:我现在这一步到底比预期好还是比预期差。

问题在于,这位管家的脑子里装着与主厨几乎一样多的参数。要训练它,厨房必须多准备一份完整食材和冷藏空间——对于 7B 级别的大模型,这意味着显存开销近乎翻倍。更麻烦的是,管家预测可能不稳定,一旦估错方向,会把整个训练带偏。

正因如此,GRPO 的第一步就是反问:如果没有人做菜时真的还需要一位管家来预估价格,那是否有更便宜的办法判断菜的好坏?答案,是把几盘菜放在同一张桌上直接比。

At=rt+γV(st+1)−V(st)A_t = r_t + \gamma V(s_{t+1}) - V(s_t)
优势函数表示“当前动作比预期好多少”:即时奖励加上折现后的未来价值,再减去当前状态的预测价值。
  1. 即时奖励 $r_t$环境在当前步骤直接给出的反馈,好比客人尝了一口菜后的即时表情。
    rtr_t
  2. 未来价值 $V(s_{t+1})$品鉴管家对“接下来状态”能带来多少总回报的预测。
    V(st+1)V(s_{t+1})
  3. 折现系数 $\gamma$把未来的钱折算成今天的价值,越远的收益越打折扣。
    γV(st+1)\gamma V(s_{t+1})
  4. 当前基线 $V(s_t)$管家在当前状态给出的估值,代表“什么都不做也能得到的期望”。
    V(st)V(s_t)

GRPO核心思想

GRPO 的灵感来自于一个很朴素的厨房经验:与其花钱请人预估每道菜的绝对价值,不如让同一位顾客点六份相同的菜,主厨一次性做出六份,然后直接比较这六份的水平高低。

具体到算法上,GRPO 不再训练价值网络,而是对同一个提示(prompt)采样一组回答,把这组回答视作“同一道菜的六份作品”。每份作品都会得到一个奖励分数,分数来自规则、人工偏好或结果校验器。随后,算法计算这组分数的均值和标准差,用它们作为内部的相对基线。

这和 PPO 最大的不同是:基线不再是外部网络预测出来的,而是从组内数据直接统计出来的。它不需要梯度、不需要额外参数、不会报错,唯一需要的就是“多采样几份”。采样在生成式大模型上非常便宜——同一个提示可以并行生成多条回答,成本远低于再养一个价值网络。

至此,GRPO 的核心已经浮出水面:用“组内比较”代替“网络估值”。接下来我们要解决的是,这六份菜到底是怎么被精心采样出来的。

A^i=ri−1G∑j=1Grj1G∑j=1G(rj−μG)2+ϵ\hat{A}_i = \frac{r_i - \frac{1}{G}\sum_{j=1}^{G} r_j}{\sqrt{\frac{1}{G}\sum_{j=1}^{G}(r_j-\mu_G)^2}+\epsilon}
相对优势表示“这份回答在组内比平均水平高出多少个标准差”:正值表示优于组内平均,负值表示劣于组内平均。
  1. 组内均值 $\mu_G$六份作品的分数平均线,就是这一桌菜的集体水平线。
    μG=1G∑j=1Grj\mu_G = \frac{1}{G}\sum_{j=1}^{G}r_j
  2. 组内标准差 $\sigma_G$衡量这组分数彼此之间的离散程度,反映组内竞争有多激烈。
    σG=1G∑j=1G(rj−μG)2\sigma_G = \sqrt{\frac{1}{G}\sum_{j=1}^{G}(r_j-\mu_G)^2}
  3. 差值 $r_i - \mu_G$当前这份菜与平均线的差距,正负号决定了强化还是弱化的方向。
    ri−μGr_i - \mu_G
  4. 归一化与防除零除以标准差让优势无量纲化,$\epsilon$ 是一小量防止除以零。
    ri−μGσG+ϵ\frac{r_i-\mu_G}{\sigma_G+\epsilon}

分组采样机制

回到厨房。一次订单进来了,不是只让一位厨师做,而是同一时间让六位厨师分别操作。每个厨师从同一个起点出发,但做出的菜细节各不相同——有的多翻两下锅,有的加了一点调料,有的火候更猛。这一组菜就是一组回答。

在 GRPO 中,采样是“固定提示、多次生成”。给定问题 $q$,模型根据当前的旧策略 $\pi_{\theta_{\mathrm{old}}}$ 独立采样生成 $G$ 条完整回答。每条回答都是一段 token 序列,长度可以不同。因为生成是并行的,多采样 $G$ 条的成本只是单条生成的 $G$ 倍耗时,但显存不会增加 $G$ 倍。

这一步的意义在于:有了 G 条回答,我们才可能计算组内均值、组内标准差,并把“谁高谁低”这件事限定在同一道菜的范围内。如果只采样一条回答,所有相对信息都会消失,优势就退化为原始奖励减常数,方差会非常大。

采样完成后,六份菜已经上桌。下一步就是真正“比一比”,把每份菜在这个小团体中的位置算出来。

{o1,o2,…,oG}∼πθold(O∣q)\{o_1, o_2, \dots, o_G\} \sim \pi_{\theta_{\mathrm{old}}}(O \mid q)
从旧策略中独立采样 G 条回答:固定提示 q,采样得到一组多样化的输出轨迹,供后续组内比较使用。
  1. 固定提示 $q$所有采样的出发点,相当于同一位顾客的同一张订单。
    qq
  2. 旧策略 $\pi_{\theta_{\mathrm{old}}}$更新前被冻结的行为准则,采样用它来保证数据分布稳定。
    πθold(O∣q)\pi_{\theta_{\mathrm{old}}}(O \mid q)
  3. G 条独立轨迹 $\{o_i\}$同一提示下生成的多个完整回答,每条都是独立的 token 序列。
    oi=(oi,1,oi,2,…,oi,∣oi∣)o_i = (o_{i,1}, o_{i,2}, \dots, o_{i,|o_i|})

相对优势计算

六份菜齐刷刷摆在转盘上。现在不需要外人来打分,只需要先算出这一桌的平均水准,再看每份菜比平均线高出或低出多少。这就是相对优势的计算逻辑。

在 GRPO 中,每条回答 $o_i$ 都有一个奖励 $r_i$。我们先把这组奖励的均值算出来作为中心点,再把每组奖励的标准差算出来作为标尺。每条回答的组内优势就是“它离中心点有多远、有多远”——用标准差做单位衡量。

这样做有几个好处。第一,它天然适应不同任务,因为无论奖励的绝对范围是 0 到 1 还是 0 到 100,组内比较都会自动归一化。第二,它让梯度方差大幅降低,因为组内比较抵消了不同提示之间的难度差异。第三,它不需要额外的网络参数,纯粹是统计量,训练时不会引入新的误差源。

有了优势值,接下来主厨就要开始真正调整自己的动作了:是保留优秀菜谱,还是压一压糟糕做法。

A^i,t=A^i=ri−μGσG+ϵ\hat{A}_{i,t} = \hat{A}_i = \frac{r_i - \mu_G}{\sigma_G + \epsilon}
组内相对优势对每条回答的所有 token 共享同一个值:先算组内均值和标准差,再用它们对每个奖励做归一化,得到优势。
  1. 中心化 $r_i - \mu_G$把组内均值当作零点,消去这道题本身的绝对难度影响。
    ri−μGr_i - \mu_G
  2. 归一化分母 $\sigma_G + \epsilon$用组内离散程度作为标尺,让优势在不同题目间可比。
    σG+ϵ\sigma_G + \epsilon
  3. 共享优势 $\hat{A}_i$同一回答内所有 token 共用这一优势值,告诉模型“这段输出整体是偏好的还是偏劣的”。
    A^i,t=A^i\hat{A}_{i,t} = \hat{A}_i

策略更新机制

现在六份菜已经分出高下,厨房开始制定新的菜谱标准。对于高于均值的菜(正优势),主厨需要强化促成这份菜的那些动作;对于低于均值的菜(负优势),主厨要弱化这些动作。

直接的做法是梯度上升:增大正优势 token 的概率,减小负优势 token 的概率。但一味猛冲会把策略改得面目全非,甚至做出完全不像样的菜。于是 GRPO 借用 PPO 中的重要性采样比率和裁剪机制,让更新幅度可控。

具体来说,对于每个 token,算法计算新旧策略在这个 token 上的概率比 $\rho_{i,t}(\theta)$,然后把它与裁剪后的版本取最小值。这个 $\min$ 操作保证:当优势为正时,最多从概率提升中获益到一个裁剪边界;当优势为负时,也最多承受边界内的惩罚。这种“守规矩的更新”让我们可以保持训练稳定,不会一个批次就把模型推崩。

看到 KL 惩罚,不禁要问:为什么训练新菜谱的同时,还要回头看老菜谱?

LGRPO(θ)=1G∑i=1G1∣oi∣∑t=1∣oi∣min⁡(ρi,t(θ)A^i,  clip⁡(ρi,t(θ),1−ε,1+ε)A^i)−β DKL[πθ∥πref]\mathcal{L}_{GRPO}(\theta) = \frac{1}{G}\sum_{i=1}^{G}\frac{1}{|o_i|}\sum_{t=1}^{|o_i|}\min\left(\rho_{i,t}(\theta)\hat{A}_i,\;\operatorname{clip}\left(\rho_{i,t}(\theta),1-\varepsilon,1+\varepsilon\right)\hat{A}_i\right) - \beta\,D_{KL}[\pi_\theta\|\pi_{\mathrm{ref}}]
GRPO 的策略目标是裁剪后的重要性采样目标:概率比乘以优势,并与裁剪后的版本取最小值,最后减去 KL 惩罚项。
  1. 概率比 $\rho_{i,t}(\theta)$当前策略生成该 token 的概率除以旧策略的概率,衡量这次更新在“改变多大”。
    ρi,t(θ)=πθ(oi,t∣q,oi,<t)πθold(oi,t∣q,oi,<t)\rho_{i,t}(\theta)=\frac{\pi_\theta(o_{i,t}\mid q,o_{i,<t})}{\pi_{\theta_{\mathrm{old}}}(o_{i,t}\mid q,o_{i,<t})}
  2. 裁剪区间 $[1-\varepsilon,1+\varepsilon]$概率比超出这个区间就被截断,防止单步更新过猛。
    clip⁡(ρi,t(θ),1−ε,1+ε)\operatorname{clip}\left(\rho_{i,t}(\theta),1-\varepsilon,1+\varepsilon\right)
  3. min 保护在未裁剪目标与裁剪目标之间取小值,保证优化方向永远不踩过红线。
    min⁡(ρi,tA^i,  clip⁡(ρi,t)A^i)\min\left(\rho_{i,t}\hat{A}_i,\;\operatorname{clip}(\rho_{i,t})\hat{A}_i\right)
  4. KL 惩罚 $-\beta D_{KL}$提醒模型不要离参考行为太远,这是下一节的主角。
    −βDKL[πθ∥πref]-\beta D_{KL}[\pi_\theta\|\pi_{\mathrm{ref}}]

KL约束技巧

新菜谱之所以不能完全抛弃老菜谱,是因为老菜谱积累了模型预训练以来的大量语言能力和世界知识。如果只盯着当前批次奖励猛改,模型可能很快开始说胡话、重复短句、甚至遗忘基本语法。

因此,GRPO 引入了一个参考模型 $\pi_{\mathrm{ref}}$,通常是训练开始时的初始策略。在每一步更新中,算法不仅优化奖励相关目标,还惩罚当前策略与参考策略之间的 KL 散度。这个惩罚项就像一根橡皮筋,把策略拉向奖励最大的方向,但又不允许它离参考点太远。

DeepSeek 的实现还采用了一种逐 token 的无偏 KL 估计,避免了对整句联合分布的高方差估计。这个估计量在数学上保证期望值等于真实的 KL 散度,但方差更小、实现更简单,训练中只需对比当前策略与参考策略在每个 token 上的概率即可,非常适合大模型场景。

有了这套约束,模型既能在奖励方向上大步前进,又不会因为走太远而丢失原有的语言能力。最后,我们来看看省掉价值网络到底省了多少“厨房预算”。

DKLub=log⁡πθ(oi,t∣q,oi,<t)πref(oi,t∣q,oi,<t)−1+πref(oi,t∣q,oi,<t)πθ(oi,t∣q,oi,<t)D_{KL}^{ub} = \log\frac{\pi_\theta(o_{i,t}\mid q,o_{i,<t})}{\pi_{\mathrm{ref}}(o_{i,t}\mid q,o_{i,<t})} - 1 + \frac{\pi_{\mathrm{ref}}(o_{i,t}\mid q,o_{i,<t})}{\pi_\theta(o_{i,t}\mid q,o_{i,<t})}
这是逐 token 的无偏 KL 近似式:用两个策略在当前 token 上的概率比和反向比构造,期望等于真实 KL,且数值更稳定。
  1. 对数概率比当前策略与参考策略对该 token 的偏爱程度的对数值,正数表示当前策略更偏爱。
    log⁡πθ(oi,t)πref(oi,t)\log\frac{\pi_\theta(o_{i,t})}{\pi_{\mathrm{ref}}(o_{i,t})}
  2. 反向比修正项 $-1 + \frac{\pi_{\mathrm{ref}}}{\pi_\theta}$这个看似奇怪的结构正是为了保证估计无偏——它补偿了概率比波动带来的偏差。
    −1+πref(oi,t)πθ(oi,t)-1 + \frac{\pi_{\mathrm{ref}}(o_{i,t})}{\pi_\theta(o_{i,t})}
  3. 逐 token 求和取平均对回答内所有 token 的 KL 贡献求平均,形成整个回答与参考模型的偏离程度。
    1∣oi∣∑t=1∣oi∣DKLub(oi,t)\frac{1}{|o_i|}\sum_{t=1}^{|o_i|} D_{KL}^{ub}(o_{i,t})

显存效率优势

让六位厨师做菜,看起来好像更费食材:毕竟要同时做六份。但仔细算一下会发现,最贵的其实不是食材,而是养一位品鉴管家的固定成本。在 PPO 中,价值网络和策略网络几乎一样大,训练时两者的参数、优化器状态和激活都要同时驻留显存,等于直接翻倍。

GRPO 把价值网络一整个移除后,显存占用大体只有原来的“策略网络 + 采样多条回答”的开销。由于生成回答时并不需要为每条回答保存完整梯度(只有被选中的轨迹才参与反向传播),多采样的额外显存远小于养一个价值网络。

更重要的是,显存节省直接转化成了训练能力的提升:同一块 GPU 上可以跑更长的序列、更大的批次、更小的设备集群。对长思维链推理任务尤其关键,因为回答长度动辄上千 token,激活显存随序列长度线性增长,省下的每一 MB 都很有价值。

省下来的显存,最终变成了 DeepSeek 数学模型的惊艳成绩。这就是 GRPO 从理论走向实战的故事。

MemGRPO≈MemPPO−(∣θcritic∣+∣actcritic∣)\text{Mem}_{GRPO} \approx \text{Mem}_{PPO} - \left(|\theta_{\mathrm{critic}}| + |\text{act}_{\mathrm{critic}}|\right)
GRPO 的显存约为 PPO 减去价值网络的参数和激活量:省下了整个批评家分支的存储与计算开销。
  1. 批评家参数量 $|\theta_{\mathrm{critic}}|$价值网络中的全部可学习参数,是显存的大头。
    ∣θcritic∣|\theta_{\mathrm{critic}}|
  2. 批评家激活量 $|\text{act}_{\mathrm{critic}}|$前向传播过程中需要保存的中间结果,也是反向传播必需的开销。
    ∣actcritic∣|\text{act}_{\mathrm{critic}}|
  3. GRPO 近似显存策略网络自身的参数和激活依然保留,但批评家部分的双重开销被直接消除。
    MemGRPO≈MemPPO−∣θcritic∣−∣actcritic∣\text{Mem}_{GRPO} \approx \text{Mem}_{PPO} - |\theta_{\mathrm{critic}}| - |\text{act}_{\mathrm{critic}}|

应用与成效

DeepSeek 的厨房用这套“同题多答、组内比较”的方法训练出了 DeepSeekMath 系列模型。在数学推理基准上,7B 规模的模型取得了令人惊讶的成绩:GSM8K 达到 82.9%,MATH 达到 46.8%。这个成绩不仅碾压了同规模的 SFT 模型,甚至超越了许多数十倍参数的模型。

GRPO 之所以在推理任务上特别有效,是因为数学题天然有“标准答案”:同一题生成多条解答过程,用规则验证器判断对错,就能得到明确的奖励信号。模型学到的不仅是零散的解题技巧,而是一种内部一致的推理策略——先试哪条路、遇到死胡同如何回溯、哪些中间步骤更容易得分。

更重要的是,这套方法完全开源可复现。社区不需要大规模奖励模型和昂贵价值网络,就能在单节点甚至单卡上完成小模型的强化对齐。这大大降低了强化学习在大模型上的使用门槛,也为后续的长思维链模型(如 DeepSeek-R1 系列)铺平了道路。

从品鉴管家到六人同厨,GRPO 用一次“结构减法”实现了效率和性能的双重提升。理解了这条主线,你就能明白 DeepSeek 为什么能如此高效地训练出强大的推理模型。

GSM8K:82.9%,MATH:46.8%\text{GSM8K}: 82.9\%,\quad \text{MATH}: 46.8\%
DeepSeekMath 7B 使用 GRPO 后,在 GSM8K 和 MATH 两个数学推理基准上分别达到 82.9% 和 46.8%,大幅超越同规模 SFT 模型。
  1. GSM8K 82.9%小学到初中水平的数学应用题数据集,82.9% 意味着大多数带多步推理的问题模型都能解对。
    GSM8KGRPO=82.9%\text{GSM8K}_{GRPO}=82.9\%
  2. MATH 46.8%高中数学竞赛级别的难题集,能接近一半的正确率,说明模型具备相当强的推理能力。
    MATHGRPO=46.8%\text{MATH}_{GRPO}=46.8\%
  3. 能力对比这两项成绩显著高于同样 7B 规模、只用监督微调训练的基线。
    AccGRPO≫AccSFT\text{Acc}_{GRPO} \gg \text{Acc}_{SFT}

AI 应用场景

数学推理模型强化对齐

阶段:强化学习对齐(RLVR,基于规则验证的强化学习)

解决的问题:传统 PPO 训练数学推理模型时,价值网络与策略网络规模相当,显存占用巨大,且价值预测不稳定会误导策略更新。GRPO 通过对同一题目采样多份解答,用组内相对优势替代价值网络,在显存受限环境下也能稳定训练长思维链。

具体案例:DeepSeekMath 7B 使用 GRPO 在 GSM8K 上达到 82.9%、在 MATH 上达到 46.8%,超过同规模 SFT 模型并接近部分百亿级模型。训练过程中,每个数学问题并行生成多条解题过程,规则校验器自动判分,组内优势指导策略更新。

对话偏好对齐的低成本复现

阶段:RLHF(基于人类反馈的强化学习)

解决的问题:很多团队没有预算训练一个高质量奖励模型,也难以忍受 PPO 价值网络带来的显存翻倍。GRPO 只需对同一提示生成多个回答,再对这些回答进行偏好排序或打分即可完成对齐,省去价值网络和大部分显存开销。

具体案例:开源社区在 7B 以下模型的对话对齐中应用 GRPO,通过构造“同一提示多个回答”的偏好对比,用统一奖励模型或人工标注给每组回答打分,再归一化为组内优势进行策略更新,在单卡或双卡环境下即可复现不错的中文对话效果。

长思维链推理能力的提升

阶段:强化学习后训练(Reasoning RL)

解决的问题:大模型在长思维链推理中经常出现“想一半就放弃”或“答非所问”的问题。GRPO 的组内采样天然产生多条不同长度的推理轨迹,让模型在对比中学会“多坚持几步”和“避免无意义绕路”。

具体案例:DeepSeek-R1 系列模型继承了 GRPO 式训练思路,通过同题采样多条长推理链、用结果正确性作为奖励信号,模型逐步学会了自我反思和错误纠正,推理链明显延长且质量提升。这一思路也被业界广泛借鉴。

Python 演示

python41 行
import torchimport torch.nn as nn class SoftPolicy(nn.Module):    def __init__(self, vocab=8):        super().__init__()        self.logits = nn.Parameter(torch.randn(vocab) * 0.3)     def probs(self):        return torch.softmax(self.logits, dim=-1) def grpo_update(policy, ref_policy, good_id, G=6, lr=0.1,                eps=0.2, beta=0.2, steps=20):    opt = torch.optim.SGD(policy.parameters(), lr=lr)    # 采样前冻结概率,记录为旧策略    old_probs = policy.probs().detach()    # 同一提示采样 G 条回答    tokens = torch.multinomial(old_probs, G, replacement=True)    # 简单规则奖励:抽中目标 token 得 1.2,否则 0.2    rewards = (tokens == good_id).float() + 0.2    # 组内相对优势    adv = (rewards - rewards.mean()) / (rewards.std() + 1e-8)    for _ in range(steps):        p = policy.probs()        ratio = p[tokens] / old_probs[tokens]        surr = torch.min(ratio * adv,                         torch.clamp(ratio, 1 - eps, 1 + eps) * adv)        kl = (p * (p.log() - ref_policy.probs().detach().log())).sum()        loss = -surr.mean() + beta * kl        opt.zero_grad()        loss.backward()        opt.step()    return adv.numpy() if __name__ == "__main__":    torch.manual_seed(42)    policy = SoftPolicy(vocab=8)    ref_policy = SoftPolicy(vocab=8)    advs = grpo_update(policy, ref_policy, good_id=5)    print("组内相对优势:", advs)    print("目标token概率:", policy.probs()[5].item())
目的:用 20 行核心逻辑复现 GRPO 的主干流程——同题采样、组内优势归一化、裁剪目标更新与 KL 惩罚,方便你直观理解算法在做什么。
  1. old_probs = policy.probs().detach()采样前冻结一份概率分布,当作“旧菜谱”来用
  2. tokens = torch.multinomial(old_probs, G, replacement=True)按旧策略对同一提示采样 G 个回答,模拟一组厨师同时做菜
  3. adv = (rewards - rewards.mean()) / (rewards.std() + 1e-8)组内均值做基线、组内标准差做归一化,算出相对优势
  4. ratio = p[tokens] / old_probs[tokens]新策略与旧策略在各 token 上的概率比,衡量更新幅度
  5. surr = torch.min(ratio * adv, torch.clamp(ratio, 1 - eps, 1 + eps) * adv)裁剪概率比并取 min,防止单步更新过猛
  6. kl = (p * (p.log() - ref_policy.probs().detach().log())).sum()当前策略与参考策略的 KL 散度,把模型拴在安全范围里
  7. loss = -surr.mean() + beta * klGRPO 的核心损失:最大化裁剪后的优势目标,同时压制 KL 漂移

常见误区

误区我一直以为 GRPO 去掉了价值网络,就等于扔掉所有基线,直接用原始奖励做策略梯度,所以方差会特别大。

正解GRPO 并没有扔掉基线,而是把基线换成了“组内均值”。每个提示采样出 G 条回答后,用这 G 条奖励的平均值作为基线。这个基线不学参数、不用前向传播,但依然能起到降低策略梯度方差的作用。

为何常见:因为 GRPO 最出名的 slogan 就是“去价值网络”,初学者很容易把“去价值网络”误解成“去基线”。

误区GRPO 去掉了价值网络又不用奖励模型,应该是一种完全无监督的算法吧?

正解GRPO 依然需要奖励信号。奖励可以来自规则验证器(数学对错)、人工偏好打分或已训练的奖励模型。它去掉的是“价值网络”——即对每个状态预估期望回报的网络——而不是奖励本身。采样出的每条回答仍然要打分,才能算组内均值。

为何常见:大家把“价值网络”和“奖励模型”混为一谈,误以为去掉前者就意味着去掉所有外部反馈。

误区GRPO = PPO − critic,就这么简单,原理上没有任何其他区别。

正解除了删掉价值网络,GRPO 在细节上还有多处重要变化:基线从组内统计量得来而不是网络预测;优势对同一回答的所有 token 共享同一个值;KL 惩罚采用逐 token 的无偏估计;更新目标按“回答级”分组组织。这些变化共同构成了一个新的、更轻量的算法,而非简单的删减。

为何常见:GRPO 的体量恰好和 PPO 是“少一个网络”,所以容易被人简化成减法。

误区既然 GRPO 已经用裁剪控制更新幅度,那 KL 惩罚是不是冗余的?我去掉它试试。

正解裁剪控制的是“单步更新幅度”,KL 控制的是“策略整体漂移”。即使每步都裁剪,经过多轮更新后策略仍可能离参考模型越来越远,最终丢掉语言能力。KL 惩罚在 GRPO 目标函数中与策略目标同时优化,是稳定长程训练的关键组件。

为何常见:裁剪机制给人“已经够安全了”的错觉,让人低估了累积漂移的风险。

误区GRPO 是 DeepSeek 做数学题发明的,应该只适用于答案有对错之分的任务。

正解GRPO 是通用的策略优化方法,只要任务能定义奖励信号,就能用组内采样比较来更新策略。数学推理只是它最容易验证的场景,对话偏好对齐、代码生成、工具调用等任务同样适用。关键在于“同一提示能采样出多条可比较的轨迹”。

为何常见:GRPO 因为 DeepSeekMath 走红,大家就把它的适用范围窄化为数学题。

面试题

Q1. GRPO 相比 PPO 在结构上最大的变化是什么?

单选题 · easy

  • A.增加一个价值网络
  • B.去掉整个价值网络← 正确答案
  • C.引入生成对抗机制
  • D.把奖励函数改为损失

答案:B。GRPO 最核心的结构变化就是移除价值网络,改为组内统计基线。A 恰好说反了;C 是 GAN 的做法,与 GRPO 无关;D 说的不是结构变化,奖励函数依然存在。就像请人做菜不用再养一名品鉴管家。

Q2. GRPO 组内优势的归一化统计基础是什么?

单选题 · easy

  • A.组内均值与标准差← 正确答案
  • B.全批量最优奖励
  • C.价值网络的预测
  • D.蒙特卡洛回报和

答案:A。GRPO 用同一提示采样的一组回答的均值作为基线、标准差作为归一化标尺。B 没利用组内信息,C 是 PPO 的做法,D 是经典策略梯度的做法。好比一桌菜看的是与平均线的差距,而不是跟外面所有菜比。

Q3. GRPO 在哪个基准任务上被 DeepSeek 成功验证?

单选题 · easy

  • A.数学推理数据集← 正确答案
  • B.图像语义分割
  • C.语音情感识别
  • D.视频目标追踪

答案:A。DeepSeekMath 在 GSM8K 和 MATH 两个数学推理数据集上验证了 GRPO 的效果。B、C、D 都是多模态或非生成式任务,不是 GRPO 的典型验证场景。数学题答案可自动判定,恰好适合组内奖励比较。

Q4. GRPO 目标中的 clip 操作直接限制什么?

单选题 · mid

  • A.奖励信号的上界
  • B.新老策略的概率比← 正确答案
  • C.学习率大小的值
  • D.批大小参数值

答案:B。clip 直接裁剪的是重要性采样比率,即新策略概率与旧策略概率之比,将其限制在 [1-ε, 1+ε] 内。它不作用于奖励、学习率或批大小。这就像限制每位厨师一次改动菜谱的比例,不允许一次推翻所有做法。

Q5. GRPO 相对 PPO 显存节省主要来源于哪里?

单选题 · mid

  • A.冻结底层编码器
  • B.移除价值网络← 正确答案
  • C.改用低精度混合
  • D.引入 LoRA 结构

答案:B。GRPO 不训练价值网络,因此省去了价值网络的参数、优化器状态和激活缓存,这是显存下降的最大来源。A、C、D 属于其他优化技巧,不是 GRPO 本身的机制。好比移除了品鉴管家的工位,整个后厨顿时宽敞了许多。

Q6. 下列哪些属于 GRPO 相对 PPO 的真实差异?

多选题 · mid

  • A.用组内均值代替价值基线← 正确答案
  • B.完全删除所有奖励信号
  • C.用裁剪概率比限制更新幅度← 正确答案
  • D.用参考模型 KL 抑制策略漂移← 正确答案

答案:ACD。A 正确,组内均值是 GRPO 的核心基线;C 正确,裁剪重要性采样比率的机制被 GRPO 保留;D 正确,KL 惩罚约束策略不脱离参考模型。B 错误,GRPO 依然需要奖励信号,删除的是价值网络而非奖励。

Q7. 对同一提示采样 G 条回答的直接目的是什么?

单选题 · mid

  • A.扩大训练批次大小
  • B.构成组内比较的基线← 正确答案
  • C.延长生成序列长度
  • D.简化奖励函数设计

答案:B。G 条回答构成了一个比较组,可以计算组内均值和标准差,从而为每条回答赋予相对优势。批次大小扩大是附带效果但不是目的;C、D 与采样目的无关。就像同一道菜做六份,才能看出哪份明显更好。

Q8. GRPO 中只对 token 序列做重要性采样裁剪、不做状态价值回归,原因是什么?

单选题 · hard

  • A.状态价值回归梯度为零
  • B.组内统计量可充当基线← 正确答案
  • C.生成任务没有任何状态
  • D.裁剪会取消奖励信号

答案:B。GRPO 用组内均值和标准差充当基线,已经能够降低梯度方差,因此不再需要价值网络做状态价值回归。A 没有依据;C 不对,生成过程有隐状态;D 与裁剪机制不符。这是对基线的替代设计,而不是取消基线。

Q9. GRPO 目标函数中包含下列哪些组成部分?

多选题 · hard

  • A.裁剪后的策略损失← 正确答案
  • B.参考模型 KL 惩罚← 正确答案
  • C.价值网络回归损失
  • D.重要性采样概率比← 正确答案

答案:ABD。GRPO 目标包含裁剪后的策略目标(A)、KL 惩罚(B)和重要性采样比率(D)。C 错误,价值网络回归损失属于 PPO 的组成部分,GRPO 已将其移除。三者协同,既保证优化方向又约束策略漂移。

Q10. 若 GRPO 完全撤掉 KL 约束并持续极端更新,最可能发生的结果是什么?

单选题 · extreme

  • A.回复多样性明显提升
  • B.策略逐步偏离参考模型← 正确答案
  • C.价值网络重新开始训练
  • D.奖励坍缩为恒定常数

答案:B。没有 KL 约束,即使每一步都有裁剪,策略也会在多次更新中逐渐漂移,最终远离参考模型、丢失原有语言能力。A 表面看可能发生但并非核心风险;C 与 GRPO 结构无关;D 是奖励设计问题而非 KL 缺失的必然结果。KL 是安全绳,能防止厨师在改良菜谱的路上把基本功全丢了。