跳转至

dapo.py — DAPORewardManager 是为 DAPO(Direct Alignment from ...

文件路径: verl/experimental/reward_loop/reward_manager/dapo.py

文件概述

DAPORewardManager 是为 DAPO(Direct Alignment from Preferences with Overlong penalty)算法设计的奖励管理器。它在 NaiveRewardManager 的基础上添加了超长缓冲惩罚机制(overlong buffer penalty),用于惩罚生成过长文本的行为。

关键代码

类定义

@register("dapo")
class DAPORewardManager(NaiveRewardManager):
    """DAPO 奖励管理器,增加超长惩罚机制"""

    def __init__(self, config, tokenizer, num_examine, ...):
        super().__init__(config, tokenizer, num_examine, ...)
        # 超长惩罚相关参数
        self.overlong_buffer_len = config.get("overlong_buffer_len", 256)
        self.overlong_penalty = config.get("overlong_penalty", -1.0)

超长惩罚机制

DAPO 的核心创新之一是对生成过长文本进行惩罚。原理是:

def run_single(self, data, compute_score_fn, ...):
    # 先用父类方法计算基础奖励
    reward_tensor = super().run_single(data, compute_score_fn, ...)

    # 检查每个 response 的长度
    response_lengths = data.batch['responses'].ne(pad_token_id).sum(dim=1)
    max_allowed_length = self.max_response_length - self.overlong_buffer_len

    # 对超过阈值的 response 施加惩罚
    overlong_mask = response_lengths > max_allowed_length
    reward_tensor[overlong_mask] = self.overlong_penalty

    return reward_tensor

直觉理解:假设最大生成长度是 1024 tokens,缓冲区长度是 256 tokens。那么: - 生成 <= 768 tokens 的回复:正常计算奖励 - 生成 > 768 tokens 的回复:奖励被替换为惩罚值 -1.0

这鼓励模型生成简洁有效的回复,避免无意义的冗长输出。

核心类/函数列表

名称 类型 说明
DAPORewardManager 类 DAPO 专用奖励管理器
overlong_buffer_len 参数 超长缓冲区长度(默认 256)
overlong_penalty 参数 超长惩罚值(默认 -1.0)

与其他模块的关系

  • 继承自 NaiveRewardManager(复用基础奖励计算逻辑)
  • 通过 @register("dapo") 注册到全局注册表
  • 在 DAPO 算法的训练流程中被使用

小结

DAPORewardManager 是一个很好的"扩展基类"示例:它通过继承 NaiveRewardManager 并添加一个简单的后处理步骤(超长惩罚),就实现了 DAPO 算法的特殊需求。这种组合式设计使得添加新的奖励后处理逻辑非常方便。