论文地址 https://arxiv.org/abs/2503.14476

参考实验:DAPO + vLLM v1 + VeRL —— VOC性能比较

Motivation

没有完整的GRPO训练R1-32B的框架

目标:

  • 降低错误样本的长度 (token-level loss)
  • 训练更加稳定 (overlong filter)
  • 避免generation entropy的塌陷(higher clip)
  • 提高训练效率(dynamic sample)

Method

整体优化目标如下

\[\mathcal{J} = \mathbb{E}_{(q,a)\sim \mathcal{D}, \{o_i\}_{i=1}^G\sim \pi_{old}(\cdot|q)} [\frac{1}{\sum_{i=1}^G|o_i|}\sum_{i=1}^G\sum_{t=1}^{|o_i|}\min(r_{i,t}(\theta)A_{i, t}, clip(r_{i,t}(\theta),1-\epsilon_{low}, 1+\epsilon_{high})A_{i,t})]\\
s.t.\ 0<|\{o_i|is\_equivalent(o_i,a)\}|<G
\]

其中

\[r_{i,t}(\theta)=\frac{\pi_{\theta}(o_{i,t}|q,o_{i,<t})}{\pi_{old}(o_{i,t}|q,o_{i,<t})}, A_{i,t} = \frac{R_i-mean(\{R_i\}_{i=1}^G)}{std(\{R_i\}_{i=1}^G)}
\]

这里DAPO剔除了KL散度惩罚项,它认为

在RLHF场景下,RL的目标是在不偏离原是模型分布下对齐人类偏好(即仅学习人类偏好,而不改变模型原有知识能力),因此需要添加KL惩罚项。

然而在训练long-cot的reasoning模型时,其目标是为了提升模型的能力(math、推理、code等)训练前后的模型分布可以是显著不一样的,KL惩罚项可能会限制模型的探索新知识的能力,因此去除。

分为以下四个方面

1. Raise the Ceiling: Clip-Higher

考虑到clip的是一个概率的比值\(\frac{\pi_{\theta}}{\pi_{old}}\),在\(\pi_{old}\)不同的情况下,会影响clip的范围

例如 \(\pi_{old}=0.1, \pi_{\theta}=0.2\), 此时比值为\(2\),此时policy会认为模型前后变化过大,而不训练此数据。但这条数据是值得训练的,只是old的概率比较小。

虽然比值是2倍,但其实数值上只多了0.1,因此还是需要被训练的,并没有影响收敛。

同时,实验也验证了上面发现的问题。实验发现GRPO中 被clip掉的token的平均概率的最大值均小于0.2 ,即

\[\max_{step}[\mathbb{E}_{(q,a)\sim \mathcal{D}, \{o_i\}_{i=1}^G\sim \pi_{old}(\cdot|q),t\sim |o_i|}\pi_{\theta}(o_{i,t}|q,o_{i,<t})]<0.2
\]

大量小概率的token被clip掉了,这验证了\(\epsilon_{high}\)阻碍了低概率token 概率的增长。

因此可以提高上限\(\epsilon_{high}\)来提高A>0的低概率token的概率,从而避免entropy变小的过快,输出单一化。

值得注意的现象,提高\(\epsilon_{higher}\)之后:

  • RL的avg@32更高的
  • 避免了熵塌的现象(因为高的\(\epsilon_{higher}\)鼓励模型探索原先小概率的正向轨迹,提高了多样性)

此外,old模型小概率sample并没有影响原有\(\epsilon_{low}\)

这是因为,\(\epsilon_{low}\)是在A<0的sample起作用,若重要性采样的比值很大,并不会对A<0的token进行裁剪。

2. The More the Merrier: Dynamic Sampling

考虑到如果一个sample的G个rollout的奖励

\(\{R_i\}_{i=1}^G\)都是0或都是1,那么所有的优势A都是0,这并不会更新policy,会导致效率低下

因此使用动态采样的方法,一直采样直到一个sample的G个rollout的R 不全是0 或不全是1.

\[0<|\{o_i|is\_equivalent(o_i,a)\}|<G
\]

上述公示的含义是,对于QA对\((q,a)\),\(o_i\)和答案\(a\)相同的个数在\((0,G)\)的区间内。

3. Rebalancing Act: Token-Level Policy Gradient Loss

DAPO任务 sample-level的loss(每个rollout的贡献度是一样的),然后不同rollout的长度不一样,过长的样本对模型的影响更大一些

  • 过长的样本会导致模型难以学习推理模式 【置信度低,困惑度高】
  • 过长的样本中存在一些不必要的 重复的话【长度增长过快】

因此使用token-level的技术,长度越大的rollout,贡献度越大。

通过grpo sample-level loss得知,grpo并不在意response的长短(不同长度的sample的贡献度均为相同),然而长度越长A越大,因此response的长度会快速的增加。

但是DAPO认为长度越长的sample的贡献度越大,因此过长的sample是对的会重点强化(提高概率),但是错了的话,会重点惩罚,从而减小错的长response的概率,即

\(P(len(o_i)>\delta|A<0)\)下降。

同时,通过实验发现,DAPO的response的平均长度并没有无脑、快速增长。

Hide and Seek: Overlong Reward Shaping

