# GRPO(Group Relative Policy Optimization)理解 **GRPO的核心思想可以简要理解为Grouped PPO。** 也就是说,对同一个问题$q$, 一次性采样一组($G$ 个)完整回答,用组内相对优势(而不是 value baseline)来做 PPO-style 的 token 级策略更新,同时用KL正则把策略约束在参考模型附近。 这里的Group指的就是分组;Relative指的就是组内相对优势。 ![](../assets/RL/grpo/GRPO_demo.png) 接下来,我想根据GRPO中涉及到的公式,和对应的伪代码,深入理解一下GRPO里面的细节;如果你对公式不感兴趣,那么可以直接跳过公式回顾和深入理解的部分。 ## 公式回顾 原文中公式如下: $$ \begin{aligned} \mathcal{J}_{G R P O}(\theta) & =\mathbb{E}_{\left[q \sim P(Q),\left\{o_i\right\}_{i=1}^G \sim \pi_{\theta_{o l d}}(O \mid q)\right]} \\ & \frac{1}{G} \sum_{i=1}^G \frac{1}{\left|o_i\right|} \sum_{t=1}^{\left|o_i\right|}\left\{\min \left[\frac{\pi_\theta\left(o_{i, t} \mid q, o_{i, 注:在实际训练中,为了兼容基于梯度下降的优化框架,通常做法是最小化其负值,即定义: > > $$\mathcal{L}_{\text{GRPO}}(\theta) = -\mathcal{J}_{\text{GRPO}}(\theta)$$ > > 并对 $\mathcal{L}_{\text{GRPO}}(\theta)$ 执行梯度下降。 ## 深入理解 ### 1. 最外层期望(Expectation):在什么分布上进行优化? $$ \mathbb{E}_{[q \sim P(Q), \{o_i\}_{i=1}^G \sim \pi_{\theta_{\text{old}}}(o|q)]} $$ 其中, $q$表示一个 prompt(问题),从数据分布 $P(Q)$ 中采样, $P(Q)$包含了不同类型的prompt,例如医学问题,VQA、报告生成等; $\{o_i\}_{i=1}^G$表示对同一个 $q$,用旧策略 $\pi_{\theta_{\text{old}}}$ 生成的 **G 个输出(completions)**. 也就是说:**对每个 prompt,我们并行生成 G 个回答,然后基于这些回答做优化**. 这就是 GRPO 的"组内对比"思想. 进一步理解,这个期望可以表示:"如果我们从真实 prompt 分布中随机挑一个 $q$,再用旧策略对它生成 $G$ 个随机回答,然后计算 GRPO loss,那么这个 loss 的平均值是多少?",而我们的目标是:通过调整 $\theta$(当前策略),让这个期望 loss 尽可能小。" > 这里我们通过监督学习来做个类比,监督学习的目标函数如下: > > $$\mathcal{L}(\theta) = \mathbb{E}_{(x, y) \sim \mathcal{D}} \left[ \text{CrossEntropy}(f_\theta(x), y) \right]$$ > > 其中$\mathcal{D}$表示训练数据分布,$(x, y)$表示一条样本(如图像+标签),CrossEntropy表示对这条样本计算的 loss。那么这个公式的整体含义可以表示为:在所有可能的数据上,模型预测的平均交叉熵损失。 > > 但我们无法计算真实期望(因为 $\mathcal{D}$ 未知),所以用 **Monte Carlo 估计**(即 mini-batch): > > $$\hat{\mathcal{L}}(\theta) \approx \frac{1}{N} \sum_{i=1}^N \text{CrossEntropy}(f_\theta(x_i), y_i)$$ > > 也就是说,`期望 = 理论目标,求和 = 实际近似`。回到 GRPO,完全一样的逻辑,对应关系如下: > > | 监督学习 | GRPO | > |--------|------| > | 数据分布 $\mathcal{D}$ | Prompt 分布 $P(Q)$ + 旧策略生成分布 $\pi_{\theta_{\text{old}}}$ | > | 一条样本 $(x, y)$ | 一组数据 $(q, o_1, ..., o_G)$ | > | Loss 函数(如 CE) | PPO-style clipped objective + KL penalty | > | 期望 $\mathbb{E}_{(x,y)\sim\mathcal{D}}[\text{loss}]$ | $\mathbb{E}_{q, \{o_i\}}[\text{GRPO loss}]$ | ### 2. 分组平均 && Token平均:保持梯度稳定的同时拉齐不同序列长度的贡献 从下面的公式,可以看到这里有两层平均,外层平均表示对一个prompt产生的分组内部loss做平均,避免$G$变大导致梯度爆炸;内层对token再平均,使得不同长度的回答被归一化到相同的尺度,防止模型生成更长的token来刷reward。 $$ \frac{1}{G} \sum_{i=1}^G \frac{1}{|o_i|} \sum_{t=1}^{|o_i|} \left\{ \cdots \right\} $$ 具体地,对于每个 output $o_i$:计算其每个 token $t$ 对应的 loss,其中$|o_i|$表示$o_i$的序列长度; 然后对所有 token 取平均($\frac{1}{|o_i|}$); 再对所有 G 个 output 取平均($\frac{1}{G}$)。 ### 3. PPO-style Clipped Objective 接下来我们看一下大括号内部,实际上是新旧策略之间的token级重要性采样比(Importance Sampling Ration, ISR)和优势值(Advantage)的乘积,具体地: $$ \min \left[ \frac{\pi_\theta(o_{i,t}|q, o_{i,