自己公司产品网站的好处,手机网站demo,互联网保险平台有哪些,网站建设及推广套餐简介 基于人类反馈的强化学习 (Reinforcement Learning from Human Feedback#xff0c;RLHF) 事实上已成为 GPT-4 或 Claude 等 LLM 训练的最后一步#xff0c;它可以确保语言模型的输出符合人类在闲聊或安全性等方面的期望。然而#xff0c;它也给 NLP 引入了一些 RL 相关… 简介 基于人类反馈的强化学习 (Reinforcement Learning from Human FeedbackRLHF) 事实上已成为 GPT-4 或 Claude 等 LLM 训练的最后一步它可以确保语言模型的输出符合人类在闲聊或安全性等方面的期望。然而它也给 NLP 引入了一些 RL 相关的复杂性: 既要构建一个好的奖励函数并训练一个模型用以估计每个状态的价值 (value); 又要注意最终生成的 LLM 不能与原始模型相差太远如果太远的话会使得模型容易产生乱码而非有意义的文本。该过程非常复杂涉及到许多复杂的组件而这些组件本身在训练过程中又是动态变化的因此把它们料理好并不容易。 Rafailov、Sharma、Mitchell 等人最近发表了一篇论文 Direct Preference Optimization论文提出将现有方法使用的基于强化学习的目标转换为可以通过简单的二元交叉熵损失直接优化的目标这一做法大大简化了 LLM 的提纯过程。 本文介绍了直接偏好优化 (Direct Preference OptimizationDPO) 法该方法现已集成至 TRL 库 中。同时我们还展示了如何在 stack-exchange preference 数据集上微调最新的 Llama v2 7B 模型 stack-exchange preference 数据集中包含了各个 stack-exchange 门户上的各种问题及其排序后的回答。 DPO 与 PPO 在通过 RL 优化人类衍生偏好时一直以来的传统做法是使用一个辅助奖励模型来微调目标模型以通过 RL 机制最大化目标模型所能获得的奖励。直观上我们使用奖励模型向待优化模型提供反馈以促使它多生成高奖励输出少生成低奖励输出。同时我们使用冻结的参考模型来确保输出偏差不会太大且继续保持输出的多样性。这通常需要在目标函数设计时除了奖励最大化目标外再添加一个相对于参考模型的 KL 惩罚项这样做有助于防止模型学习作弊或钻营奖励模型。 DPO 绕过了建模奖励函数这一步这源于一个关键洞见: 从奖励函数到最优 RL 策略的分析映射。这个映射直观地度量了给定奖励函数与给定偏好数据的匹配程度。有了它作者就可与将基于奖励和参考模型的 RL 损失直接转换为仅基于参考模型的损失从而直接在偏好数据上优化语言模型因此DPO 从寻找最小化 RLHF 损失的最佳方案开始通过改变参量的方式推导出一个 仅需 参考模型的损失 有了它我们可以直接优化该似然目标而不需要奖励模型或繁琐的强化学习优化过程。 如何使用 TRL 进行训练 如前所述一个典型的 RLHF 流水线通常包含以下几个环节: 有监督微调 (supervised fine-tuningSFT)用偏好标签标注数据基于偏好数据训练奖励模型RL 优化 TRL 库包含了所有这些环节所需的工具程序。而 DPO 训练直接消灭了奖励建模和 RL 这两个环节 (环节 3 和 4)直接根据标注好的偏好数据优化 DPO 目标。 使用 DPO我们仍然需要执行环节 1但我们仅需在 TRL 中向 DPOTrainer 提供环节 2 准备好的偏好数据而不再需要环节 3 和 4。标注好的偏好数据需要遵循特定的格式它是一个含有以下 3 个键的字典: prompt : 即推理时输入给模型的提示chosen : 即针对给定提示的较优回答rejected : 即针对给定提示的较劣回答或非给定提示的回答 例如对于 stack-exchange preference 数据集我们可以通过以下工具函数将数据集中的样本映射至上述字典格式并删除所有原始列: def return_prompt_and_responses(samples) - Dict[str, str, str]:return {prompt: [Question: question \n\nAnswer: for question in samples[question]],chosen: samples[response_j], # rated better than krejected: samples[response_k], # rated worse than j}dataset load_dataset(lvwerra/stack-exchange-paired,splittrain,data_dirdata/rl
)
original_columns dataset.column_namesdataset.map(return_prompt_and_responses,batchedTrue,remove_columnsoriginal_columns
) 一旦有了排序数据集DPO 损失其实本质上就是一种有监督损失其经由参考模型获得隐式奖励。因此从上层来看DPOTrainer 需要我们输入待优化的基础模型以及参考模型: dpo_trainer DPOTrainer(model, # 经 SFT 的基础模型model_ref, # 一般为经 SFT 的基础模型的一个拷贝beta0.1, # DPO 的温度超参train_datasetdataset, # 上文准备好的数据集tokenizertokenizer, # 分词器argstraining_args, # 训练参数如: batch size, 学习率等
) 其中超参 beta 是 DPO 损失的温度通常在 0.1 到 0.5 之间。它控制了我们对参考模型的关注程度beta 越小我们就越忽略参考模型。对训练器初始化后我们就可以简单调用以下方法使用给定的 training_args 在给定数据集上进行训练了: dpo_trainer.train() 基于 Llama v2 进行实验 在 TRL 中实现 DPO 训练器的好处是人们可以利用 TRL 及其依赖库 (如 Peft 和 Accelerate) 中已有的 LLM 相关功能。有了这些库我们甚至可以使用 bitsandbytes 库提供的 QLoRA 技术 来训练 Llama v2 模型。 有监督微调 如上文所述我们先用 TRL 的 SFTTrainer 在 SFT 数据子集上使用 QLoRA 对 7B Llama v2 模型进行有监督微调: # load the base model in 4-bit quantization
bnb_config BitsAndBytesConfig(load_in_4bitTrue,bnb_4bit_quant_typenf4,bnb_4bit_compute_dtypetorch.bfloat16,
)base_model AutoModelForCausalLM.from_pretrained(script_args.model_name, # meta-llama/Llama-2-7b-hfquantization_configbnb_config,device_map{: 0},trust_remote_codeTrue,use_auth_tokenTrue,
)
base_model.config.use_cache False# add LoRA layers on top of the quantized base model
peft_config LoraConfig(rscript_args.lora_r,lora_alphascript_args.lora_alpha,lora_dropoutscript_args.lora_dropout,target_modules[q_proj, v_proj],biasnone,task_typeCAUSAL_LM,
)
...
trainer SFTTrainer(modelbase_model,train_datasettrain_dataset,eval_dataseteval_dataset,peft_configpeft_config,packingTrue,max_seq_lengthNone,tokenizertokenizer,argstraining_args, # HF Trainer arguments
)
trainer.train() DPO 训练 SFT 结束后我们保存好生成的模型。接着我们继续进行 DPO 训练我们把 SFT 生成的模型作为 DPO 的基础模型和参考模型并在上文生成的 stack-exchange preference 数据上以 DPO 为目标函数训练模型。我们选择对模型进行 LoRa 微调因此我们使用 Peft 的 AutoPeftModelForCausalLM 函数加载模型: model AutoPeftModelForCausalLM.from_pretrained(script_args.model_name_or_path, # location of saved SFT modellow_cpu_mem_usageTrue,torch_dtypetorch.float16,load_in_4bitTrue,is_trainableTrue,
)
model_ref AutoPeftModelForCausalLM.from_pretrained(script_args.model_name_or_path, # same model as the main onelow_cpu_mem_usageTrue,torch_dtypetorch.float16,load_in_4bitTrue,
)
...
dpo_trainer DPOTrainer(model,model_ref,argstraining_args,betascript_args.beta,train_datasettrain_dataset,eval_dataseteval_dataset,tokenizertokenizer,peft_configpeft_config,
)
dpo_trainer.train()
dpo_trainer.save_model() 可以看出我们以 4 比特的方式加载模型然后通过 peft_config 参数选择 QLora 方法对其进行训练。训练器还会用评估数据集评估训练进度并报告一些关键指标例如可以选择通过 WandB 记录并显示隐式奖励。最后我们可以将训练好的模型推送到 HuggingFace Hub。 总结 SFT 和 DPO 训练脚本的完整源代码可在该目录 examples/stack_llama_2 处找到训好的已合并模型也已上传至 HF Hub (见 此处)。 你可以在 这儿 找到我们的模型在训练过程的 WandB 日志其中包含了 DPOTrainer 在训练和评估期间记录下来的以下奖励指标: rewards/chosen (较优回答的奖励) : 针对较优回答策略模型与参考模型的对数概率二者之差的均值按 beta 缩放。rewards/rejected (较劣回答的奖励) : 针对较劣回答策略模型与参考模型的对数概率二者之差的均值按 beta 缩放。rewards/accuracy (奖励准确率) : 较优回答的奖励大于相应较劣回答的奖励的频率的均值rewards/margins (奖励余裕值) : 较优回答的奖励与相应较劣回答的奖励二者之差的均值。 直观上讲在训练过程中我们希望余裕值增加并且准确率达到 1.0换句话说较优回答的奖励高于较劣回答的奖励 (或余裕值大于零)。随后我们还可以在评估数据集上计算这些指标。 我们希望我们代码的发布可以降低读者的入门门槛让大家可以在自己的数据集上尝试这种大语言模型对齐方法我们迫不及待地想看到你会用它做哪些事情如果你想试试我们训练出来的模型可以玩玩这个 space: trl-lib/stack-llama。 宝子们可以戳 阅读原文 查看文中所有的外部链接哟 英文原文: https://hf.co/blog/dpo-trl 原文作者: Kashif Rasul, Younes Belkada, Leandro von Werra 译者: Matrix Yao (姚伟峰)英特尔深度学习工程师工作方向为 transformer-family 模型在各模态数据上的应用及大规模模型的训练推理。 审校/排版: zhongdongy (阿东)