在大型语言模型(LLM)的后训练阶段,强化学习从人类反馈(RLHF)已成为实现模型与人类偏好对齐的关键技术。其中,Bradley-Terry 奖励模型与近端策略优化(PPO)算法的集成,为离线 LLM 对齐提供了高效框架,尤其适用于单代理设置。本文聚焦于 VERL 库中这一集成的实现,强调偏好数据集的处理和策略微调过程。通过这种方法,可以在不依赖在线交互的情况下,提升模型在偏好任务上的性能,避免多代理复杂性带来的额外开销。
Bradley-Terry 模型作为奖励建模的核心基础,其数学原理源于配对比较的概率建模。对于给定的提示 x 和两个响应 y_w(chosen,优选)和 y_l(rejected,次优),模型定义偏好概率为 P(y_w > y_l | x) = sigmoid(r(x, y_w) - r(x, y_l)),其中 r 是奖励函数。训练目标是最小化负对数似然损失:-log(sigmoid(r(x, y_w) - r(x, y_l))),这确保了优选响应获得更高奖励分数。这种损失函数在 RLHF 中广泛应用,因为它直接从偏好数据中学习相对排序,而非绝对奖励值。在 VERL 框架下,这一模型可通过 RewardModelWorker 实现,支持 FSDP 或 Megatron 后端,确保在大规模数据集上的高效训练。
证据显示,这种集成的有效性已在多个基准上得到验证。例如,在 GSM8K 数学推理任务中,使用 Bradley-Terry 训练的奖励模型能将 PPO 优化的准确率从基线 36.4% 提升至 56.7%。VERL 的 PPO 实现采用 Actor-Critic 架构,其中 Actor 生成响应,Critic 估计价值函数,并使用广义优势估计(GAE)计算优势 A_t = ∑ (γλ)^{k-t} (r_k + γ V(s_{k+1}) - V(s_k)),其中 γ 为折扣因子,λ 为 GAE 参数。这减少了策略梯度估计的方差,同时 PPO 的裁剪代理目标 L^{CLIP} = min(r_t(θ) Â_t, clip(r_t(θ), 1-ε, 1+ε) Â_t)(ε=0.2)防止了过度更新,确保训练稳定。在单代理设置中,这种方法避免了多代理协作的 emergent 行为,专注于核心偏好对齐。
偏好数据集的处理是集成成功的关键步骤。首先,收集或使用现有数据集,如 Anthropic/hh-rlhf 或自定义偏好对(prompt, chosen, rejected)。在 VERL 中,通过 data_preprocess 脚本将数据转换为 Parquet 格式,例如 examples/data_preprocess/gsm8k.py 将数学问题转换为包含 ground_truth 的结构化提示。加载时,配置 data.train_files 和 data.val_files 指向这些文件,设置 data.train_batch_size=256 以平衡吞吐和内存。预处理需确保响应长度不超过 max_response_length=512,避免 padding 浪费;同时,使用 sequence packing(data.use_sequence_packing=True)优化批处理效率。对于离线对齐,数据集应覆盖多样化场景,如指令跟随和安全拒绝,以增强泛化。
PPO 策略微调过程在 VERL 中高度模块化。初始化时,Actor 和参考模型(SFT 模型)从同一检查点加载,如 Qwen/Qwen2.5-0.5B-Instruct。配置 actor_rollout_ref.actor.strategy='fsdp' 以支持分布式训练,设置 ppo_mini_batch_size=64 和 ppo_epochs=4,确保每个迭代充分更新。学习率方面,Actor 使用 1e-6,Critic 使用 1e-5,以匹配价值函数的快速收敛。KL 散度控制至关重要:启用 algorithm.kl_ctrl.type='adaptive' 和 kl_coef=0.001,目标 KL 为 0.01-0.02,防止模型偏离参考策略。优势估计使用 adv_estimator='gae',γ=0.99,λ=0.95。在单代理设置下,rollout 使用 vLLM 后端(actor_rollout_ref.rollout.name='vllm'),gpu_memory_utilization=0.4 以节省资源。
可落地参数清单如下:
- 数据集:train_batch_size=256, max_prompt_length=1024, max_response_length=512。
- 奖励模型:enable=True, strategy='fsdp', loss='bradley_terry'(隐式通过偏好损失)。
- PPO 配置:clip_ratio=0.2, ppo_micro_batch_size_per_gpu=4, use_kl_loss=True, kl_loss_coef=0.001。
- 优化器:actor.optim='adamw', lr=1e-6, weight_decay=0.01;critic.optim='adamw', lr=1e-5。
- 训练:total_epochs=15, save_freq=10, logger='wandb' 以监控 reward_mean 和 pg_loss。
- 硬件:n_gpus_per_node=8, nnodes=1,支持 LoRA 以减少内存(peft_config.r=16)。
在实施中,监控要点包括:奖励均值(critic/score/mean)应逐步上升至 0.5+;熵损失(actor/entropy_loss)保持在 0.4 左右,避免崩溃;价值函数损失(critic/vf_loss)下降表示 Critic 稳定。若遇不稳定,可降低 lr 或增加 KL 系数。风险包括奖励黑客(reward hacking),通过多样化数据集和规则-based 辅助奖励缓解;训练超时则使用断点续传(trainer.resume=True)。
最后,这种单代理 PPO 与 Bradley-Terry 集成的优势在于简洁性和可扩展性,适用于生产环境中的离线对齐。资料来源:VERL GitHub (https://github.com/volcengine/verl),PPO 文档 (https://verl.readthedocs.io/en/latest/algo/ppo.html),以及 RLHF 相关论文如 "Training Language Models to Follow Instructions with Human Feedback"。