searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

直接偏好优化(DPO)

2024-05-28 02:19:37
44
0
DPO 是一种旨在实现对 LLMs 精确控制的方法。RLHF 基于首先训练奖励模型,然后使用 Proximal Policy Optimization(PPO)来使语言模型的输出与人类偏好保持一致。尽管这种方法有效,但它复杂且不稳定。
相反,DPO 将受限制的奖励最大化问题视为人类偏好数据的分类问题。这种方法稳定、高效且计算轻量。它消除了对奖励模型拟合、大量采样和超参数调整的需求。

直接偏好优化(DPO)

1 、背景

DPO 是一种旨在实现对 LLMs 精确控制的方法。RLHF 基于首先训练奖励模型,然后使用 Proximal Policy Optimization(PPO)来使语言模型的输出与人类偏好保持一致。尽管这种方法有效,但它复杂且不稳定。

相反,DPO 将受限制的奖励最大化问题视为人类偏好数据的分类问题。这种方法稳定、高效且计算轻量。它消除了对奖励模型拟合、大量采样和超参数调整的需求。

 

2 、定义

undefined 直接偏好优化(DPO)算法也是一种用于语言模型偏好对齐的方法,无需从LM中采样,也无需使用RL即可使LM与人类偏好对齐。DPO仍然优化与RLHF相同的目标,但纯粹通过监督学习实现。因此这可以让训练过程变得更加简单。

undefined DPO通过直接优化语言模型以符合人类偏好,无需显性奖励模型或强化学习该算法隐式地优化与现有 RLHF 算法相同的目标(奖励最大化,带有 KL 散度约束),但易于实现且容易训练

undefined 直接偏好优化(DPO)是一种稳定、高性能且计算量较轻的算法。与其前身 RLHF 不同,DPO 无需拟合奖励模型,也不需要在微调期间从语言模型中采样或进行重要的超参数调整。

 

 

3 、DPO 工作原理

DPO 过程可以分为两个主要阶段:

1.  监督微调(SFT):初始步骤,模型在感兴趣的数据集上进行微调。提供了特定输入与期望输出之间的清晰映射。特别是在与偏好学习相结合时,SFT 的本质是根据人类定义的标准调整模型的响应,确保其更加贴近特定要求

2.  偏好学习:在 SFT 之后,模型使用偏好数据进行偏好学习,理想情况下,这些数据来自与 SFT 示例相同的分布。

 

DPO的美在于其简洁性。它不是先训练一个奖励模型,然后基于该模型优化策略,而是直接将偏好损失定义为策略的函数。这意味着没有必要先训练一个奖励模型。

在微调阶段,DPO 使用 LLM 作为奖励模型。它使用二元交叉熵目标优化策略,利用人类偏好数据来确定哪些响应是首选的,哪些是不首选的。通过将模型的响应与首选响应进行比较,调整策略以增强其性能。

 

1)监督微调

标注数据集提供了特定输入与期望输出之间的清晰映射。SFT的本质,特别是当与偏好学习结合时,是根据人为定义的标准塑造模型的响应,确保它更紧密地与特定要求对齐。

 

2)偏好数据

偏好数据是针对特定提示精选的一组选项或替代方案。然后,标注员根据特定指南评估这些选项。目标是将这些选项从最受欢迎的排到最不受欢迎的。这种排名提供了人类偏好的洞察,用于微调模型以产生符合人类期望的输出。

 

偏好数据基本上由三元组的数据集(提示、选择的答案、拒绝的答案)组成。换句话说,对于每个提示,都有一个更好的响应和一个更差的响应。

 

此类数据用于 RLHF ,目的是训练奖励模型,随后用于通过强化学习训练模型。在 DPO 中,没有强化学习,模型直接在这个偏好数据中进行优化。

 

创建偏好数据的过程包含几个步骤:

1.  提示选择:PD 的基础是提示。有各种策略可以选择提示。有些人可能选择预定义的一组提示,而其他人可能使用模板动态生成提示。另一种方法是将预定义的提示与从数据库中随机获取的随机提示相结合。

