自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

使用直接偏好優(yōu)化策略微調(diào)Mistral-7b模型

譯文 精選
人工智能
本文將向你展示如何運(yùn)用直接偏好優(yōu)化策略來(lái)微調(diào)Mistral-7b模型的技巧,從而進(jìn)一步提升受監(jiān)督的微調(diào)模型的性能。

譯者 | 朱先忠

審校 | 重樓

引言

通常,經(jīng)過(guò)預(yù)訓(xùn)練的大型語(yǔ)言模型(LLM)只能執(zhí)行下一個(gè)標(biāo)記預(yù)測(cè),使其無(wú)法回答問(wèn)題。這就解釋了為什么這些基本模型還需要根據(jù)成對(duì)的指令和答案進(jìn)一步微調(diào),最終才能夠充當(dāng)真正有用人工助理。然而,這個(gè)過(guò)程仍然可能存在缺陷:微調(diào)LLM可能存在偏見(jiàn)的甚至是有毒害性的輸出結(jié)果。這也正是從人類反饋中強(qiáng)化學(xué)習(xí)(Reinforcement Learning from Human Feedback簡(jiǎn)稱“RLHF)發(fā)揮作用的地方。

具體來(lái)說(shuō),RLHF能夠為L(zhǎng)LM提供不同的答案,這些答案將按期待的行為(有益性、毒害性等)進(jìn)行排序。該模型學(xué)習(xí)這些候選者中輸出最佳答案,從而模仿我們想要灌輸的行為。通常,這一過(guò)程被視為審查模型的一種方式,最近因能夠有效提高模型性能而變得流行起來(lái),模型neural-chat-7b-v3-1表現(xiàn)的那樣。

在本文中,我們將通過(guò)使用類似RLHF的技術(shù):直接偏好優(yōu)化(DPO)通過(guò)微調(diào)模型OpenHermes-2.5來(lái)創(chuàng)建NeuralHermes-2.5。為此,我們將介紹一個(gè)偏好數(shù)據(jù)集,描述DPO算法的工作原理,并將其應(yīng)用于我們的模型。我們將看到它會(huì)顯著提高開(kāi)源LLM排行榜上基本模型的性能。

和往常一樣,可在GitHubGoogle Colab上獲得本文示例工程的有關(guān)代碼。

偏好數(shù)據(jù)集

偏好數(shù)據(jù)集不是標(biāo)準(zhǔn)化的,但它們通常由一組按人類排序的答案組成。這種排序是必不可少的,因?yàn)镽LHF過(guò)程微調(diào)LLM以輸出首選答案。以下是流行的偏好數(shù)據(jù)集Anthropic/hh-rlhf一個(gè)示例:

作者本人提供圖像作者本人提供圖像

容易看出,數(shù)據(jù)集的結(jié)構(gòu)很簡(jiǎn)單:對(duì)于每一行,都有一個(gè)選擇的(首選)答案和一個(gè)拒絕的答案。RLHF的目標(biāo)是引導(dǎo)模型輸出首選答案。

眾所周知,偏好數(shù)據(jù)集成本高昂且難以制作,因?yàn)樗鼈冃枰占祟惖氖謩?dòng)反饋。這種反饋也是主觀的,很容易偏向于自信(但錯(cuò)誤)的答案或自相矛盾(不同的注釋者有不同的價(jià)值觀)。隨著時(shí)間的推移,業(yè)界已經(jīng)提出了幾種解決方案來(lái)解決這些問(wèn)題,例如用人工智能反饋(RLAIF)取代人類反饋。

另一方面,這些數(shù)據(jù)集也往往比微調(diào)數(shù)據(jù)集小得多。為了說(shuō)明這一點(diǎn),優(yōu)秀的neural-chat-7b-v3–1模型此模型發(fā)布時(shí)在Open LLM排行榜網(wǎng)站成為最好的70億參數(shù)規(guī)模的LLM)使用518k個(gè)樣本進(jìn)行微調(diào)(Open Orca/SlimOrca),但RLHF(Intel/Orca_dpo_pars)僅使用12.9k個(gè)樣本。在這種情況下,作者使用GPT-4/3.5生成答案以創(chuàng)建首選答案,并使用Llama-2-13b-chat生成拒絕答案。這是一種繞過(guò)人類反饋,只依賴不同性能水平的模型的聰明方法。