考虑到过长的response会被截断无法得到结果,这会导致奖励极低,

因此采用mask的方式,在训练的时候过滤掉过长response的损失。

实验发现,添加overlong filter之后,训练更加稳定(entropy,acc上),避免了noise。

DAPO进一步提出了soft overlong punishment,其实是基于长度的奖励,就不用进行filter操作了,直接赋予低的R就可以了,有利于降低response的长度。添加了一个cache的缓冲区,从而soft。

\[R(y) = \begin{cases}
0, &|y|\leq L_{max}-L_{cache}\\
-\frac{|y|-(L_{max}-L_{cache})}{L_{cache}}, &L_{max}-L_{cache}<|y|\leq L_{max}\\
-1, &L_{max}<|y|
\end{cases}
\]

代码解析待更新(verl实现dapo部分)

DAPO浅析的更多相关文章

  1. SQL Server on Linux 理由浅析

    SQL Server on Linux 理由浅析 今天的爆炸性新闻<SQL Server on Linux>基本上在各大科技媒体上刷屏了 大家看到这个新闻都觉得非常震精,而美股,今天微软开 ...

  2. 【深入浅出jQuery】源码浅析--整体架构

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  3. 高性能IO模型浅析

    高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking  ...

  4. netty5 HTTP协议栈浅析与实践

      一.说在前面的话 前段时间,工作上需要做一个针对视频质量的统计分析系统,各端(PC端.移动端和 WEB端)将视频质量数据放在一个 HTTP 请求中上报到服务器,服务器对数据进行解析.分拣后从不同的 ...

  5. Jvm 内存浅析 及 GC个人学习总结

    从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C ...

  6. 从源码浅析MVC的MvcRouteHandler、MvcHandler和MvcHttpHandler

    熟悉WebForm开发的朋友一定都知道,Page类必须实现一个接口,就是IHttpHandler.HttpHandler是一个HTTP请求的真正处理中心,在HttpHandler容器中,ASP.NET ...

  7. 【深入浅出jQuery】源码浅析2--奇技淫巧

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  8. 浅析匿名函数、lambda表达式、闭包(closure)区别与作用

    浅析匿名函数.lambda表达式.闭包(closure)区别与作用 所有的主流编程语言都对函数式编程有支持,比如c++11.python和java中有lambda表达式.lua和JavaScript中 ...

  9. word-break|overflow-wrap|word-wrap——CSS英文断句浅析

    ---恢复内容开始--- word-break|overflow-wrap|word-wrap--CSS英文断句浅析 一 问题引入 今天在再次学习 overflow 属性的时候,查看效果时,看到如下结 ...

  10. 编写轻量ajax组件02-AjaxPro浅析

    前言 上一篇介绍了在webform平台实现ajax的一些方式,并且实现一个基类.这一篇我们来看一个开源的组件:ajaxpro.虽然这是一个比较老的组件,不过实现思想和源码还是值得我们学习的.通过上一篇 ...

随机推荐

  1. babylon.js 学习笔记(7)

    前面我们学习了如何画一堆房子(如下图),显然这单调的绿色大地,看上去效果并不好. babylon.js中,可以用图片模拟出地势高低不同的效果,比如下面这张图片: 颜色越深的地方,表示地势越低(即:盆地 ...

  2. Win10正式版如何查看电脑Wifi密码的问题

    一些电脑基地的用户,说从Win10正式版计算机中如何提取已经保存的Wi-Fi密码?其实,这个还是很简单的,下面,技术员小编就来分享具体的提取方法. 在 Windows 10 中,查看已保存的 Wi-F ...

  3. unity接入steam sdk 相关事宜

    https://blog.csdn.net/HG2131/article/details/123824592

  4. Linux系列之学会使用Top命令

    top命令可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具,TOP命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,有点像win ...

  5. win 常用命令

    ipconfig 用法: ipconfig [/allcompartments] [/? | /all | /renew [adapter] | /release [adapter] | /renew ...

  6. js在循环遍历数组中删除指定元素踩坑( foreach.. for.. for..in.. )

    1.forEach [1]例子:循环arr数组,将item为1的元素从数组中删除 let arr = [1, 1, 2] arr.forEach((item, index, arr) => { ...

  7. 【QML image】如何添加图片到项目资源中

    1. 借助Qt 的资源系统 1.新建Qt项目 2.把所有图片放在一个文件夹中,将文件夹放在Qt项目目录下 3.选中项目--Add New--Qt--Qt Resource File--choose 4 ...

  8. VPS 上安装 Nginx 就是这么简单

    以下内容仅适用于 Centos 操作系统 一.将系统的软件包更新到最新版本 yum -y update 二.安装 Nginx yum install nginx 三.启动 Nginx,并设置开机启动 ...

  9. .Net NativeAOT另外一种选择-bflat

    https://www.qiufengblog.com/articles/dotnet-native-bflat.html 前言 说起bflat,还得先说NativeAOT,在.Net 7时,正式把N ...

  10. mysql binary like_MYSQL的binary解决mysql数据大小写敏感问题的方法

    1.在create的时候就使用binary,而不是在query的时候加. username varchar(30) BINARY NOT NULL default '', 如果表已经建好了,使用: a ...