2.  答案选择:一旦确定提示,下一步是确定答案。这些答案可以从特定版本的模型或各种检查点生成。要排名的答案数量可能不同。有些人喜欢二进制排名系统(最佳 - 最差),其他人更喜欢更精细的方法,将答案在 1 到 5 的范围内排名。

3.  注释指南:拥有明确的注释指南至关重要。这些指南确保排名过程是标准化的,并最小化个体偏见或解释。

 

偏好数据的公共数据集

目前有许多数据集可供需要偏好数据的人使用。例如:

undefined OpenAI WebGPT Comparisons:该数据集提供 20,000 个比较,每个比较包括一个问题、一对模型答案和每个答案的人工评分。

undefined OpenAI Summarization:该数据集提供 六万四千个文本摘要示例,包括人类编写的响应和模型评定的响应。

undefined Reddit ELI5:从问答子论坛中获取的这个数据集包含 27 万个问题、答案和分数的示例。

undefined Human ChatGPT Comparison Corpus (HC3):该数据集为大约24,000 个问题提供 60,000 个人类答案和 27,000 个 ChatGPT 答案。

 

4、 loss推导

1.  通过最优策略来表达奖励函数

RLHF的优化目标对于最优策略π_r有一个精确的(非参数化)解。

这个表达式在强化学习里边是很常见的,也被称为Boltzmann策略。

因为分区函数Z(x),导致的这个解本身难以处理,但它可以用来表达出奖励作为最优策略的函数。

2.  奖励差异目标

为简单起见,假设每个输入只处理2个答案,然后将它们分别表示为 y_w 和 y_l。然后通过最小化损失来学习奖励。

3.  dpo 目标函数

将第一步中的策略的表达式代入第二步的损失函数后,Z(x) 就会被抵消掉了。将最优的 替换为参数化的,就得到了 DPO 目标。

在dpo的思想中,与其首先学习奖励然后找到优化策略,不如直接找到最优策略,使得从第一步获得的奖励对应于收集的人类偏好。虽然奖励本身很难学习,但是2个结果之间的奖励差异是比较容易训练。

 

5 、实验

TRL(Transformer Reinforcement Learning)库通过其 DPO Trainer 提供了一种简化的方法。

监督微调(SFT)

从训练 SFT 模型开始。确保用于SFT的数据是在分布中的,为 DPO 算法有效工作奠定基础。

Python from transformers import AutoModelForCausalLM from datasets import load_dataset from trl import SFTTrainer dataset = load_dataset("your-domain-dataset", split="train") model = AutoModelForCausalLM.from_pretrained("your-foundation-model-of-choice") trainer = SFTTrainer( model, train_dataset=dataset, dataset_text_field="text", max_seq_length=512, ) trainer.train()

数据集

DPO Trainer 需要特定的数据集格式。鉴于模型被训练为直接优化两个句子之间的偏好,数据集应反映此结构。

数据集包括三个关键字段:

undefined prompt:包含上下文输入。

undefined chosen:包含相应的已选择响应。

undefined rejected:列出相应的拒绝响应。需要注意的是,单个提示可能对应于数据集数组中的多个响应,这在数据集的数组中反映了重复的条目。

例如,一个样本数据集可能如下所示:

Python dpo_dataset_dict = { "prompt": ["hello", "how are you", …], "chosen": ["hi, nice to meet you", "I am fine", …], "rejected": ["leave me alone", "I am not fine", …], }

使用 DPOTrainer 启动过程时,初始化 DPOTrainer。这涉及指定要训练的模型、一个参考「ref_model」(用于计算首选和拒绝响应的隐式奖励的参考模型)、「 beta 」超参数以及包含三个前述条目的数据集。

Python dpo_trainer = DPOTrainer( model, model_ref, args=training_args, beta=0.1, train_dataset=train_dataset, tokenizer=tokenizer, ) dpo_trainer.train()

「 beta 」参数是 DPO 损失的温度参数,通常在 0.1 到 0.5 之间。随着 「 beta 」 接近 0,参考模型被忽略。

0条评论
0 / 1000
w****n
2文章数
0粉丝数
w****n
2 文章 | 0 粉丝
w****n
2文章数
0粉丝数
w****n
2 文章 | 0 粉丝
原创

