微調(diào)大語言模型的七個(gè)步驟
譯文譯者 | 布加迪
審校 | 重樓
在最近一年半的時(shí)間里,自然語言處理(NLP)領(lǐng)域發(fā)生了顯著的變化,這主要得益于OpenAI的GPT系列等大語言模型(LLM)的興起。
這些功能強(qiáng)大的模型已徹底改變了我們處理自然語言任務(wù)的方法,在翻譯、情緒分析和文本自動生成等方面提供了前所未有的能力。它們理解和生成類似人類的文本的能力已帶來了曾經(jīng)被認(rèn)為無法實(shí)現(xiàn)的可能性。
然而,盡管這些模型具有出色的能力,但訓(xùn)練它們的過程卻充滿了挑戰(zhàn),比如需要投入大量的時(shí)間和資金。這時(shí)候,微調(diào)LLM就體現(xiàn)出了其重要性。
通過細(xì)化這些預(yù)訓(xùn)練的模型以更好地適應(yīng)特定的應(yīng)用環(huán)境或領(lǐng)域,我們就可以顯著提高它們處理特定任務(wù)的性能。這一步不僅提高了它們的質(zhì)量,還擴(kuò)大了它們在一系列廣泛領(lǐng)域的用途。
本文旨在將這個(gè)過程分解為七個(gè)簡單步驟,以便使任何LLM針對特定任務(wù)進(jìn)行微調(diào)。
理解預(yù)訓(xùn)練的大語言模型
LLM是機(jī)器學(xué)習(xí)算法的一個(gè)特殊類別,旨在根據(jù)前一個(gè)單詞提供的上下文預(yù)測序列中的下一個(gè)單詞。這些模型建立在Transformers架構(gòu)上,這是機(jī)器學(xué)習(xí)技術(shù)領(lǐng)域的一大突破,在谷歌的《你需要的就是注意力》文章中作了首次解釋。
GPT(生成式預(yù)訓(xùn)練Transformer)之類的模型就是已經(jīng)暴露于大量文本數(shù)據(jù)的預(yù)訓(xùn)練語言模型。這種廣泛的訓(xùn)練使它們得以掌握語言使用的基本規(guī)則,包括如何將單詞組合成連貫的句子。
這些模型的一個(gè)關(guān)鍵優(yōu)勢在于,它們不僅能夠理解自然語言,還能夠根據(jù)提供的輸入生成酷似人類寫作的文本。
那么其最大的優(yōu)點(diǎn)是什么呢?那就是這些模型已經(jīng)通過API向大眾開放。
什么是微調(diào),為什么很重要?
微調(diào)是指選擇一個(gè)預(yù)訓(xùn)練的模型,并通過使用特定領(lǐng)域的數(shù)據(jù)集進(jìn)一步訓(xùn)練來改進(jìn)它的過程。
大多數(shù)LLM模型有很好的自然語言技能和通用知識性能,但在處理特定的面向任務(wù)的問題時(shí)差強(qiáng)人意。微調(diào)過程提供了一種方法,可以提升模型處理特定問題的性能,同時(shí)降低計(jì)算費(fèi)用,無需從頭開始構(gòu)建模型。
簡而言之,模型經(jīng)過微調(diào)后,針對特定任務(wù)擁有更好的性能,使其在實(shí)際應(yīng)用中更有效、更通用。這個(gè)過程對于改進(jìn)現(xiàn)有模型以處理特定的任務(wù)或領(lǐng)域至關(guān)重要。
微調(diào)LLM的逐步指南
不妨通過如下七個(gè)步驟微調(diào)一個(gè)實(shí)際模型來舉例說明這個(gè)概念。
第一步:明確具體目標(biāo)
假設(shè)我們想要推斷任何文本的情緒,決定試用GPT-2來完成這樣的任務(wù)。
我敢肯定,我們很快就會發(fā)現(xiàn)它在這方面做得很差,這并不奇怪。然后,一個(gè)自然而然的問題浮現(xiàn)在腦海中:我們可以做些什么來改善其性能?
當(dāng)然,答案是我們可以!
使用含有推文及相應(yīng)情緒的數(shù)據(jù)集訓(xùn)練來自Hugging Face Hub的預(yù)訓(xùn)練GPT-2模型,充分利用微調(diào)的效果,以便提高性能。
所以,我們的最終目標(biāo)是擁有一個(gè)善于從文本中推斷情緒的模型。
第二步:選擇預(yù)訓(xùn)練的模型和數(shù)據(jù)集
第二步是選擇什么模型作為基本模型。在本文例子中,我們已經(jīng)選擇了模型:GPT-2。所以我們要對它進(jìn)行一些簡單的微調(diào)。
始終記住要選擇適合您任務(wù)的模型。
第三步:加載要使用的數(shù)據(jù)
我們已有了模型和主要任務(wù),現(xiàn)在需要一些數(shù)據(jù)來處理。
不過別擔(dān)心,Hugging Face已經(jīng)把一切都安排好了!
這時(shí)候,它的數(shù)據(jù)集庫有了用武之地。
在這個(gè)例子中,我們將充分利用Hugging Face數(shù)據(jù)集庫來導(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ù)看起來就像這樣:
第四步:分詞器(Tokenizer)
現(xiàn)在我們有了模型和數(shù)據(jù)集來對其進(jìn)行微調(diào)。因此,接下來的合理步驟是加載分詞器。由于LLM使用token(而不是單詞!!),我們需要分詞器將數(shù)據(jù)發(fā)送到我們的模型。
通過利用map方法對整個(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)練集:用來微調(diào)我們的模型。
- 測試集:用來評估模型。
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)
第六步:評估方法
Transformers庫提供了一個(gè)名為“Trainer”的類,它可以優(yōu)化我們模型的訓(xùn)練和評估。因此,在實(shí)際訓(xùn)練開始之前,我們需要定義一個(gè)函數(shù)來評估經(jīng)過微調(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ù)與評估策略,并執(zhí)行Trainer對象。
要執(zhí)行Trainer對象,我們只需使用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)過微調(diào),我們使用測試集來評估其性能。trainer對象已經(jīng)包含了經(jīng)過優(yōu)化的evaluate()方法。
import evaluate
trainer.evaluate()
這就是對任何LLM進(jìn)行微調(diào)的基本過程。
另外請記住,微調(diào)LLM的過程對計(jì)算資源的要求很高,因此您的本地計(jì)算機(jī)可能沒有足夠的能力來進(jìn)行微調(diào)。
主要結(jié)論
如今,針對特定任務(wù)對預(yù)訓(xùn)練的大語言模型(比如GPT)進(jìn)行微調(diào)對于改進(jìn)LLM在特定領(lǐng)域的性能至關(guān)重要。它使我們得以利用LLM的自然語言能力,同時(shí)提高它們的效率和定制方面的潛力,使這個(gè)過程易于訪問且具有成本效益。
如果遵循這七個(gè)簡單的步驟:從選擇正確的模型和數(shù)據(jù)集到訓(xùn)練和評估微調(diào)模型,我們可以在特定領(lǐng)域?qū)崿F(xiàn)卓越的模型性能。
如果想要查看完整代碼,可以在我的大語言模型GitHub代碼庫中找到: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