直接偏好優(yōu)化

雖然RLHF的概念在機(jī)器人領(lǐng)域已經(jīng)使用了很長(zhǎng)一段時(shí)間,但在OpenAI的論文《從人類偏好微調(diào)語(yǔ)言模型》中,它被推廣用于LLM。在這篇論文中,作者提出了一個(gè)框架,它能夠訓(xùn)練獎(jiǎng)勵(lì)模型來(lái)近似人類反饋。然后,該獎(jiǎng)勵(lì)模型用于使用近端策略優(yōu)化(PPO:https://arxiv.org/abs/1707.06347)算法來(lái)優(yōu)化微調(diào)模型的策略。

作者本人提供圖像作者本人提供圖像

PPO的核心概念圍繞著對(duì)策略進(jìn)行較小的增量更新,因?yàn)檩^大的更新可能會(huì)導(dǎo)致不穩(wěn)定或次優(yōu)的解決方案。根據(jù)經(jīng)驗(yàn),不幸的是,這種技術(shù)仍然不穩(wěn)定(損失發(fā)散),難以復(fù)制(大量的超參數(shù),對(duì)隨機(jī)種子敏感),并且計(jì)算成本高昂。

也正是直接偏好優(yōu)化(DPO)發(fā)揮作用的地方。DPO通過(guò)將任務(wù)視為分類問(wèn)題來(lái)簡(jiǎn)化控制。具體地說(shuō),它使用兩個(gè)模型:經(jīng)過(guò)訓(xùn)練的模型(或策略模型)和一個(gè)稱為參考模型的副本。在訓(xùn)練過(guò)程中,目標(biāo)是確保訓(xùn)練后的模型比參考模型輸出更高的首選答案概率。相反,我們也希望它輸出拒絕答案的較低概率。這意味著我們會(huì)因?yàn)樵愀獾拇鸢付鴳土PLLM,而因?yàn)楹玫拇鸢付?jiǎng)勵(lì)它。

作者本人提供圖像作者本人提供圖像

通過(guò)使用LLM本身作為獎(jiǎng)勵(lì)模型并采用二進(jìn)制交叉熵目標(biāo),DPO有效地將模型的輸出與人類偏好相一致,而不需要大量采樣、獎(jiǎng)勵(lì)模型擬合或復(fù)雜的超參數(shù)調(diào)整。這樣一來(lái),就能夠產(chǎn)生一個(gè)更穩(wěn)定、更高效、計(jì)算要求更低的過(guò)程。

格式化數(shù)據(jù)

本文的這個(gè)例子中,我們將對(duì)優(yōu)秀OpenHermes-2.5-Mistral-7B模型進(jìn)行微調(diào),這是一個(gè)只經(jīng)過(guò)監(jiān)督微調(diào)的Mistral-7B模型。為此,我們將使用Intel/orca_dpo_paries數(shù)據(jù)集來(lái)調(diào)整我們的模型并提高其性能。我們稱這種模型為NeuralHermes-2.5-Mistral-7B。

具體來(lái)說(shuō),實(shí)現(xiàn)此操作的第一步安裝所需的庫(kù),如下所示

pip install -q datasets trl peft bitsandbytes sentencepiece wandb

完成后,我們可以進(jìn)行庫(kù)導(dǎo)入。我還使用谷歌Colab中的秘密(secrets)標(biāo)簽頁(yè)來(lái)存儲(chǔ)我的Hugging Face標(biāo)志信息。

import os
import gc
import torch