直接偏好优化(DPO)

2024-05-28 02:19:37
44
0
DPO 是一种旨在实现对 LLMs 精确控制的方法。RLHF 基于首先训练奖励模型,然后使用 Proximal Policy Optimization(PPO)来使语言模型的输出与人类偏好保持一致。尽管这种方法有效,但它复杂且不稳定。
相反,DPO 将受限制的奖励最大化问题视为人类偏好数据的分类问题。这种方法稳定、高效且计算轻量。它消除了对奖励模型拟合、大量采样和超参数调整的需求。

直接偏好优化(DPO)

1 、背景

DPO 是一种旨在实现对 LLMs 精确控制的方法。RLHF 基于首先训练奖励模型,然后使用 Proximal Policy Optimization(PPO)来使语言模型的输出与人类偏好保持一致。尽管这种方法有效,但它复杂且不稳定。

相反,DPO 将受限制的奖励最大化问题视为人类偏好数据的分类问题。这种方法稳定、高效且计算轻量。它消除了对奖励模型拟合、大量采样和超参数调整的需求。

 

2 、定义

undefined 直接偏好优化(DPO)算法也是一种用于语言模型偏好对齐的方法,无需从LM中采样,也无需使用RL即可使LM与人类偏好对齐。DPO仍然优化与RLHF相同的目标,但纯粹通过监督学习实现。因此这可以让训练过程变得更加简单。

undefined DPO通过直接优化语言模型以符合人类偏好,无需显性奖励模型或强化学习该算法隐式地优化与现有 RLHF 算法相同的目标(奖励最大化,带有 KL 散度约束),但易于实现且容易训练

undefined 直接偏好优化(DPO)是一种稳定、高性能且计算量较轻的算法。与其前身 RLHF 不同,DPO 无需拟合奖励模型,也不需要在微调期间从语言模型中采样或进行重要的超参数调整。

 

 

3 、DPO 工作原理

DPO 过程可以分为两个主要阶段:

1.  监督微调(SFT):初始步骤,模型在感兴趣的数据集上进行微调。提供了特定输入与期望输出之间的清晰映射。特别是在与偏好学习相结合时,SFT 的本质是根据人类定义的标准调整模型的响应,确保其更加贴近特定要求

2.  偏好学习:在 SFT 之后,模型使用偏好数据进行偏好学习,理想情况下,这些数据来自与 SFT 示例相同的分布。

 

DPO的美在于其简洁性。它不是先训练一个奖励模型,然后基于该模型优化策略,而是直接将偏好损失定义为策略的函数。这意味着没有必要先训练一个奖励模型。

在微调阶段,DPO 使用 LLM 作为奖励模型。它使用二元交叉熵目标优化策略,利用人类偏好数据来确定哪些响应是首选的,哪些是不首选的。通过将模型的响应与首选响应进行比较,调整策略以增强其性能。

 

1)监督微调

标注数据集提供了特定输入与期望输出之间的清晰映射。SFT的本质,特别是当与偏好学习结合时,是根据人为定义的标准塑造模型的响应,确保它更紧密地与特定要求对齐。

 

2)偏好数据

偏好数据是针对特定提示精选的一组选项或替代方案。然后,标注员根据特定指南评估这些选项。目标是将这些选项从最受欢迎的排到最不受欢迎的。这种排名提供了人类偏好的洞察,用于微调模型以产生符合人类期望的输出。

 

偏好数据基本上由三元组的数据集(提示、选择的答案、拒绝的答案)组成。换句话说,对于每个提示,都有一个更好的响应和一个更差的响应。

 

此类数据用于 RLHF ,目的是训练奖励模型,随后用于通过强化学习训练模型。在 DPO 中,没有强化学习,模型直接在这个偏好数据中进行优化。

 

创建偏好数据的过程包含几个步骤:

1.  提示选择:PD 的基础是提示。有各种策略可以选择提示。有些人可能选择预定义的一组提示,而其他人可能使用模板动态生成提示。另一种方法是将预定义的提示与从数据库中随机获取的随机提示相结合。

