ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

AReaL 偏好对齐实战:基于 Anthropic/hh-rlhf 的奖励模型(RM)训练与 DPO 直接偏好优化

AReaL 偏好对齐实战:基于 Anthropic/hh-rlhf 的奖励模型(RM)训练与 DPO 直接偏好优化 AReaL 偏好对齐实战基于 Anthropic/hh-rlhf 的奖励模型RM训练与 DPO 直接偏好优化【免费下载链接】AReaLThe RL Bridge for LLM-based Agent Applications. Made Simple Flexible.项目地址: https://gitcode.com/GitHub_Trending/are/AReaL导读本文以 AReaL 仓库中的 examples/alignment 为例系统讲解如何在Anthropic/hh-rlhf偏好数据集上完成两类最常用的对齐训练奖励模型Reward ModelRM训练与直接偏好优化Direct Preference OptimizationDPO。两种方法消费同一份 chosen/rejected 偏好对但对偏好信号的使用方式截然不同。读完本文你将掌握两条技术路线的适用场景与取舍、可直接复制的启动命令、完整 YAML 配置逐项拆解、AReaL 中 DPO 在线参考模型ref engine的实现原理以及如何解读训练曲线验证对齐效果。说明本文所有命令与配置均以当前仓库examples/alignment目录下的真实文件为准涉及的源码路径可直接在仓库中继续深挖。一、路线总览RM 与 DPO 如何选择examples/alignment目录同时提供奖励模型训练与 DPO 训练两套示例二者使用完全相同的偏好对chosen优于rejected区别在于把偏好信号转化为何种目标方法输出产物适用场景RM一个标量奖励模型为响应打分作为 PPO/GRPO/RL 训练中的奖励信号DPO一个偏好对齐的策略模型直接对齐后的模型无需单独维护奖励模型选择要点如果你的下游是 PPO/GRPO 这类在线强化学习管线需要先训练 RM 作为奖励来源如果目标是直接得到一个对齐后的策略DPO 的端到端闭式优化更轻量不需要显式奖励模型。二、数据准备与代码结构2.1 示例目录组成examples/alignment/ ├── README.md # 本文对应的官方指南 ├── hhrlhf_rw.py # RM 训练入口脚本 ├── hhrlhf_rw.yaml # RM 训练配置 ├── hhrlhf_dpo.py # DPO 训练入口脚本 ├── hhrlhf_dpo.yaml # DPO 训练配置 ├── rw_loss_formula.png # Bradley-Terry 损失公式 ├── rw_curve.png # RM 训练曲线 └── dpo_curve.png # DPO 训练曲线2.2 偏好数据如何被处理数据集处理逻辑集中在 areal/dataset/hhrlhf.py其中get_hhrlhf_rw_dataset将每条样本的chosen/rejected文本分别编码为chosen_ids/rejected_ids末尾追加eos_token供 RM 训练使用可选max_length过滤超长序列。get_hhrlhf_dpo_dataset额外生成chosen_loss_mask/rejected_loss_mask。实现上通过逐 token 比较chosen 与 rejected 的 token id 找到公共前缀长度prompt_len前缀部分提示词置 0 不参与损失响应部分置 1 参与损失即 DPO 只对响应片段做对比学习。在入口脚本 hhrlhf_rw.py 和 hhrlhf_dpo.py 中均通过areal.dataset.get_custom_dataset按train_dataset.typerw或dpo自动分派到上述处理函数再交给RWTrainer/DPOTrainer训练。三、奖励模型Reward Model训练3.1 原理Bradley-Terry 奖励建模奖励建模是让语言模型与人类偏好对齐的关键步骤训练一个模型为响应打分该分数随后可作为强化学习PPO/GRPO中指导策略优化的奖励信号。AReaL 采用 Bradley-Terry 奖励建模损失直观理解模型为chosen响应给出比rejected响应更高的分数时损失降低从而学会复刻人类偏好排序。3.2 快速启动使用仓库提供的配置直接启动 RM 训练python3 examples/alignment/hhrlhf_rw.py \ --config examples/alignment/hhrlhf_rw.yaml \ experiment_namehhrlhf-rw \ trial_nametrial1 \ actor.pathQwen/Qwen2.5-7B \ train_dataset.pathAnthropic/hh-rlhf \ valid_dataset.pathAnthropic/hh-rlhf \ scheduler.typelocal \ stats_logger.wandb.modeonline # Set to disabled if you dont use Weights Biases命令行中keyvalue形式的参数会作为配置覆盖项与 YAML 中的同名键合并优先级更高因此你无需修改配置文件即可切换模型、数据集、调度器和日志后端。3.3 配置文件逐项拆解完整配置见 hhrlhf_rw.yaml核心字段如下配置段关键字段说明顶层total_train_epochs: 1训练轮数示例仅 1 个 epoch顶层tokenizer_path: ${actor.path}支持${}变量引用tokenizer 直接复用 actor 模型路径clustern_nodes/n_gpus_per_node集群规模示例为单机 8 卡cluster.name_resolvetype: nfs名称解析后端多机时通过 NFS 记录根目录交换地址schedulertype: local调度器类型可选local/ray/slurmactorbackend: fsdp:d8p1t1训练后端为 FSDP8 张卡数据并行、张量并行度为 1actoris_critic: trueRM 训练的关键开关将 actor 配置为打分模型actordisable_dropout: true训练时关闭 dropout对齐训练惯例actorgradient_checkpointing: true/dtype: bfloat16显存优化与精度actor.optimizerlr: 2e-5、weight_decay: 0.01、lr_scheduler_type: cosine、gradient_clipping: 1.0Adam 优化器参数RM 通常用偏大的学习率actor.mb_specmax_tokens_per_mb: 4096微批按 token 数切分granularity: 2表示按 2 的幂对齐actor.scheduling_speccmd: python3 -m areal.infra.rpc.rpc_server每个 worker 进程启动的 RPC 服务命令train_dataset/valid_datasetbatch_size: 256、type: rwRM 数据集类型标识训练/验证批大小均为 256saver/recover/evaluatorfreq_epochs: 1按 epoch 频率保存 checkpoint、恢复点与执行评估stats_logger.wandbmode: disabledWandB 开关CLI 中可覆盖为online3.4 源码级原理RWTrainer 如何跑起来RM 训练的驱动类是 areal/trainer/rw_trainer.py 中的RWTrainer数据装配rw_modeling_collate_fn把每个样本的chosen_ids与rejected_ids拆成两个独立的[1, seqlen]张量chosen 在前并附带全 1 的attention_mask——即一个偏好对在 batch 中表现为两条序列。引擎分派_create_actor根据actor.backend选择FSDPRWEngine/MegatronRWEngine/ArchonRWEngine示例配置走 FSDP 路径。训练主循环train()中以epoch global_step // steps_per_epoch组织迭代每步调用self.actor.train_rw(batch)执行一次打分损失的反向更新随后依次推进 LR scheduler、保存 HF 格式权重Saver、落恢复 checkpointRecoverHandler、执行验证集评估Evaluator并提交统计StatsLogger。模型加载时若存在可恢复的 checkpoint会从上次global_step续训因此支持断点续跑。3.5 训练曲线解读典型的 RM 训练曲线表现为loss持续下降模型对 chosen 的打分逐渐高于 rejected偏好准确率上升。训练结束后产出的就是一个可打分、可接入 RL 管线的标量奖励模型。四、直接偏好优化DPO训练4.1 原理什么是 DPO直接偏好优化Direct Preference OptimizationRafailov et al., 2023无需训练单独的奖励模型而是直接优化策略使模型对人类偏好响应chosen的生成概率高于被拒绝响应rejected。其核心是一个基于可训练策略与冻结参考模型之间 log 概率比的闭式对比损失$$ \mathcal{L}{\mathrm{DPO}}(\pi\theta; \pi_{\mathrm{ref}}) -\mathbb{E}_{(x, y_w, y_l) \sim \mathcal{D}} \left[ \log \sigma\left( \beta \log \frac{\pi_\theta(y_w \mid x)}{\pi_{\mathrm{ref}}(y_w \mid x)} - \beta \log \frac{\pi_\theta(y_l \mid x)}{\pi_{\mathrm{ref}}(y_l \mid x)} \right) \right] $$其中$\pi_\theta$ 为可训练策略actor$\pi_{\mathrm{ref}}$ 为冻结的参考模型ref$y_w$、$y_l$ 分别为 chosen 与 rejected 响应$\beta$ 控制策略允许偏离参考模型的程度$\beta$ 越大 → KL 约束越紧$\sigma$ 为 sigmoid 函数。4.2 AReaL 的 DPO 实现要点在线 ref 引擎AReaL 的 DPO 实现有一个值得注意的设计每一步都在线计算 $\pi_{\mathrm{ref}}$ 的 log 概率通过 YAML 中ref:字段配置的共置colocate参考引擎完成与 PPO/GRPO 的 ref-model 模式保持一致。无需在磁盘上预存参考 logprob 文件。在 areal/trainer/dpo/dpo_engine.py 中可以看到完整的损失计算链路DPOEngine.compute_logpref 引擎在前向模式下为 batch 中的 chosen/rejected 序列计算逐 token log 概率结果以ref_logprobs形式挂回数据字典供训练步使用compute_dpo_lossdpo_pair_logratios从 packed batch 中按cu_seqlens切分序列、用loss_mask对齐下一 token 的 log 概率mask 右移一位、末位清零并以fp64 累加避免长序列约 2k tokenfp32 累加导致 log 比符号翻转的精度问题得到(policy_logps, ref_logps, completion_lens)各为(K, 2)的配对张量dpo_preference_loss见 areal/utils/functional/functional.pysigmoid变体返回-logsigmoid(beta * logits)ipo变体返回(logits - 1/(2*beta))²训练/评估时同时无梯度地统计chosen_reward、rejected_reward定义为beta * (policy_logp - ref_logp)、reward_accuracychosen_reward rejected_reward的比例与reward_margin这些指标正是后文判断对齐是否有效的依据。4.3 快速启动python3 examples/alignment/hhrlhf_dpo.py \ --config examples/alignment/hhrlhf_dpo.yaml \ experiment_namehhrlhf-dpo \ trial_nametrial1 \ actor.pathQwen/Qwen2.5-7B \ ref.pathQwen/Qwen2.5-7B \ train_dataset.pathAnthropic/hh-rlhf \ valid_dataset.pathAnthropic/hh-rlhf \ scheduler.typelocal \ stats_logger.wandb.modeonline # Set to disabled if you dont use Weights Biases注意 DPO 比 RM 多一个ref.path参数——参考模型与 actor 初始为同一检查点训练中 ref 保持冻结。4.4 配置文件解析actor 与 ref 的协同完整配置见 hhrlhf_dpo.yaml。与 RM 配置的核心差异配置段关键字段说明actoris_critic: falseDPO 中 actor 是策略而非打分器actorbeta: 0.1DPO 的 KL 约束强度见损失公式actor.optimizerlr: 5e-6、warmup_steps_proportion: 0.1、min_lr_ratio: 0.1、gradient_clipping: 10.0DPO 学习率显著小于 RM5e-6 vs 2e-5并带 10% 步数 warmup 与更宽松的梯度裁剪refpath: ${actor.path}、optimizer: null参考模型不训练无优化器refscheduling_strategy.type: colocation、target: actorref 与 actor 共置调度复用 actor 的卡资源避免额外占卡ref.mb_specmax_tokens_per_mb: 10240前向推理微批可更大提升 logprob 计算吞吐train_dataset/valid_datasetbatch_size: 64、type: dpo、max_length: 2048DPO 批大小更小每条样本含两条序列超长样本被过滤DPOTrainer见 areal/trainer/dpo_trainer.py的训练主循环非常清晰地体现了上述设计每步先调self.ref.compute_logp(batch)在线获取参考 logprob再调self.actor.train_dpo(batch)用compute_dpo_loss做反向更新batch 清理阶段同时回收 actor 与 ref 两侧的缓存。由于 DPO 一条样本包含 chosen/rejected 两条序列DPOController在 RPC 分发时使用group_size2保证同一偏好对落在同一数据并行 rank 上。4.5 支持的 loss_typesigmoid 与 ipo在 areal/api/cli_args.py 中loss_type字段限定为两个取值sigmoid原始 DPO 损失Rafailov et al. 2023即上文的-logsigmoid(beta * logits)ipoIdentity Preference OptimizationAzar et al. 2023采用逐 token 平均的平方损失变体——compute_dpo_loss中先将每条序列的 log 比除以该序列 completion 长度per-token 归一化再套用(logits - 1/(2*beta))²使 $\beta$ 在不同长度序列间可比。4.6 推荐流程Base → SFT → DPO为了获得最佳对齐质量官方推荐的完整流水线是Base → SFT → DPO用 SFT 检查点同时初始化 actor 与参考模型。而本文示例为最小化验证成本直接以 Base 模型启动 DPO即不经过 SFT 预热用于快速验证 AReaL 的 DPO 链路本身是否工作正常。4.7 训练曲线解读官方实验记录用Qwen2.5-7B-Base在Anthropic/hh-rlhf上训练 1 个 epoch无 SFT 预热即可复现原始论文的经典 DPO 特征——loss从约 $\log 2 \approx 0.693$ 起步并持续下降初始 $\approx \log 2$ 正是 sigmoid 损失在无偏好信号时的理论起点reward_accuracychosen 得分高于 rejected 的比例从 0.50 升至约 0.70reward_marginchosen 与 rejected 得分差单调增长rejected_reward的下降速度快于chosen_reward。这些曲线形态是 DPO 正常收敛的标志性签名signature可用于快速判断自己的实验是否跑对。五、小结在 AReaL 中examples/alignment给出了两套可直接复现的偏好对齐范式RM 训练产出可供 PPO/GRPO 使用的标量奖励模型配置关键在actor.is_critic: trueDPO 则以在线共置的 ref 引擎计算参考 logprob端到端产出对齐后的策略配置关键在actor.beta与ref字段。二者共享同一套Anthropic/hh-rlhf数据与数据服务、Saver/Recover/Evaluator/StatsLogger 等基建从示例出发可平滑迁移到其他偏好数据集与更大规模模型。继续深入可阅读 RWTrainer、DPOTrainer 与 DPOEngine 的源码理解每一步的底层实现。【免费下载链接】AReaLThe RL Bridge for LLM-based Agent Applications. Made Simple Flexible.项目地址: https://gitcode.com/GitHub_Trending/are/AReaL创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表