import transformers
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, BitsAndBytesConfig
from datasets import load_dataset
from peft import LoraConfig, PeftModel, get_peft_model, prepare_model_for_kbit_training
from trl import DPOTrainer
import bitsandbytes as bnb
from google.colab import userdata
import wandb

# 在Google Colab秘密的標(biāo)簽中定義
hf_token = userdata.get('huggingface')
wb_token = userdata.get('wandb')
wandb.login(key=wb_token)

model_name = "teknium/OpenHermes-2.5-Mistral-7B"
new_model = "NeuralHermes-2.5-Mistral-7B"

OpenHermes-2.5-Mistral-7B使用一個(gè)特定的聊天模板,稱為ChatML。以下是使用此模板格式化的對(duì)話示例:

<|im_start|>system
You are a helpful chatbot assistant.<|im_end|>
<|im_start|>user
Hi<|im_end|>
<|im_start|>assistant
Hi, how can I help you?<|im_end|>

正如您所看到的,ChatML定義了不同的角色(系統(tǒng)、用戶、助理),并附加了特殊的標(biāo)志(<|im_start|>和<|im_end|>)來(lái)分隔它們。此外,DPOTrainer還要求具有三列的特定格式:提示(prompt)、選擇(chosen)和拒絕(rejected)。

我們的數(shù)據(jù)集包含四列:system(系統(tǒng)、question(問(wèn)題、chatgpt和llama2–13b-chat。我們簡(jiǎn)單地將系統(tǒng)列和問(wèn)題列連接到提示prompt列。我們還將chatgpt列映射到“已選擇(chosen),并將llama2–13b-chat映射到“拒絕(rejected)。為了以可靠的方式格式化數(shù)據(jù)集,我們將使用分詞器的apply_chat_template()函數(shù),該函數(shù)已經(jīng)使用了ChatML。

def chatml_format(example):
 # 格式化系統(tǒng)列
 if len(example['system']) > 0:
 message = {"role": "system", "content": example['system']}
 system = tokenizer.apply_chat_template([message], tokenize=False)
 else:
 system = ""

 # 格式化指令
 message = {"role": "user", "content": example['question']}
 prompt = tokenizer.apply_chat_template([message], tokenize=False, add_generation_prompt=True)

 # 設(shè)置所選答案的格式
 chosen = example['chosen'] + "<|im_end|>\n"

 # 格式化拒絕的答案
 rejected = example['rejected'] + "<|im_end|>\n"

 return {
 "prompt": system + prompt,
 "chosen": chosen,
 "rejected": rejected,
 }

# 加載數(shù)據(jù)集
dataset = load_dataset("Intel/orca_dpo_pairs")['train']

# 保存列數(shù)據(jù)
original_columns = dataset.column_names

# 分詞器
tokenizer = AutoTokenizer.from_pretrained(model_name)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "left"

# 格式化數(shù)據(jù)集
dataset = dataset.map(
 chatml_format,
 remove_columns=original_columns
)

現(xiàn)在,讓我們打印一個(gè)格式化數(shù)據(jù)集的示例,以確認(rèn)一切正常:

{'prompt': '<|im_start|>system\nYou are an AI assistant. You will be given a task. You must generate a detailed and long answer.<|im_end|>\n<|im_start|>user\nGenerate an approximately fifteen-word sentence that describes all this data: Midsummer House eatType restaurant; Midsummer House food Chinese; Midsummer House priceRange moderate; Midsummer House customer rating 3 out of 5; Midsummer House near All Bar One<|im_end|>\n<|im_start|>assistant\n',
'chosen': 'Midsummer House is a moderately priced Chinese restaurant with a 3/5 customer rating, located near All Bar One.<|im_end|>\n',
'rejected': ' Sure! Here\'s a sentence that describes all the data you provided:\n\n"Midsummer House is a moderately priced Chinese restaurant with a customer rating of 3 out of 5, located near All Bar One, offering a variety of delicious dishes."<|im_end|>\n'}

我們可以看到,該提示結(jié)合了系統(tǒng)和用戶指令。由于add_generation_prompt=True參數(shù)的作用你會(huì)注意到其中還附加了助答案的開(kāi)頭部分。如果您想跳過(guò)這一步,可以直接將預(yù)處理的數(shù)據(jù)集用作mlabonne/chatml_dpo_pairs。

使用DPO訓(xùn)練模型

接下來(lái),我們定義LoRA配置來(lái)訓(xùn)練模型。正如英特爾的博客文章中所描述的,我們將秩值設(shè)置為等于lora_lfa,這是不尋常的(按一般經(jīng)驗(yàn)都取2*r)。我們還要考慮所有帶有適配器的線性模塊。

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

現(xiàn)在我們準(zhǔn)備加載我們想要使用DPO進(jìn)行微調(diào)的模型。在這種情況下,需要兩個(gè)模型:要微調(diào)的模型和參考模型。這主要是為了可讀性,因?yàn)槿绻麤](méi)有提供參考模型,DPOTrainer對(duì)象會(huì)自動(dòng)創(chuàng)建參考模型。

