ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

TRL XPO Trainer 详解:基于探索性偏好优化的在线 RLHF 训练实战

TRL XPO Trainer 详解:基于探索性偏好优化的在线 RLHF 训练实战 TRL XPO Trainer 详解基于探索性偏好优化的在线 RLHF 训练实战【免费下载链接】trlTrain transformer language models with reinforcement learning.项目地址: https://gitcode.com/GitHub_Trending/tr/trl本文围绕 TRL 仓库中的 XPO TrainerExploratory Preference Optimization探索性偏好优化展开先介绍其在线偏好调优的核心思想再给出完整的训练脚本与数据集要求最后结合 XPOTrainer 与 XPOConfig 源码逐行剖析损失计算、在线采样流程和全部日志指标。读完后你可以直接用accelerate launch跑通一个 XPO 训练任务并理解每个超参数与指标在源码中的真实含义。什么是 XPOExploratory Preference OptimizationXPO出自论文《Exploratory Preference Optimization: Harnessing Implicit Q*-Approximation for Sample-Efficient RLHF》arXiv: 2405.21046作者为 Tengyang Xie、Dylan J. Foster、Akshay Krishnamurthy、Corby Rosset、Ahmed Awadallah 与 Alexander Rakhlin。它是一种在线偏好调优方法以 DPO 损失为基础再叠加一个奖励模型RM和一个“探索奖励”exploration bonus使模型能够探索超出初始模型和人类反馈数据支撑范围support之外的回答。论文摘要的核心观点如下摘自官方文档 docs/source/xpo_trainer.mdRLHF 已成为语言模型对齐的核心工具。本文研究 RLHF 中的在线探索即通过刻意鼓励模型产生多样化、信息量最大的回答来利用与人类或 AI 反馈的交互式访问。让 RLHF 有把握地偏离预训练模型有望带来新颖的、可能超越人类的能力……我们提出了一个新的在线探索算法 XPO——它简单实用只需对在线DPO 做一行改动——却拥有目前已知最强的可证明保证和有前景的实证表现。XPO 通过新颖且有原则的探索奖励增强 DPO 目标使算法能够探索到初始模型和人类反馈数据支撑范围之外。在理论上我们证明在自然的探索条件下无论初始模型是否具有良好覆盖度XPO 均可证明地具备样本效率并收敛到近最优的语言模型策略……从源码结构看该方法的实现印证了“一行改动”的说法XPO 的总损失就是 DPO 损失加上alpha * 模型在参考模型回答上的对数概率和见 xpo_trainer.py 中的 _compute_losses# Compute XPO specific loss xpo_losses self.alpha * model_logprobs_ref_data_sum # Total loss loss (dpo_losses xpo_losses).mean()这个实现由 Kashif Rasul、Quentin Gallouédec 和 Lewis Tunstall 贡献。注意XPO 目前处于实验性experimental阶段位于trl.experimental命名空间下API 可能在迭代过程中随时变更生产使用需留意版本差异。快速上手完整训练脚本文档给出的示例组合为基座模型Qwen2-0.5B-InstructQwen/Qwen2-0.5B-Instruct奖励模型trl-lib/Qwen2-0.5B-Reward序列分类头num_labels1提示词数据集UltraFeedback 的 prompt-only 版本trl-lib/ultrafeedback-prompt完整脚本如下原文档train_xpo.py可直接复制运行# train_xpo.py from datasets import load_dataset from trl.experimental.xpo import XPOConfig, XPOTrainer from transformers import AutoModelForCausalLM, AutoModelForSequenceClassification, AutoTokenizer model AutoModelForCausalLM.from_pretrained(Qwen/Qwen2-0.5B-Instruct) tokenizer AutoTokenizer.from_pretrained(Qwen/Qwen2-0.5B-Instruct) reward_model AutoModelForSequenceClassification.from_pretrained(trl-lib/Qwen2-0.5B-Reward, num_labels1) train_dataset load_dataset(trl-lib/ultrafeedback-prompt, splittrain) training_args XPOConfig(output_dirQwen2-0.5B-XPO) trainer XPOTrainer( modelmodel, reward_funcsreward_model, argstraining_args, processing_classtokenizer, train_datasettrain_dataset ) trainer.train()使用 Accelerate 启动accelerate launch train_xpo.py官方文档给出参考数据在 8 卡分布式下上述任务训练约需 1 小时。训练完成后可用 Transformers Chat CLI 与产出的模型如trl-lib/Qwen2-0.5B-XPO对话验证效果。训练入口的构造参数XPOTrainer 的构造函数 接收以下核心参数参数类型说明modelPreTrainedModel待训练的因果语言模型推荐AutoModelForCausalLMref_modelPreTrainedModel可选参考模型。若不传trainer 会自动用与主模型相同架构的副本创建若主模型是 PEFT 模型则用其 base model 充当参考reward_funcsPreTrainedModel用于给回答打分的奖励模型推荐AutoModelForSequenceClassification。XPO 强制要求只能传一个奖励函数源码中if len(self.reward_funcs) ! 1: raise ValueErrorxpo_trainer.py#L176-L178argsXPOConfig训练配置train_dataset/eval_datasetDataset训练/评估数据集processing_classtokenizer/processor处理类会随模型一起保存便于断点续训与复用reward_processing_classestokenizer 列表可选奖励函数对应的 tokenizer为None时自动用AutoTokenizer.from_pretrained加载peft_configPeftConfig可选传入即自动用 PEFT 包装模型从测试用例 test_xpo_trainer.py 可以看到多种受支持的组合不传ref_model自动创建、显式传入独立ref_model、传 PEFT 模型 ref_modelNone隐式用 base model 做参考、以及 PEFT 独立参考模型的组合test_train_with_peft、test_train_pre_pefted_model_implicit_ref等。数据集要求prompt-onlyXPO 要求prompt-only 数据集即每行只包含提示词没有配对的正负回答因为正负回答是在训练中在线生成的当前模型和参考模型各自对同一批 prompt 采样出回答再由奖励模型决定谁优谁劣。关于数据格式XPOTrainer 同时支持两种格式详见 docs/source/dataset_formats.mdconversational 格式prompt列是消息列表[{role: user, content: ...}]。Trainer 会自动应用 chat template训练步骤中的maybe_apply_chat_templatexpo_trainer.py#L436。standard 格式prompt列是普通字符串同样会被 tokenizer 直接处理。测试用例同时参数化验证了standard_prompt_only与conversational_prompt_only两种配置test_xpo_trainer.py#L39-L63两者最终都会记录train_loss。训练流程剖析一次 training_step 里发生了什么理解 XPO 的关键在于它“在线”的每一步。training_step 的完整流程如下模板与分词取出prompt列逐行maybe_apply_chat_template并tokenize_row经data_collator组批后得到prompt_input_ids/prompt_attention_maskcontext_length即 prompt 的 token 数。双模型在线采样_generate_completions当前模型与参考模型用同一份generation_config分别对 prompt 做generate得到model_output与ref_output。参考模型采样时若主模型是 PEFT会自动取 base model绕过 adapter生成。截断与拼接_process_completions切掉 prompt 前缀得到 completion再用truncate_right在 EOS 处截断拼回成prompt completion的完整序列。奖励打分与在线配对_compute_rewards奖励模型对两份回答分别打分随后由chosen_mask model_scores ref_scores决定每个 batch 元素中哪份回答算“chosen”。这就是在线偏好对的来源——偏好标签不是数据集给的而是每一步动态产生的。四路 logprobs_compute_logprobs分别计算“模型评模型回答”“模型评参考回答”“参考评模型回答”“参考评参考回答”的 token 级 logprobsselective_log_softmax并屏蔽 padding。损失计算_compute_losses按chosen_mask用torch.where组装 chosen/rejected 的 log-ratio计算 DPO 损失再叠加 XPO 探索项。统计记录与反传_log_statistics记录全部指标后accelerator.backward(loss)。损失函数DPO 项 探索项DPO 项支持两种损失类型由loss_type控制继承自 OnlineDPOConfigif self.args.loss_type sigmoid: dpo_losses -F.logsigmoid(self.beta * logits) elif self.args.loss_type ipo: dpo_losses (logits - 1 / (2 * self.beta)) ** 2其中logits chosen_log_ratios - rejected_log_ratios即 chosen 与 rejected 各自模型对数概率 − 参考对数概率之差。XPO 探索项则是xpo_losses self.alpha * model_logprobs_ref_data_sum loss (dpo_losses xpo_losses).mean()从源码结构看可以这样理解其作用model_logprobs_ref_data_sum是当前策略在“参考模型自己生成的回答”上的对数概率之和。奖励模型把参考回答评为“较差”一方时DPO 项会压低模型对它的概率而 XPO 项以权重alpha拉高这一概率——两者一拉一推迫使模型在“奖励模型眼中次优”的回答分布上也不至于概率坍缩这正是论文所说的“探索到初始模型与人类反馈支撑范围之外”的机制载体。missing_eos_penaltyEOS 缺失惩罚打分阶段xpo_trainer.py#L264-L269if self.args.missing_eos_penalty is not None: model_contain_eos torch.any(model_data[input_ids] self.processing_class.eos_token_id, dim-1) ref_contain_eos torch.any(ref_data[input_ids] self.processing_class.eos_token_id, dim-1) model_scores[~model_contain_eos] - self.args.missing_eos_penalty ref_scores[~ref_contain_eos] - self.args.missing_eos_penalty即谁的回答没有以 EOS 收尾说明生成被max_new_tokens截断谁就从奖励模型打分中扣掉missing_eos_penalty分。使用示例training_args XPOConfig(..., max_new_tokens128, missing_eos_penalty1.0)警告SFT 模型与奖励模型必须使用相同的 chat template 和 tokenizer否则训练中回答会被错误打分。关键配置参数速查XPOConfig 继承自 OnlineDPOConfig因此同时具备两组参数。XPOConfig 自有参数参数默认值说明alpha1e-5XPO 探索项的权重。可以传list[float]按 epoch 逐个选取超出列表长度后沿用最后一个值。源码中 alpha property 按self.state.epoch取值__post_init__会把单元素列表[x]自动解包为标量xxpo_config.py#L41-L44所以alpha1e-5与alpha[1e-5]等价。继承自 OnlineDPOConfig 的核心参数以下默认值均取自 online_dpo_config.py参数默认值说明max_new_tokens64每条回答的最大生成 token 数max_length512prompt completion 计算 logprobs 的最大总长超长时截断最左侧token 以尽量保住回答部分temperature0.9采样温度越高回答越随机top_p/top_k/min_p/repetition_penalty1.0/0/None/1.0常规生成控制参数generation_kwargsNone透传给GenerationConfig的额外生成参数可覆盖上述同名项missing_eos_penaltyNoneEOS 缺失惩罚须为正数见上文beta0.1控制偏离参考模型的程度越大越保守同样支持list[float]按 epoch 变化loss_typesigmoidDPO 损失类型可选sigmoid或ipouse_vllm/vllm_mode等False/colocate可用 vLLM 加速在线生成支持server与colocate两种模式ds3_gather_for_generationTrueDeepSpeed ZeRO-3 下是否聚合权重以加速生成learning_rate5e-7注意该基类对若干TrainingArguments默认值做了覆盖learning_rate5e-7而非 5e-5、gradient_checkpointingTrue、bf16True若未设 fp16、remove_unused_columnsFalse、logging_steps10基类还会校验max_new_tokens max_length否则发出警告online_dpo_config.py#L383-L389建议保证max_length max_new_tokens 512以免 prompt 在 forward 中被截掉。记录的训练指标训练与评估过程中 XPO 会记录以下指标指标清单见 docs/source/xpo_trainer.md 的 “Logged metrics” 一节注册逻辑见 xpo_trainer.py 的 self.stats 字典 及 _log_statistics指标含义loss/xpo完整损失中 XPO 探索项的均值loss/dpo完整损失中 DPO 项的均值objective/kl模型与参考数据之间 KL 散度的均值对模型回答和参考回答两侧各算一次再取平均见源码mean_klobjective/entropy模型与参考数据熵的均值objective/model_scores奖励模型给当前模型回答的平均分objective/ref_scores奖励模型给参考模型回答的平均分objective/scores_margin两者之间的平均分差rewards/chosenXPO 隐式奖励模型即 DPO 的beta * log_ratio见 源码 L392给 chosen 回答的平均奖励rewards/rejected同上对应 rejected 回答rewards/accuracies隐式奖励模型判对的准确率margin 0的比例rewards/margins隐式奖励下 chosen 与 rejected 的平均奖励差logps/chosen/logps/rejectedchosen / rejected 回答的平均 log 概率val/model_contain_eos_token当前模型回答中出现 EOS token 的比例val/ref_contain_eos_token参考模型回答中出现 EOS token 的比例alpha当前 XPO 损失项权重可固定也可按 epoch 动态变化beta当前偏离参考模型的权重参数同上其中objective/model_scores、objective/ref_scores来自外部奖励模型而rewards/chosen、rewards/rejected来自 DPO 隐式奖励两套“分数”分别反映 RM 的绝对偏好与策略相对参考模型的隐式偏好变化实践中可交叉观察。使用技巧鼓励生成 EOS token使用奖励模型时通常希望模型在给定长度内生成完回答。训练中模型最多生成max_new_tokens指定的长度若希望惩罚“没来得及输出 EOS 就被截断”的行为配置missing_eos_penalty即可training_args XPOConfig(..., max_new_tokens128, missing_eos_penalty1.0)记录模型生成的回答Logging Completions为了理解模型训练期间的行为变化可以定期把样本回答写入日志使用 LogCompletionsCallback回调文档见 docs/source/callbacks.mdtrainer XPOTrainer(..., eval_dataseteval_dataset) completions_callback LogCompletionsCallback(trainer, num_prompts8) trainer.add_callback(completions_callback)该回调会把模型生成的回答直接记录到 Weights Biases便于人工抽查生成质量与 EOS 行为是否符合预期。相关实现与测试索引核心实现XPOTrainer、XPOConfig导出入口 trl/experimental/xpo/init.py父类实现OnlineDPOTrainer、OnlineDPOConfigXPOTrainer是OnlineDPOTrainer的子类复用其数据 collator、奖励函数装配、vLLM 集成等基础设施测试用例tests/experimental/test_xpo_trainer.py覆盖两种数据格式、四种eval_dataset形态、PEFT 组合训练官方文档docs/source/xpo_trainer.md小结XPO 在 TRL 中是一个“DPO 奖励模型 探索项”的在线对齐方案每个训练步由当前模型和参考模型在线生成回答对奖励模型动态裁决 chosen/rejected损失由 DPO 项与alpha加权的探索项组成。由于实现完全建立在OnlineDPOTrainer之上你可以直接复用在线 DPO 的数据格式、vLLM 加速与 DeepSpeed 配置经验。需要注意的是其实验性状态与“仅支持单个奖励模型”的约束源码中显式抛出ValueError以及基类对TrainingArguments默认值的覆盖尤其是learning_rate5e-7与gradient_checkpointingTrue。【免费下载链接】trlTrain transformer language models with reinforcement learning.项目地址: https://gitcode.com/GitHub_Trending/tr/trl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表