微調(diào)大語(yǔ)言模型的七個(gè)步驟
譯文譯者 | 布加迪
審校 | 重樓

在最近一年半的時(shí)間里,自然語(yǔ)言處理(NLP)領(lǐng)域發(fā)生了顯著的變化,這主要得益于OpenAI的GPT系列等大語(yǔ)言模型(LLM)的興起。
這些功能強(qiáng)大的模型已徹底改變了我們處理自然語(yǔ)言任務(wù)的方法,在翻譯、情緒分析和文本自動(dòng)生成等方面提供了前所未有的能力。它們理解和生成類(lèi)似人類(lèi)的文本的能力已帶來(lái)了曾經(jīng)被認(rèn)為無(wú)法實(shí)現(xiàn)的可能性。
然而,盡管這些模型具有出色的能力,但訓(xùn)練它們的過(guò)程卻充滿(mǎn)了挑戰(zhàn),比如需要投入大量的時(shí)間和資金。這時(shí)候,微調(diào)LLM就體現(xiàn)出了其重要性。
通過(guò)細(xì)化這些預(yù)訓(xùn)練的模型以更好地適應(yīng)特定的應(yīng)用環(huán)境或領(lǐng)域,我們就可以顯著提高它們處理特定任務(wù)的性能。這一步不僅提高了它們的質(zhì)量,還擴(kuò)大了它們?cè)?/span>一系列廣泛領(lǐng)域的用途。
本文旨在將這個(gè)過(guò)程分解為七個(gè)簡(jiǎn)單步驟,以便使任何LLM針對(duì)特定任務(wù)進(jìn)行微調(diào)。
理解預(yù)訓(xùn)練的大語(yǔ)言模型
LLM是機(jī)器學(xué)習(xí)算法的一個(gè)特殊類(lèi)別,旨在根據(jù)前一個(gè)單詞提供的上下文預(yù)測(cè)序列中的下一個(gè)單詞。這些模型建立在Transformers架構(gòu)上,這是機(jī)器學(xué)習(xí)技術(shù)領(lǐng)域的一大突破,在谷歌的《你需要的就是注意力》文章中作了首次解釋。
GPT(生成式預(yù)訓(xùn)練Transformer)之類(lèi)的模型就是已經(jīng)暴露于大量文本數(shù)據(jù)的預(yù)訓(xùn)練語(yǔ)言模型。這種廣泛的訓(xùn)練使它們得以掌握語(yǔ)言使用的基本規(guī)則,包括如何將單詞組合成連貫的句子。

這些模型的一個(gè)關(guān)鍵優(yōu)勢(shì)在于,它們不僅能夠理解自然語(yǔ)言,還能夠根據(jù)提供的輸入生成酷似人類(lèi)寫(xiě)作的文本。
那么其最大的優(yōu)點(diǎn)是什么呢?那就是這些模型已經(jīng)通過(guò)API向大眾開(kāi)放。
什么是微調(diào),為什么很重要?
微調(diào)是指選擇一個(gè)預(yù)訓(xùn)練的模型,并通過(guò)使用特定領(lǐng)域的數(shù)據(jù)集進(jìn)一步訓(xùn)練來(lái)改進(jìn)它的過(guò)程。
大多數(shù)LLM模型有很好的自然語(yǔ)言技能和通用知識(shí)性能,但在處理特定的面向任務(wù)的問(wèn)題時(shí)差強(qiáng)人意。微調(diào)過(guò)程提供了一種方法,可以提升模型處理特定問(wèn)題的性能,同時(shí)降低計(jì)算費(fèi)用,無(wú)需從頭開(kāi)始構(gòu)建模型。

簡(jiǎn)而言之,模型經(jīng)過(guò)微調(diào)后,針對(duì)特定任務(wù)擁有更好的性能,使其在實(shí)際應(yīng)用中更有效、更通用。這個(gè)過(guò)程對(duì)于改進(jìn)現(xiàn)有模型以處理特定的任務(wù)或領(lǐng)域至關(guān)重要。
微調(diào)LLM的逐步指南
不妨通過(guò)如下七個(gè)步驟微調(diào)一個(gè)實(shí)際模型來(lái)舉例說(shuō)明這個(gè)概念。
第一步:明確具體目標(biāo)
假設(shè)我們想要推斷任何文本的情緒,決定試用GPT-2來(lái)完成這樣的任務(wù)。
我敢肯定,我們很快就會(huì)發(fā)現(xiàn)它在這方面做得很差,這并不奇怪。然后,一個(gè)自然而然的問(wèn)題浮現(xiàn)在腦海中:我們可以做些什么來(lái)改善其性能?
當(dāng)然,答案是我們可以!
使用含有推文及相應(yīng)情緒的數(shù)據(jù)集訓(xùn)練來(lái)自Hugging Face Hub的預(yù)訓(xùn)練GPT-2模型,充分利用微調(diào)的效果,以便提高性能。
所以,我們的最終目標(biāo)是擁有一個(gè)善于從文本中推斷情緒的模型。
第二步:選擇預(yù)訓(xùn)練的模型和數(shù)據(jù)集
第二步是選擇什么模型作為基本模型。在本文例子中,我們已經(jīng)選擇了模型:GPT-2。所以我們要對(duì)它進(jìn)行一些簡(jiǎn)單的微調(diào)。