# 要微調(diào)的模型
model = AutoModelForCausalLM.from_pretrained(
 model_name,
 torch_dtype=torch.float16,
 load_in_4bit=True
)
model.config.use_cache = False

# 參考模型
ref_model = AutoModelForCausalLM.from_pretrained(
 model_name,
 torch_dtype=torch.float16,
 load_in_4bit=True
)

最后一步包括向TrainingArguments和DPOTrainer提供所有超參數(shù):

  • 其中,beta參數(shù)對(duì)DPO來(lái)說(shuō)是唯一的,因?yàn)樗刂浦c初始策略的偏差(0.1是它的典型值)。
  • 與英特爾博客文章中描述的值相比,我們降低了學(xué)習(xí)率(從5e-4到5e-5)和步數(shù)(從1000到200)。我在運(yùn)行幾次后手動(dòng)優(yōu)化了這些值,以穩(wěn)定訓(xùn)練并取得最佳效果。

我們現(xiàn)在可以開(kāi)始訓(xùn)練模型了。請(qǐng)注意,它需要一個(gè)A100 GPU,大約需要1個(gè)小時(shí)才能完成訓(xùn)練。

# 訓(xùn)練參數(shù)
training_args = TrainingArguments(
 per_device_train_batch_size=4,
 gradient_accumulation_steps=4,
 gradient_checkpointing=True,
 learning_rate=5e-5,
 lr_scheduler_type="cosine",
 max_steps=200,
 save_strategy="no",
 logging_steps=1,
 output_dir=new_model,
 optim="paged_adamw_32bit",
 warmup_steps=100,
 bf16=True,
 report_to="wandb",
)

# 創(chuàng)建DPO訓(xùn)練器
dpo_trainer = DPOTrainer(
 model,
 ref_model,
 args=training_args,
 train_dataset=dataset,
 tokenizer=tokenizer,
 peft_cnotallow=peft_config,
 beta=0.1,
 max_prompt_length=1024,
 max_length=1536,
)

# 使用DPO微調(diào)模型
dpo_trainer.train()

我們的模型現(xiàn)在進(jìn)行了微調(diào)。您可以在地址https://wandb.ai/mlabonne/NeuralHermes-2-5-Mistral-7B/runs/axe71gr0?workspace=user-mlabonne查看有關(guān)項(xiàng)目權(quán)重和偏差。以下是一些需要分析的有趣指標(biāo):

作者本人提供圖像作者本人提供圖像

有趣的是,盡管使用了100個(gè)熱身步驟,但訓(xùn)練損失很快降至零(在50步之前)。與此同時(shí),其他指標(biāo)也在不斷發(fā)展。

