成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

ORPO偏好優化:性能和DPO一樣好并且更簡單的對齊方法

人工智能
現在有許多方法可以使大型語言模型(LLM)與人類偏好保持一致。以人類反饋為基礎的強化學習(RLHF)是最早的方法之一,并促成了ChatGPT的誕生,但RLHF的成本非常高。與RLHF相比,DPO、IPO和KTO的成本明顯更低,因為它們不需要獎勵模型。

現在有許多方法可以使大型語言模型(LLM)與人類偏好保持一致。以人類反饋為基礎的強化學習(RLHF)是最早的方法之一,并促成了ChatGPT的誕生,但RLHF的成本非常高。與RLHF相比,DPO、IPO和KTO的成本明顯更低,因為它們不需要獎勵模型。

雖然DPO和IPO的成本較低,但它們仍需訓練兩個不同的模型。首先是監督微調(SFT)步驟,即訓練模型按指令回答問題,然后使用SFT模型作為初始化和參考,以使模型與人類偏好一致。

ORPO是另一種新的LLM對齊方法,這種方法甚至不需要SFT模型。通過ORPO,LLM可以同時學習回答指令和滿足人類偏好。

在本文中,我將解釋ORPO并介紹其相關的內容,最后將展示如何使用消費級硬件將Mistral 7B轉換為聊天模型。

ORPO:Monolithic Preference Optimization without Reference Model

作者通過展示SFT步驟在對齊流程中并不理想來很好地論證了ORPO的動機。雖然在指令數據集上微調模型確實使模型適應在特定領域回答指令,但生成人類可能拒絕的答案的概率也增加了。

被選中和被拒絕的響應可能有很多共同點:相同的領域、相同的格式等,因此生成與任務相關但不正確的答案的概率增加。而DPO可以降低被拒絕響應的概率,同時增加被選擇響應的概率,即在上圖中的曲線之間增大差距。偏好優化技術是在包含以下內容的數據集上訓練的:

提示
 選擇的答案
 被拒絕的答案

對于STF,它是在與選擇的答案配對的提示上進行訓練的。用于sft的數據集可以與偏好優化使用的相同,但不包括"被拒絕"的答案。所以可以直觀地認為,應該能夠微調一個基礎LLM,使其在學習如何回答指令的同時,也學會懲罰和偏好某些答案。

ORPO就是在這個理論基礎上建立的,ORPO簡單地通過添加負對數似然損失與OR損失(OR代表奇異比)來修改訓練損失:

OR損失對被拒絕的答案進行弱懲罰,而對選擇的答案進行強有力的獎勵。這里包含了一個超參數lambda用于加權OR損失。

lambda設為0.1似乎效果不錯。如果設置為0.5,雖然區分選擇和拒絕輸出的能力更強,但選擇答案的概率也降低了。所以為了對于在拒絕錯誤答案比獲取正確答案更為關鍵的特定應用,可能將lambda設置為0.5會更好。

通過ORPO的損失,模型在學習了SFT期間的內容的同時,也學會了人類偏好。

但這種方法的一個缺點是,它可能需要更大的偏好數據集。

使用TRL運行ORPO

雖然這是今年3月分剛發布的論文,但是ORPO 已經可以在Hugging Face庫上使用了,并且它因為只修改了損失函數,所以可以很好的與現有的Lora方法集成,這里我們就演示如何將它與GaLora進行結合,訓練我們自己的模型。

首先,安裝依賴:

pip install -q -U bitsandbytes
 pip install --upgrade -q -U transformers
 pip install -q -U peft
 pip install -q -U accelerate
 pip install -q -U datasets
 pip install -q -U git+https://github.com/huggingface/trl.git

然后,導入庫:

import torch, multiprocessing
 from datasets import load_dataset
 from peft import LoraConfig, prepare_model_for_kbit_training
 from transformers import (
    AutoModelForCausalLM,
    AutoTokenizer,
    BitsAndBytesConfig,
    TrainingArguments,
 )
 from trl import ORPOTrainer, ORPOConfig

