使用直接偏好最佳化方法對LLM進行偏好調整
附錄
在諮詢了 IPO 論文的作者後,我們發現 TRL 中 IPO 的實現是不正確的;特別是,完成的對數似然損失需要**平均**而不是**求和**。我們已經在 此 PR 中添加了修復並重新運行了實驗。結果現在與論文一致,在配對偏好設定中,IPO 與 DPO 不相上下,並且表現優於 KTO。我們已更新帖子以反映這些新結果。
摘要
我們評估了三種很有前景的無需強化學習(或偏好調整)即可對齊語言模型的方法,並在多個模型和超引數設定上進行了測試。我們特別使用不同的超引數進行訓練,並評估了
- 直接偏好最佳化 (DPO)
- 身份偏好最佳化 (IPO)
- 卡尼曼-特沃斯基最佳化 (KTO)
引言
在這篇文章中,我們對三種很有前景的LLM對齊演算法進行了實證評估:直接偏好最佳化 (DPO)、身份偏好最佳化 (IPO) 和卡尼曼-特沃斯基最佳化 (KTO)。我們的實驗在兩個高質量的7b LLM上進行,這些LLM已經經過了有監督的微調步驟,但尚未進行偏好對齊。我們發現,雖然一種演算法明顯優於其他演算法,但必須調整關鍵的超引數才能獲得最佳結果。
無需強化學習的對齊
![]() |
---|
圖片來自 DPO 論文(https://arxiv.org/abs/2305.18290) |
直接偏好最佳化 (DPO) 已成為將大型語言模型 (LLM) 與人類或 AI 偏好對齊的一種有前景的替代方案。與基於強化學習的傳統對齊方法不同,DPO 將對齊公式重新定義為一個簡單的損失函式,可以直接在偏好資料集 上直接最佳化,其中 是一個提示, 是偏好和非偏好響應。
這使得 DPO 在實踐中易於使用,並已成功應用於訓練模型,如 Zephyr 和 Intel 的 NeuralChat。
DPO 的成功促使研究人員開發了新的損失函式,將該方法推廣到兩個主要方向:
- **魯棒性**:DPO 的一個缺點是它傾向於快速過擬合偏好資料集。為了避免這種情況,Google DeepMind 的研究人員引入了 身份偏好最佳化 (IPO),它在 DPO 損失中添加了一個正則化項,使人們無需早期停止等技巧即可訓練模型收斂。
- **完全不使用配對偏好資料**:像大多數對齊方法一樣,DPO 需要一個配對偏好資料集 ,其中註釋者根據一組標準(如有用性或有害性)標記哪個響應更好。實際上,建立這些資料集是一項耗時且昂貴的工作。ContextualAI 最近提出了一種有趣的替代方案,稱為 卡尼曼-特沃斯基最佳化 (KTO),它完全根據被標記為“好”或“壞”的單個示例來定義損失函式(例如,在聊天 UI 中看到的 👍 或 👎 圖示)。這些標籤在實踐中更容易獲取,KTO 是一種有前景的持續更新生產環境中執行的聊天模型的方式。
與此同時,這些不同的方法都有超引數,其中最重要的是 ,它控制參考模型的偏好權重。隨著這些替代方案現在透過 🤗 TRL 等庫在從業者的武器庫中可用,一個自然而然的問題是,這些方法和超引數中哪一種能產生最佳的聊天模型?
本文旨在透過對這三種方法進行實證分析來回答這個問題。我們將掃描關鍵超引數,如 和訓練步數,然後透過 MT-Bench 評估所得模型的效能,MT-Bench 是一個衡量聊天模型能力的常用基準。
我們提供了開原始碼,可以在 🤗 alignment-handbook 的最新更新中復現這些結果。
讓我們開始吧!
連結
以下是與我們分析相關的重要連結:
- 執行超引數掃描的程式碼和配置檔案:https://github.com/huggingface/alignment-handbook/tree/main/recipes/pref_align_scan
- 📚 我們使用的資料集和模型集合:https://huggingface.co/collections/alignment-handbook/dpo-vs-kto-vs-ipo-65a69c5f03548d61dbe29ef8
實驗設定
在進行對齊實驗時,需要考慮兩個主要因素:我們選擇最佳化的模型和對齊資料集。為了獲得更多獨立資料點,我們考慮了兩個模型:OpenHermes-2.5-Mistral-7B 和 Zephyr-7b-beta-sft,以及兩個對齊資料集:Intel 的 orca_dpo_pairs 和 ultrafeedback-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 模型,我們觀察到在最低 值 0.01 時,效能最佳。這在所有三種測試演算法中都是一致的,對於社群來說,一個有趣的後續實驗是在 0.0-0.2 範圍內進行精細掃描。雖然 DPO 可以實現最高的 MT Bench 分數,但我們發現在除一種設定外,KTO(配對)都取得了更好的結果。IPO 儘管具有更強的理論保證,但在除一種設定外,其表現似乎比基礎模型更差。
我們可以根據 MT Bench 評估的類別對每種演算法的最佳結果進行細分,以確定這些模型的優缺點。在推理、編碼和數學方面仍有很大的改進空間。
OpenHermes-7b-2.5
雖然對 OpenHermes 的每種演算法的觀察結果保持不變,即 DPO > KTO > IPO,但 的最佳選擇在每種演算法之間差異很大。DPO、KTO 和 IPO 的最佳 分別為 0.6、0.3 和 0.01。
OpenHermes-7b-2.5 顯然是一個更強的基礎模型,在偏好對齊後,MT Bench 分數僅提高了 0.3。
總結與見解
在這篇文章中,我們強調了在進行偏好對齊時選擇正確超引數集的重要性。我們透過實驗證明,DPO 和 IPO 可以取得可比的結果,在配對偏好設定中優於 KTO。
所有復現這些結果的程式碼和配置檔案現在都可以在 alignment-handbook 中找到。效能最佳的模型和資料集可以在 此集合 中找到。
接下來呢?
我們將繼續在 TRL 中實現新的偏好對齊演算法並評估其效能。至少目前看來,DPO 是最穩健且效能最佳的 LLM 對齊演算法。KTO 仍然是一個有趣的發展,因為 DPO 和 IPO 都需要成對的偏好資料,而 KTO 可以應用於任何響應被評為正面或負面的資料集。
我們期待 2024 年將開發出新的工具和技術!