上圖中,train/rewards/chosentrain/rewards/rejected圖對(duì)應(yīng)于訓(xùn)練模型和參考模型輸出的對(duì)數(shù)概率之間的平均差。隨著時(shí)間的推移,隨著我們訓(xùn)練的模型學(xué)習(xí)到首選答案,它們會(huì)出現(xiàn)分歧,這是有道理的。另外,train/rewards/margins圖也顯示了這兩個(gè)圖之間的差異。最后,train/reward/accuracies圖顯示了選擇首選答案的頻率。經(jīng)過(guò)訓(xùn)練的模型很快就達(dá)到了完美的準(zhǔn)確度分?jǐn)?shù),這是一個(gè)好跡象,但也可能意味著首選答案和拒絕答案之間的差異太明顯。

現(xiàn)在,已經(jīng)訓(xùn)練結(jié)束那么我們可以將適配器與原始模型合并到一起了。接下來(lái),我們保存合并后的模型和分詞器,然后將其推送到Hugging Face中心。

#保存所有工作
dpo_trainer.model.save_pretrained("final_checkpoint")
tokenizer.save_pretrained("final_checkpoint")

# 刷新內(nèi)存
del dpo_trainer, model, ref_model
gc.collect()
torch.cuda.empty_cache()

# 在FP16(而不是NF4)中重新加載模型
base_model = AutoModelForCausalLM.from_pretrained(
 model_name,
 return_dict=True,
 torch_dtype=torch.float16,
)
tokenizer = AutoTokenizer.from_pretrained(model_name)

# 將基本模型與適配器合并
model = PeftModel.from_pretrained(base_model, "final_checkpoint")
model = model.merge_and_unload()

# 保存模型和分詞器
model.save_pretrained(new_model)
tokenizer.save_pretrained(new_model)

# 然后將其推送到Hugging Face中心
model.push_to_hub(new_model, use_temp_dir=False, token=hf_token)
tokenizer.push_to_hub(new_model, use_temp_dir=False, token=hf_token)

現(xiàn)在,讓我們看看我們的模型在實(shí)際測(cè)試中的表現(xiàn)。我們將格式化提示以提出一個(gè)基本問(wèn)題:“What is a Large Language Model?什么是大型語(yǔ)言模型?

#格式化提示
message = [
 {"role": "system", "content": "You are a helpful assistant chatbot."},
 {"role": "user", "content": "What is a Large Language Model?"}
]
tokenizer = AutoTokenizer.from_pretrained(new_model)
prompt = tokenizer.apply_chat_template(message, add_generation_prompt=True, tokenize=False)

# 創(chuàng)建管道
pipeline = transformers.pipeline(
 "text-generation",
 model=new_model,
 tokenizer=tokenizer
)

# 生成文本
sequences = pipeline(
 prompt,
 do_sample=True,
 temperature=0.7,
 top_p=0.9,
 num_return_sequences=1,
 max_length=200,
)
print(sequences[0]['generated_text'])

以下是模型給出的答案:

A large language model is a type of artificial intelligence (AI) system that has been trained on vast amounts of text data. These models are designed to understand and generate human language, allowing them to perform various natural language processing tasks, such as text generation, language translation, and question answering. Large language models typically use deep learning techniques, like recurrent neural networks (RNNs) or transformers, to learn patterns and relationships in the data, enabling them to generate coherent and contextually relevant responses. The size of these models, in terms of the number of parameters and the volume of data they are trained on, plays a significant role in their ability to comprehend and produce complex language structures.

對(duì)應(yīng)的中文意思是:“大型語(yǔ)言模型是一種基于大量文本數(shù)據(jù)進(jìn)行訓(xùn)練的人工智能系統(tǒng)。這些模型旨在理解和生成人類語(yǔ)言,使其能夠執(zhí)行各種自然語(yǔ)言處理任務(wù),如文本生成、語(yǔ)言翻譯和問(wèn)答。大型語(yǔ)言模型通常使用深度學(xué)習(xí)技術(shù),如遞歸神經(jīng)網(wǎng)絡(luò)(RNN)或轉(zhuǎn)換器,來(lái)學(xué)習(xí)數(shù)據(jù)中的模式和關(guān)系,使其能夠生成連貫且與上下文相關(guān)的響應(yīng)。這些模型的大小,就參數(shù)的數(shù)量和訓(xùn)練的數(shù)據(jù)量而言,對(duì)它們理解和產(chǎn)生復(fù)雜語(yǔ)言結(jié)構(gòu)的能力起著重要作用?!?/span>

