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 算法的特殊需求。这种组合式设计使得添加新的奖励后处理逻辑非常方便。