DAPO浅析
<p>论文地址 https://arxiv.org/abs/2503.14476</p><p>参考实验:DAPO + vLLM v1 + VeRL —— VOC性能比较</p>
<h2 id="motivation">Motivation</h2>
<p>没有完整的GRPO训练R1-32B的框架</p>
<p>目标:</p>
<ul>
<li>降低错误样本的长度 (token-level loss)</li>
<li>训练更加稳定 (overlong filter)</li>
<li>避免generation entropy的塌陷(higher clip)</li>
<li>提高训练效率(dynamic sample)</li>
</ul>
<h2 id="method">Method</h2>
<p>整体优化目标如下</p>
<p></p><div class="math display">\[\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
\]</div><p></p><p>其中</p>
<p></p><div class="math display">\[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)}
\]</div><p></p><p>这里DAPO剔除了KL散度惩罚项,它认为</p>
<p>在RLHF场景下,RL的目标是在不偏离原是模型分布下对齐人类偏好(即<strong>仅学习人类偏好,而不改变模型原有知识能力</strong>),因此需要添加KL惩罚项。</p>
<p>然而在训练long-cot的reasoning模型时,其目标是为了提升模型的能力(math、推理、code等)训练前后的模型分布可以是显著不一样的,<strong>KL惩罚项可能会限制模型的探索新知识的能力</strong>,因此去除。</p>
<p>分为以下四个方面</p>
<h3 id="1-raise-the-ceiling-clip-higher">1. Raise the Ceiling: Clip-Higher</h3>
<p>考虑到clip的是一个概率的比值<span class="math inline">\(\frac{\pi_{\theta}}{\pi_{old}}\)</span>,在<span class="math inline">\(\pi_{old}\)</span>不同的情况下,会影响clip的范围</p>
<p>例如 <span class="math inline">\(\pi_{old}=0.1, \pi_{\theta}=0.2\)</span>, 此时比值为<span class="math inline">\(2\)</span>,此时policy会认为模型前后变化过大,而不训练此数据。但这条数据是值得训练的,只是old的概率比较小。</p>
<p>虽然比值是2倍,但其实数值上只多了0.1,因此还是需要被训练的,并没有影响收敛。</p>
<p>同时,实验也验证了上面发现的问题。实验发现GRPO中 被clip掉的token的平均概率的最大值均小于0.2 ,即</p>
<p></p><div class="math display">\[\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
\]</div><p></p><p><img src="https://p.ipic.vip/rtygzg.png" alt="image-20251018164023025" loading="lazy"></p>
<p>大量小概率的token被clip掉了,这验证了<span class="math inline">\(\epsilon_{high}\)</span>阻碍了低概率token 概率的增长。</p>
<p>因此可以提高上限<span class="math inline">\(\epsilon_{high}\)</span>来提高A>0的低概率token的概率,从而避免entropy变小的过快,输出单一化。</p>
<p><img src="https://p.ipic.vip/rohuuf.png" alt="image-20251018153934403" loading="lazy"></p>
<p>值得注意的现象,提高<span class="math inline">\(\epsilon_{higher}\)</span>之后:</p>
<ul>
<li>RL的avg@32更高的</li>
<li>避免了<strong>熵塌的现象</strong>(因为高的<span class="math inline">\(\epsilon_{higher}\)</span>鼓励模型探索原先小概率的正向轨迹,提高了多样性)</li>
</ul>
<p>此外,old模型小概率sample并没有影响原有<span class="math inline">\(\epsilon_{low}\)</span><br>
这是因为,<span class="math inline">\(\epsilon_{low}\)</span>是在A<0的sample起作用,<strong>若重要性采样的比值很大,并不会对A<0的token进行裁剪。</strong></p>
<h3 id="2-the-more-the-merrier-dynamic-sampling">2. The More the Merrier: Dynamic Sampling</h3>
<p>考虑到如果一个sample的G个rollout的奖励</p>
<p><span class="math inline">\(\{R_i\}_{i=1}^G\)</span>都是0或都是1,那么所有的优势A都是0,这并不会更新policy,会导致效率低下</p>
<p>因此使用动态采样的方法,一直采样直到一个sample的<strong>G个rollout的R 不全是0 或不全是1</strong>.</p>
<p></p><div class="math display">\[0<|\{o_i|is\_equivalent(o_i,a)\}|<G
\]</div><p></p><p>上述公示的含义是,对于QA对<span class="math inline">\((q,a)\)</span>,<span class="math inline">\(o_i\)</span>和答案<span class="math inline">\(a\)</span>相同的个数在<span class="math inline">\((0,G)\)</span>的区间内。</p>
<h3 id="3-rebalancing-act-token-level-policy-gradient-loss">3. Rebalancing Act: Token-Level Policy Gradient Loss</h3>
<p>DAPO任务 sample-level的loss(每个rollout的贡献度是一样的),然后不同rollout的长度不一样,<strong>过长的样本对模型的影响更大一些</strong>:</p>
<ul>
<li>过长的样本会导致模型难以学习推理模式 【置信度低,困惑度高】</li>
<li>过长的样本中存在一些不必要的 重复的话【长度增长过快】</li>
</ul>
<p>因此使用token-level的技术,长度越大的rollout,贡献度越大。</p>
<p>通过grpo sample-level loss得知,grpo并不在意response的长短(不同长度的sample的贡献度均为相同),然而长度越长A越大,因此response的长度会快速的增加。</p>
<p>但是DAPO认为长度越长的sample的贡献度越大,因此过长的sample是对的会重点强化(提高概率),但是错了的话,会重点惩罚,从而减小错的长response的概率,即<br>
<span class="math inline">\(P(len(o_i)>\delta|A<0)\)</span>下降。</p>
<p><img src="https://p.ipic.vip/xhmzza.png" alt="image-20251018161556211" loading="lazy"></p>
<p>同时,通过实验发现,DAPO的response的平均长度并没有无脑、快速增长。</p>
<h3 id="hide-and-seek-overlong-reward-shaping">Hide and Seek: Overlong Reward Shaping</h3>
<p>考虑到过长的response会被截断无法得到结果,这会导致奖励极低,<br>
因此采用mask的方式,在训练的时候过滤掉过长response的损失。</p>
<p><img src="https://p.ipic.vip/e4k5qf.png" alt="image-20251018171402542" loading="lazy"></p>
<p>实验发现,添加overlong filter之后,训练更加稳定(entropy,acc上),避免了noise。</p>
<p>DAPO进一步提出了soft overlong punishment,其实是基于长度的奖励,就不用进行filter操作了,直接赋予低的R就可以了,有利于降低response的长度。添加了一个cache的缓冲区,从而soft。</p>
<p></p><div class="math display">\[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}
\]</div><p></p><p>代码解析待更新(verl实现dapo部分)</p><br><br>
来源:https://www.cnblogs.com/qlhh/p/19150281
頁:
[1]