Files
ai-agent-book/cursor-chats/20251001_191338_GRPO.md
T
liqiang b119135836
Build latest book artifacts / build (push) Canceled after 0s
dependency resolution / resolve (3.11) (push) Canceled after 0s
dependency resolution / resolve (3.13) (push) Canceled after 0s
deploy-pages / build (push) Canceled after 0s
deploy-pages / deploy (push) Canceled after 0s
i18n consistency check / check (push) Canceled after 0s
provider adoption tests / test (chapter2/context-compression) (push) Canceled after 0s
provider adoption tests / test (chapter2/prompt-injection) (push) Canceled after 0s
provider adoption tests / test (chapter2/system-hint) (push) Canceled after 0s
provider adoption tests / test (chapter3/log-sanitization) (push) Canceled after 0s
web-search-agent tests / test (push) Canceled after 0s
web-search-agent tests / agentbook (push) Canceled after 0s
ai-agent-book 精选快照(<2MB 代码与文档,来自 github.com/bojieli/ai-agent-book)
2026-08-20 13:12:50 +00:00

10 KiB
Raw Blame History

Cursor Chat: ai-agent-book

Metadata

  • Project: ai-agent-book
  • Path: /Users/boj
  • Date: 2025-10-01 19:13:38
  • Session ID: a4490101-0a8d-4c0d-adea-107ea17264f3

Conversation

👤 You

GRPO bash recipe/retool/run_qwen2-32b_dapo.sh After 150 steps, validation metrics:

val-core/aime_2025/acc/mean@30: 0.6 val-aux/num_turns/mean: 10 PPO bash recipe/retool/run_qwen2-32b_ppo.sh After 250 steps, validation metrics:

val-core/aime_2025/acc/mean@30: 0.55 val-aux/num_turns/mean: 8.3

如何解读这一块?结合代码,解释 dapo 和 ppo 的区别


🤖 Cursor Assistant

I'll help you understand these results and explain the differences between DAPO and PPO. Let me first examine the current file and then look at the relevant code.


🤖 Cursor Assistant

根据您提供的实验结果和代码,我来详细解读这些指标并解释 DAPO 和 PPO 的区别。

📊 实验结果解读

GRPO (DAPO)

150 steps后:
- val-core/aime_2025/acc/mean@30: 0.6 (60%准确率)
- val-aux/num_turns/mean: 10 (平均10轮交互)

PPO

250 steps后:
- val-core/aime_2025/acc/mean@30: 0.55 (55%准确率)  
- val-aux/num_turns/mean: 8.3 (平均8.3轮交互)

关键发现

  1. DAPO更高效:仅用150步就达到60%准确率,而PPO用250步才达到55%
  2. DAPO更充分探索:平均10轮交互 vs PPO的8.3轮,说明DAPO模型进行了更深入的推理和工具调用
  3. acc/mean@30:每个问题生成30个候选答案的平均准确率,这是最终性能指标

🔍 DAPO vs PPO 的核心区别

基于代码分析,主要有以下几个关键差异:

1. 优势函数估计方法 (最关键的区别)


🤖 Cursor Assistant

DAPO (使用 GRPO):

# 对同一个问题的多个响应进行分组
# 优势 = (该响应的奖励 - 组平均奖励) / 组标准差
advantage = (reward - group_mean) / group_std

配置:

adv_estimator=grpo  # 不需要critic模型
n_resp_per_prompt=16  # 每个问题生成16个候选答案
train_batch_size=512  # = 32个问题 × 16个响应

PPO (使用 GAE):

# 需要训练一个独立的critic模型来估计价值函数
# 优势 = 实际回报 - critic估计的价值
advantage = GAE(rewards, values, gamma, lambda)

配置:

adv_estimator=gae  # 需要critic模型
gae_gamma=1.0
gae_lam=1.0
critic_warmup=20  # critic需要20步预热
train_batch_size=1024  # 更大的批次

2. 模型架构差异

DAPO:

  • 只有 Actor 模型(策略网络)
  • 不需要 Critic 模型(价值网络)
  • 节省约50%的模型训练开销
  • nnodes=1(单机8卡H200

PPO:

  • 需要 Actor 模型
  • 需要 Critic 模型
  • 需要同时训练两个大模型
  • critic_lr=2e-6critic学习率)
  • critic_warmup=20critic预热步数)
  • nnodes=2(需要2台服务器,16卡)

