GRPO(Group Relative Policy Optimization)是一种创新的强化学习算法,它通过组内相对优势计算消除了对独立价值函数模型的需求。这个算法最吸引我的地方在于其简洁而高效的设计理念——让模型通过自主探索发现解决方案,而不是简单模仿专家轨迹。
GRPO的核心创新点在于其优势计算方式。传统PPO算法需要维护一个独立的价值函数网络来估计状态价值,而GRPO则采用了一种更直接的方法:
这种设计带来了几个显著优势:
实际实现中发现,组大小(group_size)的选择对训练稳定性影响很大。过小的组(如4个)会导致优势估计噪声过大,而过大(如16个)则显著增加计算成本。经过多次试验,8个候选输出的组大小在稳定性和效率之间取得了最佳平衡。
GRPO的策略更新遵循以下关键方程:
code复制L(θ) = E[min(r(θ)A, clip(r(θ),1-ε,1+ε)A)]
其中:
r(θ) = π_θ(a|s) / π_ref(a|s)
A = (R - μ_group) / σ_group
这个损失函数结合了两种关键思想:
在实现过程中,我特别注意了梯度计算的两个技术细节:
GRPO的训练循环采用嵌套结构设计,这是整个系统高效运行的关键:
外层循环(rollout阶段):
内层循环(优化阶段):
python复制# 伪代码示例:核心训练循环
for grpo_step in range(total_steps):
# 外层循环
prompts = sample_math_problems(batch_size)
rollouts = vLLM_generate(prompts, group_size=8)
rewards = compute_math_rewards(rollouts)
advantages = normalize_within_groups(rewards)
# 内层循环
for microbatch in split_rollouts(rollouts, microbatches):
loss = compute_grpo_loss(microbatch, advantages)
loss.backward()
optimizer.step()
optimizer.zero_grad()
在24GB显存的RTX 4090上运行完整训练需要一系列内存优化技巧:
梯度检查点技术:
gradient_checkpointing_enable()vLLM睡眠模式:
8-bit优化器:
微批次处理:
在数学推理任务中,学习率的选择尤为关键。我进行了对数空间扫描(1e-6到1e-4),发现:
| 学习率 | 最终准确率 | 训练行为 |
|---|---|---|
| 1e-6 | 0.12 | 几乎无学习 |
| 3e-6 | 0.25 | 学习缓慢 |
| 1e-5 | 0.58 | 稳定提升 |
| 3e-5 | 0.75 | 最佳平衡 |
| 1e-4 | 0.01 | 策略崩溃 |
策略崩溃现象表现为:输出长度突然暴增或锐减,token熵值趋近于零。这种情况下一旦发生,模型几乎无法自行恢复,必须重启训练。
对比实验清晰地展示了基线减除的价值:
| 配置 | 峰值准确率 | 输出长度稳定性 |
|---|---|---|
| 无基线 | 0.52 | 后期崩溃 |
| 组均值基线 | 0.75 | 保持稳定 |
基线减除不仅提高了最终性能,更重要的是防止了策略崩溃。没有基线的REINFORCE梯度表现出:
针对损失归一化的三种方式进行了系统对比:
| 方法 | 计算方式 | 梯度范数 | 最终性能 |
|---|---|---|---|
| 均值 | /seq_len | 较高 | 0.75 |
| 常量 | /1024 | 较低 | 0.73 |
| 微批次 | /max_len_in_mb | 中等 | 0.74 |
虽然最终准确率差异不大,但梯度范数的差异意味着:
全量评估(5000+验证样本)在每次迭代时进行不现实,我采用了:
采用OmegaConf实现可复现的实验管理:
yaml复制# 示例配置
defaults:
- base_config
- _self_
train:
batch_size: 256
micro_batch_size: 1
group_size: 8
lr: 3e-5
model:
name: Qwen2.5-Math-1.5B
use_flash_attention: true
logging:
wandb_project: grpo-math
eval_subset_size: 1024
这种结构允许通过简单的YAML覆写启动消融实验:
bash复制python train.py +exp=lr_ablation lr=1e-4
在长时间训练中,这三个信号最能预示训练健康状态:
Token熵值:
梯度范数:
输出长度比率:
通过分析不同训练阶段的生成样本,观察到了清晰的阶段转变:
随机阶段(0-20步):
模式发现(20-50步):
结构化输出(50-100步):
优化阶段(100+步):
在多次训练运行中,观察到了几种典型故障:
长度崩溃:
重复循环:
符号混淆:
从RTX 4090迁移到H100的优化策略:
微批次调整:
并行化策略:
算子优化:
基于当前实验结果,最有潜力的改进方向:
动态组大小:
课程学习:
混合训练:
在实际操作中,我发现GRPO对超参数的选择比传统监督学习敏感得多。一个特别有用的技巧是在正式训练前,用极小的组大小(如2)和极小批次(如8)快速运行几个步骤,这能帮助快速发现配置中的明显问题,而成本仅为完整训练的1%左右。