使用直接偏好优化方法对LLM进行偏好调整

发布于 2024 年 1 月 18 日
在 GitHub 上更新

附录

在咨询了 IPO 论文的作者后,我们发现 TRL 中 IPO 的实现是不正确的;特别是,完成的对数似然损失需要**平均**而不是**求和**。我们已经在 此 PR 中添加了修复并重新运行了实验。结果现在与论文一致,在配对偏好设置中,IPO 与 DPO 不相上下,并且表现优于 KTO。我们已更新帖子以反映这些新结果。

摘要

我们评估了三种很有前景的无需强化学习(或偏好调整)即可对齐语言模型的方法,并在多个模型和超参数设置上进行了测试。我们特别使用不同的超参数进行训练,并评估了

引言

在这篇文章中,我们对三种很有前景的LLM对齐算法进行了实证评估:直接偏好优化 (DPO)、身份偏好优化 (IPO) 和卡尼曼-特沃斯基优化 (KTO)。我们的实验在两个高质量的7b LLM上进行,这些LLM已经经过了有监督的微调步骤,但尚未进行偏好对齐。我们发现,虽然一种算法明显优于其他算法,但必须调整关键的超参数才能获得最佳结果。

无需强化学习的对齐

Image from the DPO paper ([https://arxiv.org/abs/2305.18290](https://arxiv.org/pdf/2305.18290.pdf))
图片来自 DPO 论文(https://arxiv.org/abs/2305.18290

直接偏好优化 (DPO) 已成为将大型语言模型 (LLM) 与人类或 AI 偏好对齐的一种有前景的替代方案。与基于强化学习的传统对齐方法不同,DPO 将对齐公式重新定义为一个简单的损失函数,可以直接在偏好数据集 {(x,yw,yl)} \{(x, y_w, y_l)\} 上直接优化,其中 xx 是一个提示,yw,yly_w,y_l 是偏好和非偏好响应。

Sample preference dataset
偏好调整数据集示例。

这使得 DPO 在实践中易于使用,并已成功应用于训练模型,如 ZephyrIntel 的 NeuralChat

DPO 的成功促使研究人员开发了新的损失函数,将该方法推广到两个主要方向:

  • **鲁棒性**:DPO 的一个缺点是它倾向于快速过拟合偏好数据集。为了避免这种情况,Google DeepMind 的研究人员引入了 身份偏好优化 (IPO),它在 DPO 损失中添加了一个正则化项,使人们无需早期停止等技巧即可训练模型收敛。
  • **完全不使用配对偏好数据**:像大多数对齐方法一样,DPO 需要一个配对偏好数据集 {(x,yw,yl)} \{(x, y_w, y_l)\} ,其中注释者根据一组标准(如有用性或有害性)标记哪个响应更好。实际上,创建这些数据集是一项耗时且昂贵的工作。ContextualAI 最近提出了一种有趣的替代方案,称为 卡尼曼-特沃斯基优化 (KTO),它完全根据被标记为“好”或“坏”的单个示例来定义损失函数(例如,在聊天 UI 中看到的 👍 或 👎 图标)。这些标签在实践中更容易获取,KTO 是一种有前景的持续更新生产环境中运行的聊天模型的方式。

与此同时,这些不同的方法都有超参数,其中最重要的是 β \beta ,它控制参考模型的偏好权重。随着这些替代方案现在通过 🤗 TRL 等库在从业者的武器库中可用,一个自然而然的问题是,这些方法和超参数中哪一种能产生最佳的聊天模型?

本文旨在通过对这三种方法进行实证分析来回答这个问题。我们将扫描关键超参数,如 β\beta 和训练步数,然后通过 MT-Bench 评估所得模型的性能,MT-Bench 是一个衡量聊天模型能力的常用基准。

我们提供了开源代码,可以在 🤗 alignment-handbook 的最新更新中复现这些结果。

让我们开始吧!

链接

以下是与我们分析相关的重要链接:

实验设置

在进行对齐实验时,需要考虑两个主要因素:我们选择优化的模型和对齐数据集。为了获得更多独立数据点,我们考虑了两个模型:OpenHermes-2.5-Mistral-7BZephyr-7b-beta-sft,以及两个对齐数据集:Intel 的 orca_dpo_pairsultrafeedback-binarized 数据集。

对于第一个实验,我们使用了 OpenHermes-2.5-Mistral-7B,因为它是最好的 7B 参数聊天模型之一,尚未受到任何对齐技术的处理。然后,我们使用了 Intel 的 `orca_dpo_pairs` 数据集,该数据集包含 13k 个提示,其中选择的响应由 GPT-4 生成,不想要的响应由 Llama-Chat 13b 生成。这是 NeuralChat 和 NeuralHermes-2.5-Mistral-7B 背后的数据集。由于 KTO 本身不需要成对偏好,我们简单地将 GPT-4 的响应视为“好”标签,将 Llama-Chat 13b 的响应视为“坏”标签。虽然 GPT-4 的响应可能优于 Llama-Chat 13b,但在某些情况下,Llama-Chat-13b 可能会产生更好的响应,我们认为这只占少数示例。

第二个实验对Zephyr-7b-beta-sft模型与ultrafeedback-binarized数据集进行了偏好对齐,该数据集包含66k个带有选择和拒绝响应对的提示。该数据集用于训练原始的Zephyr模型,该模型当时在众多自动化基准和人工评估中都是同类最佳的7B模型。

配置实验

对齐手册提供了一种轻松配置单个实验的方法,这些参数用于配置 run_dpo.py 脚本。

# Model arguments
model_name_or_path: teknium/OpenHermes-2.5-Mistral-7B
torch_dtype: null

# Data training arguments
dataset_mixer:
  HuggingFaceH4/orca_dpo_pairs: 1.0
dataset_splits:
- train_prefs
- test_prefs
preprocessing_num_workers: 12

# Training arguments with sensible defaults
bf16: true
beta: 0.01
loss_type: sigmoid
do_eval: true
do_train: true
evaluation_strategy: steps
eval_steps: 100
gradient_accumulation_steps: 2
gradient_checkpointing: true
gradient_checkpointing_kwargs:
  use_reentrant: False
hub_model_id: HuggingFaceH4/openhermes-2.5-mistral-7b-dpo
hub_model_revision: v1.0

learning_rate: 5.0e-7
logging_steps: 10
lr_scheduler_type: cosine
max_prompt_length: 512
num_train_epochs: 1
optim: adamw_torch
output_dir: data/openhermes-2.5-mistral-7b-dpo-v1.0
per_device_train_batch_size: 8
per_device_eval_batch_size: 8
push_to_hub_revision: true
save_strategy: "steps"
save_steps: 100
save_total_limit: 1
seed: 42
warmup_ratio: 0.1

我们为 Zephyr 实验创建了一个类似的基准配置文件。

聊天模板是自动从基础聊天模型中推断出来的,OpenHermes-2.5 使用 ChatML 格式,Zephyr 使用 H4 聊天模板。另外,如果您想使用自己的聊天格式,🤗 tokenizers 库现在已启用使用 jinja 格式字符串的用户自定义聊天模板

# Example of the Zephyr chat template
"{% for message in messages %}\n{% if message['role'] == 'user' %}\n{{ '<|user|>\n' + message['content'] + eos_token }}\n{% elif message['role'] == 'system' %}\n{{ '<|system|>\n' + message['content'] + eos_token }}\n{% elif message['role'] == 'assistant' %}\n{{ '<|assistant|>\n'  + message['content'] + eos_token }}\n{% endif %}\n{% if loop.last and add_generation_prompt %}\n{{ '<|assistant|>' }}\n{% endif %}\n{% endfor %}"

它将对话格式化如下

# <|system|>
# You are a friendly chatbot who always responds in the style of a pirate.</s>
# <|user|>
# How many helicopters can a human eat in one sitting?</s>
# <|assistant|>
# Ah, me hearty matey! But yer question be a puzzler! A human cannot eat a helicopter in one sitting, as helicopters are not edible. They be made of metal, plastic, and other materials, not food!

超参数扫描

我们通过 `loss_type` 参数训练了 `DPO`、`IPO` 和 `KTO` 方法,TRL 的 `DPOTrainer` 中的 `beta` 从 `0.01`、`0.1`、`0.2`、...、`0.9` 递增。我们包含了 `0.01`,因为我们观察到某些对齐算法对该参数特别敏感。所有实验都训练了一个 epoch。所有其他超参数在每次运行中都保持不变,包括随机种子。

然后,我们使用上面定义的基本配置,在 Hugging Face 集群上启动了扫描。#GPURICH

#!/bin/bash
# Define an array containing the base configs we wish to fine tune
configs=("zephyr" "openhermes")
# Define an array of loss types
loss_types=("sigmoid" "kto_pair" "ipo")
# Define an array of beta values
betas=("0.01" "0.1" "0.2" "0.3" "0.4" "0.5" "0.6" "0.7" "0.8" "0.9")

# Outer loop for loss types
for config in "${configs[@]}"; do
    for loss_type in "${loss_types[@]}"; do
        # Inner loop for beta values
        for beta in "${betas[@]}"; do
            # Determine the job name and model revision based on loss type
            job_name="$config_${loss_type}_beta_${beta}"
            model_revision="${loss_type}-${beta}"
            # Submit the job
            sbatch --job-name=${job_name} recipes/launch.slurm dpo pref_align_scan config_$config deepspeed_zero3 \\
            "--beta=${beta} --loss_type=${loss_type} --output_dir=data/$config-7b-align-scan-${loss_type}-beta-${beta} --hub_model_revision=${model_revision}"
        done
    done
done

结果

我们使用 MT Bench 评估了所有模型,MT Bench 是一个多轮基准测试,使用 GPT-4 评估模型在八个不同类别中的性能:写作、角色扮演、推理、数学、编程、提取、STEM 和人文。尽管不完美,MT Bench 是评估会话式 LLM 的好方法。

Zephyr-7b-beta-SFT

Zephyr comparison
不同 β \beta 值下 Zephyr 模型的 MT-Bench 分数。

对于 Zephyr 模型,我们观察到在最低 β \beta 值 0.01 时,性能最佳。这在所有三种测试算法中都是一致的,对于社区来说,一个有趣的后续实验是在 0.0-0.2 范围内进行精细扫描。虽然 DPO 可以实现最高的 MT Bench 分数,但我们发现在除一种设置外,KTO(配对)都取得了更好的结果。IPO 尽管具有更强的理论保证,但在除一种设置外,其表现似乎比基础模型更差。

Zephyr scan
MT Bench 各类别中每种算法的最佳 Zephyr 模型细分。

我们可以根据 MT Bench 评估的类别对每种算法的最佳结果进行细分,以确定这些模型的优缺点。在推理、编码和数学方面仍有很大的改进空间。

OpenHermes-7b-2.5

虽然对 OpenHermes 的每种算法的观察结果保持不变,即 DPO > KTO > IPO,但 β \beta 的最佳选择在每种算法之间差异很大。DPO、KTO 和 IPO 的最佳 β \beta 分别为 0.6、0.3 和 0.01。

OpenHermes comparison
OpenHermes 模型在不同 β \beta 值下的 MT Bench 分数。

OpenHermes-7b-2.5 显然是一个更强的基础模型,在偏好对齐后,MT Bench 分数仅提高了 0.3。

OpenHermes scan
MT Bench 各类别中每种算法的最佳 OpenHermes 模型细分。

总结与见解

在这篇文章中,我们强调了在进行偏好对齐时选择正确超参数集的重要性。我们通过实验证明,DPO 和 IPO 可以取得可比的结果,在配对偏好设置中优于 KTO。

所有复现这些结果的代码和配置文件现在都可以在 alignment-handbook 中找到。性能最佳的模型和数据集可以在 此集合 中找到。

接下来呢?

我们将继续在 TRL 中实现新的偏好对齐算法并评估其性能。至少目前看来,DPO 是最稳健且性能最佳的 LLM 对齐算法。KTO 仍然是一个有趣的发展,因为 DPO 和 IPO 都需要成对的偏好数据,而 KTO 可以应用于任何响应被评为正面或负面的数据集。

我们期待 2024 年将开发出新的工具和技术!

社区

注册登录以评论