一切似乎都在起作用,我們現(xiàn)在可以評(píng)估合并后的模型了。由于這是一個(gè)通用模型,我們可以利用lm評(píng)估工具對(duì)其進(jìn)行評(píng)估。由于該過(guò)程相當(dāng)耗費(fèi)資源,我們也可以直接將其提交到Open LLM排行榜網(wǎng)站上進(jìn)行評(píng)估。這個(gè)過(guò)程需要幾天時(shí)間,但以下是與其他OpenHermes模型相比的結(jié)果:

作者本人提供圖像作者本人提供圖像

與原始模型相比,NeuralHermes-2–5-Mistral-7B模型的平均得分提高了6.7分(尤其是在GSM8K上)。這是一個(gè)出乎意料的大改進(jìn),它展示了直接偏好優(yōu)化的力量。

結(jié)論

在本文中,我們使用DPO對(duì)經(jīng)過(guò)監(jiān)督的微調(diào)模型進(jìn)行了微調(diào),并創(chuàng)建了我們自己的NeuralHermes-2.5模型。通過(guò)利用一個(gè)高質(zhì)量的偏好數(shù)據(jù)集,我們成功開(kāi)發(fā)了一個(gè)樣本高效的微調(diào)方案對(duì)Open LLM排行榜產(chǎn)生了重大改進(jìn)。如果你想嘗試一下,你可以找到這個(gè)模型的量化變體,或者直接使用Hugging Face Space來(lái)進(jìn)行試驗(yàn)。

最后請(qǐng)注意,我們的微調(diào)方案仍然可以通過(guò)不同的方式進(jìn)行改進(jìn)。例如,其中使用的偏好數(shù)據(jù)集仍然很原始,可以通過(guò)更多的過(guò)濾和使用不同的模型來(lái)改進(jìn)。此外,許多超參數(shù)仍然可以進(jìn)行調(diào)整以獲得更好的結(jié)果。特別地,仍然可以降低學(xué)習(xí)率以便在更多步驟上訓(xùn)練模型并注入更多偏好數(shù)據(jù)。

參考資料

  • Fine-tune Llama 2 with DPO by Kashif Rasul, Younes Belkada, and Leandro von Werra。
  • Supervised Fine-Tuning and Direct Preference Optimization on Intel Gaudi2 by Kaokao Lv, Wenxin Zhang, and Haihao Shen。
  • llama2-fine-tune by mzbac。

譯者介紹

朱先忠,51CTO社區(qū)編輯,51CTO專家博客、講師,濰坊一所高校計(jì)算機(jī)教師,自由編程界老兵一枚。

原文標(biāo)題:Fine-tune a Mistral-7b model with Direct Preference Optimization,作者:Maxime Labonne

責(zé)任編輯:華軒 來(lái)源: 51CTO
相關(guān)推薦

2024-03-25 08:00:00

2024-07-22 07:10:00

小模型機(jī)器學(xué)習(xí)蘋果

2024-02-19 14:09:00

模型Eagle 7BRNN

2024-02-05 13:24:51

GPUNLP芯片

2023-12-28 11:59:26

Zephyr語(yǔ)言模型微調(diào)版本

2024-03-20 10:31:27

2024-07-17 13:40:01

2024-07-22 09:00:00

2025-01-26 11:38:54

2024-10-17 18:52:41

2024-12-18 12:20:15

2024-03-25 00:05:00

開(kāi)源模型AI

2024-12-27 11:52:25

GRAPEVLA 模型人工智能

2025-04-10 07:59:51

2024-07-18 12:53:13

2024-10-23 09:30:00

2024-07-17 12:13:11

2025-03-10 18:50:57

2024-05-27 08:40:00

2023-06-25 11:30:47

可視化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)