始終記住要選擇適合您任務(wù)的模型。
第三步:加載要使用的數(shù)據(jù)
我們已有了模型和主要任務(wù),現(xiàn)在需要一些數(shù)據(jù)來(lái)處理。
不過(guò)別擔(dān)心,Hugging Face已經(jīng)把一切都安排好了!
這時(shí)候,它的數(shù)據(jù)集庫(kù)有了用武之地。
在這個(gè)例子中,我們將充分利用Hugging Face數(shù)據(jù)集庫(kù)來(lái)導(dǎo)入一個(gè)數(shù)據(jù)集,其中的推文被標(biāo)記為相應(yīng)的情緒(積極的、中立的或消極的)。
from datasets import load_dataset
dataset = load_dataset("mteb/tweet_sentiment_extraction")
df = pd.DataFrame(dataset['train'])數(shù)據(jù)看起來(lái)就像這樣:

第四步:分詞器(Tokenizer)
現(xiàn)在我們有了模型和數(shù)據(jù)集來(lái)對(duì)其進(jìn)行微調(diào)。因此,接下來(lái)的合理步驟是加載分詞器。由于LLM使用token(而不是單詞!!),我們需要分詞器將數(shù)據(jù)發(fā)送到我們的模型。
通過(guò)利用map方法對(duì)整個(gè)數(shù)據(jù)集進(jìn)行分詞處理,我們很容易做到這一點(diǎn)。
from transformers import GPT2Tokenizer
# Loading the dataset to train our model
dataset = load_dataset("mteb/tweet_sentiment_extraction")
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
tokenizer.pad_token = tokenizer.eos_token
def tokenize_function(examples):
return tokenizer(examples["text"], padding="max_length", truncatinotallow=True)
tokenized_datasets = dataset.map(tokenize_function, batched=True)為了提高我們的處理性能,生成兩個(gè)較小的子集:
- 訓(xùn)練集:用來(lái)微調(diào)我們的模型。
- 測(cè)試集:用來(lái)評(píng)估模型。
Small_train_dataset = tokenized_datasets["train"].shuffle(seed=42).select(range(1000))
Small_eval_dataset = tokenized_datasets["test"].shuffle(seed=42).select(range(1000))第五步:初始化基本模型
一旦我們有了要使用的數(shù)據(jù)集,就加載我們的模型,并指定預(yù)期標(biāo)簽的數(shù)量。您可以從推文的情緒數(shù)據(jù)集知道有三種可能的標(biāo)簽:
- 0或消極的
- 1或中性的
- 2或積極的
from transformers import GPT2ForSequenceClassification
model = GPT2ForSequenceClassification.from_pretrained("gpt2", num_labels=3)第六步:評(píng)估方法
Transformers庫(kù)提供了一個(gè)名為“Trainer”的類(lèi),它可以優(yōu)化我們模型的訓(xùn)練和評(píng)估。因此,在實(shí)際訓(xùn)練開(kāi)始之前,我們需要定義一個(gè)函數(shù)來(lái)評(píng)估經(jīng)過(guò)微調(diào)的模型。
import evaluate
metric = evaluate.load("accuracy")
def compute_metrics(eval_pred):
logits, labels = eval_pred
predictions = np.argmax(logits, axis=-1)
return metric.compute(predictinotallow=predictions, references=labels)第七步:使用Trainer方法進(jìn)行微調(diào)
最后一步是微調(diào)模型。為此,我們將一起設(shè)置訓(xùn)練參數(shù)與評(píng)估策略,并執(zhí)行Trainer對(duì)象。
要執(zhí)行Trainer對(duì)象,我們只需使用train()命令。
from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(
output_dir="test_trainer",
#evaluation_strategy="epoch",
per_device_train_batch_size=1, # Reduce batch size here
per_device_eval_batch_size=1, # Optionally, reduce for evaluation as well
gradient_accumulation_steps=4
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=small_train_dataset,
eval_dataset=small_eval_dataset,
compute_metrics=compute_metrics,
)
trainer.train()一旦我們的模型經(jīng)過(guò)微調(diào),我們使用測(cè)試集來(lái)評(píng)估其性能。trainer對(duì)象已經(jīng)包含了經(jīng)過(guò)優(yōu)化的evaluate()方法。
import evaluate
trainer.evaluate()這就是對(duì)任何LLM進(jìn)行微調(diào)的基本過(guò)程。
另外請(qǐng)記住,微調(diào)LLM的過(guò)程對(duì)計(jì)算資源的要求很高,因此您的本地計(jì)算機(jī)可能沒(méi)有足夠的能力來(lái)進(jìn)行微調(diào)。
主要結(jié)論
如今,針對(duì)特定任務(wù)對(duì)預(yù)訓(xùn)練的大語(yǔ)言模型(比如GPT)進(jìn)行微調(diào)對(duì)于改進(jìn)LLM在特定領(lǐng)域的性能至關(guān)重要。它使我們得以利用LLM的自然語(yǔ)言能力,同時(shí)提高它們的效率和定制方面的潛力,使這個(gè)過(guò)程易于訪問(wèn)且具有成本效益。
如果遵循這七個(gè)簡(jiǎn)單的步驟:從選擇正確的模型和數(shù)據(jù)集到訓(xùn)練和評(píng)估微調(diào)模型,我們可以在特定領(lǐng)域?qū)崿F(xiàn)卓越的模型性能。
如果想要查看完整代碼,可以在我的大語(yǔ)言模型GitHub代碼庫(kù)中找到:https://github.com/rfeers/large-language-models/blob/main/7%20Steps%20to%20Fine-Tune%20LLMs.ipynb。
原文標(biāo)題:7 Steps to Mastering Large Language Model Fine-tuning,作者:Josep Ferrer






