還需要運行以下代碼,確保如果GPU支持的話則使用FlashAttention和bfloat16:

import os
 major_version, minor_version = torch.cuda.get_device_capability()
 if major_version >= 8:
  os.system("pip install flash-attn")
  torch_dtype = torch.bfloat16
  attn_implementatinotallow='flash_attention_2'
  print("Your GPU is compatible with FlashAttention and bfloat16.")
 else:
  torch_dtype = torch.float16
  attn_implementatinotallow='eager'
  print("Your GPU is not compatible with FlashAttention and bfloat16.")

然后,加載數據集。這里使用“HuggingFaceH4/ ultrafeedback_binalized”(MIT許可)來訓練Zephyr模型。我將一個聊天模板應用到“被選中”和“被拒絕”列上,以對JSON進行字符串化。

dataset = load_dataset("HuggingFaceH4/ultrafeedback_binarized", split=["train_prefs","test_prefs"])
 
 def process(row):
    row["chosen"] = tokenizer.apply_chat_template(row["chosen"], tokenize=False)
    row["rejected"] = tokenizer.apply_chat_template(row["rejected"], tokenize=False)
    return row
 
 dataset[0] = dataset[0].map(
    process,
    num_proc= multiprocessing.cpu_count(),
    load_from_cache_file=False,
 )
 
 dataset[1] = dataset[1].map(
    process,
    num_proc= multiprocessing.cpu_count(),
    load_from_cache_file=False,
 )

剩下就是加載標記器,配置并加載模型。

model_name = "mistralai/Mistral-7B-v0.1"
 #Tokenizer
 tokenizer = AutoTokenizer.from_pretrained(model_name, add_eos_token=True, use_fast=True)
 tokenizer.pad_token = tokenizer.eos_token
 tokenizer.padding_side = 'left' #Necessary for FlashAttention compatibility
 
 bnb_config = BitsAndBytesConfig(
        load_in_4bit=True,
        bnb_4bit_quant_type="nf4",
        bnb_4bit_compute_dtype=torch_dtype,
        bnb_4bit_use_double_quant=True,
 )
 model = AutoModelForCausalLM.from_pretrained(
          model_name, torch_dtype=torch_dtype, quantization_cnotallow=bnb_config, device_map={"": 0}, attn_implementatinotallow=attn_implementation
 )
 model = prepare_model_for_kbit_training(model)
 #Configure the pad token in the model
 model.config.pad_token_id = tokenizer.pad_token_id

該模型使用bitsandbytes的NF4數據類型(使用BitsAndBytesConfig配置)動態量化。記得設置“prepare_model_for_kbit_training”,因為它支持梯度檢查點并節省大量內存。

對于LoRA的配置,使用標準超參數。如果增加“r”可能會有更好的結果,但這也會增加內存消耗,所以這里就不進行超參數得調整了。

peft_config = LoraConfig(
        lora_alpha=16,
        lora_dropout=0.05,
        r=16,
        bias="none",
        task_type="CAUSAL_LM",
        target_modules= ['k_proj', 'q_proj', 'v_proj', 'o_proj', "gate_proj", "down_proj", "up_proj"]
 )

還可以在LoraConfig中設置“use_dora=True”,以使用DoRA訓練更好(但更慢)的適配器。

最后就是設置ORPOConfig并開始訓練:

orpo_config = ORPOConfig(
    output_dir="./results/",
    evaluation_strategy="steps",
    do_eval=True,
    optim="paged_adamw_8bit",
    per_device_train_batch_size=2,
    gradient_accumulation_steps=4,
    per_device_eval_batch_size=2,
    log_level="debug",
    logging_steps=20,
    learning_rate=8e-6,
    eval_steps=20,
    max_steps=100,
    save_steps=20,
    save_strategy='epoch',
    warmup_ratio=0.1,
    lr_scheduler_type="linear",
    beta=0.1, #beta is ORPO's lambda
    max_length=1024,
 )
 
 trainer = ORPOTrainer(
        model=model,
        train_dataset=dataset[0],
        eval_dataset=dataset[1],
        peft_cnotallow=peft_config,
        args=orpo_config,
        tokenizer=tokenizer,
 )
 
 trainer.train()