3. 非对称裁剪机制

DAPO 引入了分离的裁剪参数

# DAPO的核心改进
pg_losses1 = -advantages * ratio
pg_losses2 = -advantages * torch.clamp(ratio, 1 - clip_low, 1 + clip_high)
pg_losses = torch.maximum(pg_losses1, pg_losses2)

配置都是:

clip_ratio_low=0.2   # 下界裁剪
clip_ratio_high=0.28  # 上界裁剪(更宽松)

这允许模型在正向更新时有更大的步长(0.28 vs 0.2),加速学习好的行为。

4. 批次大小和采样效率

维度 DAPO PPO
train_batch_size 512 1024
ppo_mini_batch_size 64 256
n_resp_per_prompt 16 1 (隐式)
序列并行 train_sp=8 train_sp=4

DAPO通过组采样机制更高效地利用样本:同一个问题的16个响应可以相互比较学习。

5. 训练效率对比

从训练脚本看出资源需求:

DAPO:

actor_max_token_len_per_gpu=$(( (max_prompt_length + max_response_length) * 1 ))
log_prob_max_token_len_per_gpu=$(( actor_max_token_len_per_gpu * 4 ))

PPO:

actor_max_token_len_per_gpu=$(( (max_prompt_length + max_response_length) * 2 ))
critic_max_token_len_per_gpu=$(( (max_prompt_length + max_response_length) * 4 ))

PPO需要为critic模型分配额外的显存,且需要两台服务器(16卡)。

🎯 为什么 DAPO 表现更好?

  1. 无需Critic模型的训练开销:GRPO直接使用组内相对比较,避免了critic模型可能的估计误差

  2. 更高效的探索:每个问题生成16个候选答案进行组内比较,提供了更丰富的学习信号

  3. 非对称裁剪:允许对好的行为有更大的更新步长,加速收敛

  4. 样本效率更高:组内16个响应可以相互学习,相当于每个样本的利用率提升16倍

  5. 更深入的推理:结果显示DAPO平均10轮交互 > PPO的8.3轮,说明模型学会了更充分地使用工具进行探索

💡 总结

