字节、清华AIR开源DAPO——学习笔记
超越DeepSeek GRPO的关键RL算法,字节、清华AIR开源DAPO
https://zhuanlan.zhihu.com/p/31157035727
备注:知乎这篇更全一点
近日,清华 AIR 和字节联合 SIA Lab 发布了他们的第一项研究成果:DAPO,即 Decoupled Clip and Dynamic sAmpling Policy Optimization(解耦剪辑和动态采样策略优化)。这是一个可实现大规模 LLM 强化学习的开源 SOTA 系统。此外,使用该算法训练的模型也将在近期开源发布。
项目页面:https://dapo-sia.github.io/
论文地址:https://dapo-sia.github.io/static/pdf/dapo_paper.pdf
代码地址:https://github.com/volcengine/verl/tree/gm-tyx/puffin/main/recipe/dapo
数据:https://huggingface.co/datasets/BytedTsinghua-SIA/DAPO-Math-17k
使用该算法,该团队成功让 Qwen2.5-32B 模型在 AIME 2024 基准上获得了 50 分,优于同等规模的 DeepSeek-R1-Zero-Qwen-32B,同时 DAPO 版 Qwen2.5-32B 使用的训练步数还少 50%。
生版 GRPO 面临着几大关键问题,比如熵崩溃、奖励噪音和训练不稳定。事实上,该团队表示,很多研究团队在复现 DeepSeek 的结果时也遇到了类似的难题。他们表示:「这表明 R1 论文中可能省略了开发工业级、大规模且可重现的强化学习系统所需的关键训练细节。」
Allen AI 研究者 Nathan Lambert 总结了 DAPO 对 GRPO 的改进,包括两个不同的裁剪超参数、动态采样、token 层面的策略梯度损失、过长奖励塑造
PPO和GRPO对比:
- PPO 引入了裁剪式替代目标(clipped surrogate objective)来执行策略优化。通过使用裁剪将策略更新限制在先前策略的近端区域内,PPO 可以让训练稳定并提高样本效率
- 与 PPO 相比,GRPO 消除了价值函数并以群组相关的方式来估计优势
- 与 PPO 类似,GRPO 也采用了裁剪目标,同时还有一个直接添加的 KL 惩罚项
DAPO改进点:
- 在训练长 CoT 推理模型时,模型分布可能会与初始模型有显著差异,因此这种限制是不必要的。因此,在 DAPO 中,KL 项被排除在外。
- 抬高天花板:Clip-Higher,他们发现,上限剪辑阈值确实限制了低概率 token 的概率增长,从而可能限制了系统的多样性。根据 Clip-Higher 策略,研究者将较低和较高的剪辑范围解耦为 ε_low 和 ε_high:研究者增加了 ε_high 的值,以便为低概率 token 的增加留出更多空间。如图 2 所示,这一调整有效地提高了策略的熵,有利于生成更多样化的样本。研究者选择将 ε_low 保持在相对较小的范围内,因为增大 ε_low 会将这些 token 的概率压制为 0,从而导致采样空间的崩溃。
- 越多越好:动态采样。当某些提示的准确度等于 1 时,现有的 RL 算法就会出现梯度递减问题。根据经验,准确率等于 1 的样本数量会继续增加,如图 3b 所示。这意味着每批样本中的有效提示次数会不断减少,从而导致梯度方差增大,抑制了模型训练的梯度信号。在训练之前不断采样,直到批次中全部都是准确率既不等于 0 也不等于 1 的样本。如何采样?,在动态采样的情况下,实验能更快地实现相同的性能。
- Rebalancing Act:Token 级策略梯度损失。由于所有样本在损失计算中的权重相同,因此长回复中的 token 对总体损失的贡献可能会不成比例地降低,这可能会导致两种不利影响。
首先,对于高质量的长样本来说,这种影响会阻碍模型学习其中与推理相关的模式的能力。其次,过长的样本往往表现出低质量的模式,如胡言乱语和重复词语。
如图 4a 和图 4b 所示,样本级损失计算由于无法有效惩罚长样本中的不良模式,会导致熵和响应长度的不健康增长。
- 捉迷藏:过长的奖励塑造
为了研究奖励噪声的影响,研究者首先应用了超长过滤策略,以掩盖截断样本的损失。如图 5 所示,这种方法大大稳定了训练并提高了性能。
此外,他们还提出了「Soft Overlong Punishment」(等式 13),这是一种长度感知惩罚机制,旨在塑造截断样本的奖励。具体来说,当响应长度超过预定义的最大值时,研究者会定义一个惩罚区间。在这个区间内,响应越长,受到的惩罚就越大。这种惩罚会添加到基于规则的原始正确性奖励中,从而向模型发出信号,避免过长的响应
至于 token 级损失,虽然它带来的性能提升较少,但该团队发现它可增强训练稳定性并使长度增加得更健康。
代码实现:
可以通过readme中的部分代码在verl找对应实现,和trl不同,这是通过配置来定义的