ORPOTrainer與SFTTrainer和DPOTrainer的不同之處在于,它似乎不接受trainingargument作為參數。所以需要傳遞一個“ORPOConfig”。這里有個注意點:ORPOConfig中提到的“beta”是論文中描述的“lambda”,它衡量OR損失。

以下是在Colab 測試得結果:

訓練和驗證損失都減少了。說明模型正在學習,也就是說這個方法是有效得。讓我們再看看論文中ORPO的學習曲線:

從曲線中可以清楚地看出,ORPO需要數千個訓練步驟來學習如何區分選擇的響應和拒絕的響應。為了獲得類似的結果,應該訓練ORPO至少2000步,總批大小為64(如論文所述)。這樣看來使用一個高端消費級GPU,例如RTX 4090是可行的,但可能需要幾天的時間。

總結

ORPO是一種單步微調和對準指令llm的新方法。它不需要任何獎勵或SFT模型,并且ORPO比DPO和RLHF更簡單。根據論文ORPO的性能與DPO相當或略好。但是ORPO需要幾千個訓練步驟來學習好的和壞的反應之間的區別。

應該從現在開始使用ORPO嗎?

如果想要一個簡單有效的方法,ORPO是可以得。但是想要得到最好的結果,ORPO還不能完全的得到驗證。因為目前還沒有一個偏好優化方法的全面比較。但是我們可以從ORPO開始,因為他畢竟比較簡單。

責任編輯:華軒 來源: DeepHub IMBA
相關推薦

2025-04-15 08:44:43

2024-02-19 00:10:00

AI模型

2009-11-26 09:47:35

SharePoint2

2024-05-27 08:40:00

2013-12-31 09:19:23

Python調試

2021-12-22 07:31:18

RedisNoSQL數據庫

2020-11-30 15:33:33

訪問數組

2011-02-28 10:38:13

Windows 8

2012-03-07 17:24:10

戴爾咨詢

2012-12-20 10:17:32

IT運維

2009-06-12 15:26:02

2024-08-05 13:00:00

2020-03-02 10:56:41

辦公電腦疫情

2015-08-25 09:52:36

云計算云計算產業云計算政策

2013-01-11 18:10:56

軟件

2016-09-21 13:17:31

LibreOfficeJava緩沖區

2025-05-19 08:24:29

圖片加載開發

2020-05-19 10:02:58

CIOIPD集成產品開發

2009-12-08 14:26:13

大型網絡運維

2015-08-28 09:20:07

app推廣方法
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 婷婷中文在线 | 蜜桃一区二区三区 | 91精品国产手机 | 久久国产视频播放 | 国产精品一区二区久久精品爱微奶 | 久久新| 婷婷久| 亚洲一级毛片 | 99这里只有精品 | 国产精品一区二 | 狠狠伊人 | 中文字幕视频在线免费 | 日本一区二区在线视频 | 国产 欧美 日韩 一区 | 日韩精品成人在线 | 亚洲精品一区二区在线 | 国产在线观看一区二区三区 | 91精品国产综合久久久动漫日韩 | 精品一区二区不卡 | 精品一区二区三区四区五区 | 久久中文字幕电影 | 亚洲色图图片 | 国产麻豆乱码精品一区二区三区 | 国产欧美精品一区二区 | 久一精品 | 视频二区国产 | 日韩av在线免费 | 超级乱淫av片免费播放 | 国产精品一区二区免费 | 久久婷婷av | 国产一区二区麻豆 | 久久国产精品久久久久久久久久 | 国产精品久久久久久亚洲调教 | 国产美女特级嫩嫩嫩bbb片 | 日韩欧美国产综合 | 亚洲一av| 中文字幕视频在线观看 | 欧美激情99 | 最新国产精品视频 | 亚洲36d大奶网 | 久久久亚洲精品视频 |