DAPO的优势

  • 训练速度快(150 steps vs 250 steps
  • 准确率高(60% vs 55%
  • 资源需求低(单机 vs 双机)
  • 无需critic模型
  • 更充分的探索(10轮 vs 8.3轮)

PPO的特点

  • 需要训练critic模型
  • 资源需求更大
  • 训练更慢,但理论上更稳定
  • 适合有密集奖励信号的场景

对于数学推理这类结果导向的任务(只有最终答案的对错反馈),DAPO/GRPO的相对优势估计方法显然更适合,因为它直接优化最终结果的相对质量,而不需要估计中间过程的价值。


👤 You

DAPO和GRPO有什么区别


🤖 Cursor Assistant

根据代码和文档分析,DAPO 实际上是 GRPO 的增强版本。让我详细解释它们的关系和区别:

📊 DAPO vs GRPO 的关系

GRPO (Group Relative Policy Optimization) 是基础算法,由 DeepSeek 提出。

DAPO (Decoupled Clip and Dynamic Sampling Policy Optimization) 是在 GRPO 基础上增加了三个关键改进的算法。

🔍 DAPO 在 GRPO 基础上的三大改进

1. 分离裁剪参数 (Separated Clip Epsilons / Clip-Higher)

GRPO(对称裁剪)

# 标准PPO/GRPO:上下界相同
pg_losses = -advantages * torch.clamp(ratio, 1 - ε, 1 + ε)
# clip_ratio = 0.2,即 [0.8, 1.2]

DAPO(非对称裁剪)

# DAPO:上界更宽松
pg_losses1 = -advantages * ratio
pg_losses2 = -advantages * torch.clamp(ratio, 1 - ε_low, 1 + ε_high)
pg_losses = torch.maximum(pg_losses1, pg_losses2)
# clip_ratio_low = 0.2, clip_ratio_high = 0.28
# 即 [0.8, 1.28]

配置对比

# GRPO
clip_ratio: 0.2  # 上下界都是0.2

# DAPO
clip_ratio_low: 0.2   # 下界
clip_ratio_high: 0.28  # 上界更宽松

影响:允许模型对好的行为(正优势)有更大的更新步长,加速学习。

2. 动态采样与组过滤 (Dynamic Sampling with Group Filtering)

GRPO

  • 固定采样:每个问题生成 n 个响应
  • 所有组都用于训练

DAPO

data:
  gen_batch_size: 1536      # 生成批次大小
  train_batch_size: 512     # 训练批次大小
algorithm:
  filter_groups:
    enable: True
    metric: acc              # 按准确率过滤
    max_num_gen_batches: 10  # 最多生成10批

工作原理

# DAPO会过滤掉"无信息"的组
# 例如:一个问题的16个响应全对或全错 → 过滤掉
# 只保留有区分度的组(有对有错的)进行训练

优势

  • 提高样本质量,避免在无信息样本上浪费计算
  • 动态调整采样直到收集到足够的高质量样本
  • 在您的实验中,DAPO可能生成了更多样本但只用了最有价值的512个

3. Token级别损失聚合 (Token-level Loss Aggregation)

GRPO(序列级别)

# 原始GRPOseq-mean-token-mean
seq_losses = torch.sum(loss_mat * loss_mask, dim=-1) / torch.sum(loss_mask, dim=-1)
loss = torch.mean(seq_losses)  # 每个序列的平均损失再平均

DAPOToken级别)

# DAPO推荐:token-mean
loss = verl_F.masked_mean(loss_mat, loss_mask)  # 直接对所有token平均

配置

actor_rollout_ref:
  actor:
    loss_agg_mode: "token-mean"  # DAPO默认
    # vs "seq-mean-token-mean"  # 原始GRPO

优势

  • 对长序列更稳定(数学推理中常见超长CoT)
  • 避免短序列主导梯度
  • 更细粒度的学习信号

4. 超长响应惩罚 (Overlong Reward Shaping)

DAPO额外增加

data:
  max_response_length: 20480  # 16384 + 4096
reward_model:
  overlong_buffer:
    enable: True
    len: 4096
    penalty_factor: 1.0
# 对接近上限的超长响应线性惩罚
if length > expected_len:
    penalty = min(-exceed_len / buffer_len * factor, 0)
    reward += penalty

目的:鼓励模型生成简洁有效的推理,避免冗长无效的探索。

📈 性能对比

根据论文和您的实验结果:

算法 AIME 2024准确率 训练步数 关键改进
GRPO (DeepSeek-R1-Zero) ~40% ~800 steps 组相对优势
DAPO (完整版) 52% 400 steps 全部三个改进
DAPO (无动态采样) 50% 400 steps 改进1+3
DAPO (早期版本) 44% 400 steps 仅改进1
您的实验 (DAPO) 60% 150 steps ReTool场景

🎯 为什么 DAPO 优于 GRPO

  1. 更激进的正向更新Clip-Higher

    • GRPO:好行为最多增强 20%
    • DAPO:好行为最多增强 28%
    • 加速收敛
  2. 更高质量的训练样本Dynamic Sampling

    • GRPO:使用所有采样
    • DAPO:只用有区分度的样本
    • 提高样本效率
  3. 更稳定的长序列训练Token-level Loss

    • GRPO:序列级损失在长CoT时不稳定
    • DAPOToken级损失更平滑
    • 特别适合数学推理

📝 实际使用建议

选择 GRPO

  • 标准的RL任务
  • 序列长度相对均匀
  • 想要更保守的训练

选择 DAPO

  • 数学推理/长思维链任务
  • 需要快速收敛
  • 有资源进行动态采样
  • 序列长度差异大

💡 总结

DAPO = GRPO + 三大改进

  1. 🎯 非对称裁剪:加速学习好的行为
  2. 🔍 动态采样过滤:提高样本质量
  3. 📊 Token级损失:稳定长序列训练

在您的 ReTool 实验中,DAPO 在 150 步达到 60% 准确率,显著优于标准方法,正是这些改进共同作用的结果。DAPO 论文声称用 50% 的训练步数超越了 DeepSeek-R1-Zero(基于GRPO),您的实验结果也验证了这一点!


Exported from Cursor View