2.  答案选择:一旦确定提示,下一步是确定答案。这些答案可以从特定版本的模型或各种检查点生成。要排名的答案数量可能不同。有些人喜欢二进制排名系统(最佳 - 最差),其他人更喜欢更精细的方法,将答案在 1 到 5 的范围内排名。

3.  注释指南:拥有明确的注释指南至关重要。这些指南确保排名过程是标准化的,并最小化个体偏见或解释。

 

偏好数据的公共数据集

目前有许多数据集可供需要偏好数据的人使用。例如:

undefined OpenAI WebGPT Comparisons:该数据集提供 20,000 个比较,每个比较包括一个问题、一对模型答案和每个答案的人工评分。

undefined OpenAI Summarization:该数据集提供 六万四千个文本摘要示例,包括人类编写的响应和模型评定的响应。

undefined Reddit ELI5:从问答子论坛中获取的这个数据集包含 27 万个问题、答案和分数的示例。

undefined Human ChatGPT Comparison Corpus (HC3):该数据集为大约24,000 个问题提供 60,000 个人类答案和 27,000 个 ChatGPT 答案。

 

4、 loss推导

1.  通过最优策略来表达奖励函数

RLHF的优化目标对于最优策略π_r有一个精确的(非参数化)解。

这个表达式在强化学习里边是很常见的,也被称为Boltzmann策略。

因为分区函数Z(x),导致的这个解本身难以处理,但它可以用来表达出奖励作为最优策略的函数。

2.  奖励差异目标

为简单起见,假设每个输入只处理2个答案,然后将它们分别表示为 y_w 和 y_l。然后通过最小化损失来学习奖励。

3.  dpo 目标函数

将第一步中的策略的表达式代入第二步的损失函数后,Z(x) 就会被抵消掉了。将最优的 替换为参数化的,就得到了 DPO 目标。

在dpo的思想中,与其首先学习奖励然后找到优化策略,不如直接找到最优策略,使得从第一步获得的奖励对应于收集的人类偏好。虽然奖励本身很难学习,但是2个结果之间的奖励差异是比较容易训练。

 

5 、实验

TRL(Transformer Reinforcement Learning)库通过其 DPO Trainer 提供了一种简化的方法。

监督微调(SFT)

从训练 SFT 模型开始。确保用于SFT的数据是在分布中的,为 DPO 算法有效工作奠定基础。

Python from transformers import AutoModelForCausalLM from datasets import load_dataset from trl import SFTTrainer dataset = load_dataset("your-domain-dataset", split="train") model = AutoModelForCausalLM.from_pretrained("your-foundation-model-of-choice") trainer = SFTTrainer( model, train_dataset=dataset, dataset_text_field="text", max_seq_length=512, ) trainer.train()

数据集

DPO Trainer 需要特定的数据集格式。鉴于模型被训练为直接优化两个句子之间的偏好,数据集应反映此结构。

数据集包括三个关键字段:

undefined prompt:包含上下文输入。

undefined chosen:包含相应的已选择响应。

undefined rejected:列出相应的拒绝响应。需要注意的是,单个提示可能对应于数据集数组中的多个响应,这在数据集的数组中反映了重复的条目。

例如,一个样本数据集可能如下所示:

Python dpo_dataset_dict = { "prompt": ["hello", "how are you", …], "chosen": ["hi, nice to meet you", "I am fine", …], "rejected": ["leave me alone", "I am not fine", …], }

使用 DPOTrainer 启动过程时,初始化 DPOTrainer。这涉及指定要训练的模型、一个参考「ref_model」(用于计算首选和拒绝响应的隐式奖励的参考模型)、「 beta 」超参数以及包含三个前述条目的数据集。

Python dpo_trainer = DPOTrainer( model, model_ref, args=training_args, beta=0.1, train_dataset=train_dataset, tokenizer=tokenizer, ) dpo_trainer.train()

「 beta 」参数是 DPO 损失的温度参数,通常在 0.1 到 0.5 之间。随着 「 beta 」 接近 0,参考模型被忽略。

文章来自个人专栏
大模型-王
2 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0