【翻译】Direct Preference Optimization(DPO)你的语言模型实际上是一个奖励模型

原文:https://arxiv.org/abs/2305.18290 (来自斯坦福大学的研究)

摘要

虽然大规模无监督语言模型(Im)学习了广泛的世界知识和一些推理技能,但由于其训练的完全无监督性质,很难实现对其行为的精确控制。获得这种可控性的现有方法收集模型生成的相对质量的人工标记,并微调无监督LM以符合这些偏好,通常通过人工反馈的强化学习(RLHF)。然而,RLHF是一个复杂且往往不稳定的过程,首先拟合反映人类偏好的奖励模型,然后使用强化学习对大型无监督LM进行微调,以在不偏离原始模型太远的情况下最大化该估计奖励。Inthis paperwe introduce a new parameterization of the reward model in RLHF that enables extraction of the corresponding optimal policy in closed form, allowing us to solvethe standard RLHF problem with only a simple classification loss.由此产生的算法,称为直接偏好优化(DPO),是稳定、高性能和计算量轻的,消除了在微调或执行重要的超参数调优期间从LM中采样的需要。实验表明,DPO可以微调语言模型以符合人类偏好,以及或优于现有方法。值得注意的是,DPO的微调在控制代的情感方面超过了基于ppo的RLHF,并匹配或提高了摘要和单回合对话的响应质量,同时大大简化了实现和训练。

1 简介

在超大数据集上训练的大型无监督语言模型(Im)获得惊人的能力[11,7,42,8]。然而,这些模型是在具有各种目标、优先级和技能的人类产生的数据上进行训练的。其中一些目标和技能可能不值得模仿;例如,虽然我们可能希望我们的AI编码助手理解常见的编程错误以纠正它们,然而,在生成代码时,我们希望使我们的模型倾向于其训练数据中存在的(可能罕见的)高质量编码能力。类似地,我们可能希望我们的语言模型是意识到的一个常见误解,50%的人相信,但我们当然不希望模型声称这种误解在50%的查询中是正确的!换句话说,从非常广泛的知识与能力中选择模型的期望的反应和行为对于构建安全、高性能和可控的AI系统[28]至关重要。虽然现有方法通常使用强化学习(RL)引导语言模型匹配人类偏好,但本文将表明,现有方法使用的基于强化学习的目标可以用一个简单的二进制交叉嫡目标进行精确优化,大大简化了偏好学习管道。

在高层次上,现有方法使用精选的人类偏好集,将所需的行为灌输到语言模型中,这些偏好集代表了人类认为安全和有帮助的行为类型。这个偏好学习阶段发生在对大型文本数据集进行大规模无监督预训练的初始阶段之后。虽然偏好学习最直接的方法是对高质量响应的人类演示进行有监督的微调,但最成功的一类方法是从人类(或AI)反馈中强化学习(RLHF/RLAIF:[12,2])。RLHF方法将奖励模型与人类似好数据集拟合,然后使用RL优化语言模型策略,以产生分配高奖励的响应,而不会偏离原始模型太远。虽然RLHF产生的模型具有令人印象深刻的对话和编码能力,但RLHF管道比监督学习要复杂得多,涉及在训练循环中训练多个语言模型并从语言模型策略中采样,导致了巨大的计算成本。


本文展示了如何直接优化语言模型,以坚持人类的偏好,而不需要明确的奖励建模或强化学习。我们提议Direct Preference Optimization(DPO),一种隐式优化与现有RLHF算法相同目标的算法(带有kl-散度约束的奖励最大化),但易于实现且训练简单。直观地说,DPO更新增加了首选响应相对于非首选响应的对数概率,但它包含了一个动态的、每个示例的重要性权重,以防止我们发现

### DPO方法微调模型的相关信息 DPODirect Preference Optimization)是一种用于优化大型语言模型的方法,它通过直接利用偏好数据来调整模型的行为。这种方法的核心在于不需要显式的奖励函数设计,而是直接从人类标注的数据中提取偏好信号并将其应用于模型的训练过程。 #### 1. **DPO的基本原理** DPO的目标是让模型生成的内容更加符合人类用户的期望。相比于传统的RLHF(Reinforcement Learning from Human Feedback),DPO简化了流程,减少了对复杂奖励模型的需求。具体来说,在DPO框架下,模型会接收一组输入以及对应的两个候选输出,并从中学习如何生成更优的结果[^1]。 #### 2. **实现中的注意事项** 当使用DPO方法进行微调时,需要注意以下几个方面: - **基础模型与LoRA结合** 微调过程中通常不会重新训练整个模型,而是采用参数高效微调技术如LoRA(Low-Rank Adaptation)。这意味着实际操作中需要加载基础模型和LoRA权重文件,并通过特定配置完成初始化工作 `model = get_peft_model(model, lora_config)`[^1]。 - **数据准备的重要性** 构造高质量的人类偏好排序数据集对于成功应用DPO至关重要。这些数据应包含成对或多组对比样本及其相对质量评价标签[^2]。 #### 3. **代码示例** 以下是基于PyTorch的一个简单DPO微调脚本: ```python from transformers import AutoModelForCausalLM, AutoTokenizer, PeftConfig, get_linear_schedule_with_warmup import torch.optim as optim from datasets import load_dataset # 加载预训练的基础模型和tokenizer base_model_name_or_path = "your_base_model" lora_config = ... # 定义LoRA配置 tokenizer = AutoTokenizer.from_pretrained(base_model_name_or_path) model = AutoModelForCausalLM.from_pretrained(base_model_name_or_path) # 应用PEFT (LoRA) 技术到基础模型上 peft_model_id = "path_to_lora_weights" config = PeftConfig.from_pretrained(peft_model_id) model = get_peft_model(model, config=lora_config) # 准备训练数据 dataset = load_dataset("your_preference_data") def collate_fn(batch): """自定义批处理逻辑""" ... optimizer = optim.AdamW(model.parameters(), lr=1e-4) scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps=0, num_training_steps=len(dataset)) for epoch in range(num_epochs): for batch in dataloader: outputs = model(**batch) loss = compute_dpo_loss(outputs, ...) # 计算DPO损失 loss.backward() optimizer.step() scheduler.step() model.save_pretrained("./fine_tuned_model") ``` 此段代码展示了如何设置环境、加载必要组件并通过循环迭代执行训练步骤的过程。 --- #### 4. **进一步说明** 尽管上述例子提供了基本指导方针,但在真实项目里还需要考虑更多细节问题比如超参调节、硬件资源分配等。此外值得注意的是,虽然DPO相比传统方法更为简便快捷,但它同样依赖于精心策划的数据采集环节以确保最终效果达到预期标准[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值