简介:本文深入解析DeepSeek-R1训练中使用的GRPO奖励函数公式,从数学原理、参数设计到实际优化策略,结合代码示例揭示其如何提升模型决策质量,为开发者提供可复用的强化学习训练框架。
在强化学习(RL)领域,奖励函数的设计直接决定了模型的训练方向与最终性能。DeepSeek-R1作为一款基于深度强化学习的高性能模型,其训练过程中采用的GRPO(Grouped Relative Policy Optimization)奖励函数通过创新的相对优势计算机制,显著提升了策略优化的效率与稳定性。本文将从数学公式、参数设计、优化策略三个维度展开详细解析,并结合代码示例说明其在实际训练中的应用。
GRPO的核心思想是通过比较不同策略组(Group)的相对表现来计算奖励值,其基础公式可表示为:
[ R(s,a) = \alpha \cdot \text{Adv}(s,a) + \beta \cdot \text{GroupAdv}(s,a) ]
其中:
GRPO的创新点在于通过分组策略计算相对优势。假设将策略网络划分为 ( K ) 个组(如按参数初始化或训练阶段分组),则组内相对优势定义为:
[ \text{GroupAdv}k(s,a) = \frac{1}{|G_k|-1} \sum{a’ \in G_k \setminus {a}} \left[ Q(s,a) - Q(s,a’) \right] ]
其中 ( Q(s,a) ) 为动作价值函数,( G_k ) 为第 ( k ) 个策略组的动作集合。此公式通过比较当前动作与组内其他动作的预期回报,消除绝对奖励尺度的影响,增强训练稳定性。
DeepSeek-R1采用双分支策略网络:
class GRPOActor(nn.Module):def __init__(self, state_dim, action_dim, group_num=4):super().__init__()self.shared_encoder = nn.Sequential(nn.Linear(state_dim, 256), nn.ReLU())self.group_heads = nn.ModuleList([nn.Linear(256, action_dim) for _ in range(group_num)])def forward(self, state):feat = self.shared_encoder(state)return [head(feat) for head in self.group_heads] # 返回各组的动作分布
此结构允许不同组独立学习策略,同时共享底层特征提取器。
GRPO的损失函数由三部分组成:
[ \mathcal{L} = \mathcal{L}{\text{policy}} + \lambda_1 \mathcal{L}{\text{entropy}} + \lambda2 \mathcal{L}{\text{group}} ]
其中:
| 参数 | 推荐范围 | 调整策略 |
|---|---|---|
| ( \alpha ) | 0.3-0.7 | 初期设0.5,每10万步线性增加至0.8 |
| ( \beta ) | 0.5-1.2 | 与( \alpha )保持反比关系 |
| 组数 ( K ) | 3-8 | 任务复杂度越高,组数应越多 |
| 归一化阈值 | ±2.0 | 超过阈值的优势值截断 |
问题1:组内优势计算导致方差过大
解决:引入滑动平均机制,对历史组优势进行指数加权平均。
问题2:动态分组后策略震荡
解决:添加分组稳定性惩罚项,限制相邻epoch的分组变化幅度。
问题3:稀疏奖励场景下收敛慢
解决:结合课程学习,先在简单任务上预训练分组策略。
以下为PyTorch风格的GRPO奖励计算核心代码:
def compute_grpo_rewards(states, actions, rewards, groups, alpha=0.5, beta=0.8):# 计算个体优势(假设已实现GAE)adv = compute_gae(states, actions, rewards)# 计算组内相对优势group_advs = []for k in range(max(groups)+1):group_mask = (groups == k)group_actions = actions[group_mask]group_q = [predict_q(s,a) for s,a in zip(states[group_mask], group_actions)]# 计算每对动作的差值diffs = []for i in range(len(group_q)):pair_diffs = [group_q[i] - group_q[j] for j in range(len(group_q)) if j != i]diffs.append(np.mean(pair_diffs))# 归一化diffs = (diffs - np.mean(diffs)) / (np.std(diffs) + 1e-8)group_advs.extend(diffs)# 合并奖励group_advs = torch.tensor(group_advs)adv = torch.tensor(adv)return alpha * adv + beta * group_advs
在需要同时优化多个子目标的场景(如机器人控制中的速度与能耗平衡),可将不同子目标分配给不同策略组,通过GRPO实现自动权衡。
GRPO天然适合分布式架构,不同工作节点可独立训练策略组,仅需定期同步全局优势估计,通信开销比传统PPO降低40%。
通过将历史数据划分为多个策略组(按行为策略分类),GRPO可在无环境交互的情况下优化策略,实验表明其离线学习性能优于BCQ等基准方法。
GRPO奖励函数通过引入策略组相对优势机制,有效解决了传统强化学习中奖励尺度敏感、探索效率低等痛点。DeepSeek-R1的实践表明,合理设计的分组策略与动态权重调整可使训练速度提升30%以上,同时策略鲁棒性显著增强。未来研究方向包括:1)自适应分组算法;2)与元学习结合的动态奖励设计;3)在连续控制任务中的扩展应用。对于开发者而言,掌握GRPO的核心思想后,可灵活调整分组策略与奖励组合方式,适配不同场景的需求。”