Transformers 文件
微調
並獲得增強的文件體驗
開始使用
微調
微調透過較小的專業資料集調整預訓練模型以適應特定任務。與從頭開始訓練模型相比,這種方法所需的資料和計算量要少得多,因此對於許多使用者來說,它是一種更易於訪問的選項。
Transformers 提供了 Trainer API,它提供了一套全面的訓練功能,用於微調 Hub 上的任何模型。
在我們的“資源”部分的“任務秘籍”中瞭解如何微調其他任務的模型!
本指南將向您展示如何使用 Trainer 微調模型以對 Yelp 評論進行分類。
使用您的使用者令牌登入您的 Hugging Face 帳戶,以確保您可以訪問受控模型並在 Hub 上共享您的模型。
from huggingface_hub import login
login()
首先載入 Yelp Reviews 資料集並對其進行預處理(標記化、填充和截斷)以進行訓練。使用 map 一步預處理整個資料集。
from datasets import load_dataset
from transformers import AutoTokenizer
dataset = load_dataset("yelp_review_full")
tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-cased")
def tokenize(examples):
return tokenizer(examples["text"], padding="max_length", truncation=True)
dataset = dataset.map(tokenize, batched=True)
在完整資料集的較小子集上進行微調,以減少所需時間。與在完整資料集上進行微調相比,結果不會那麼好,但在提交完整資料集訓練之前,先確保一切正常工作很有用。
small_train = dataset["train"].shuffle(seed=42).select(range(1000))
small_eval = dataset["test"].shuffle(seed=42).select(range(1000))
Trainer
Trainer 是一個經過最佳化的 Transformers 模型訓練迴圈,無需手動編寫訓練程式碼即可輕鬆開始訓練。在 TrainingArguments 中選擇各種訓練功能,例如梯度累積、混合精度以及報告和記錄訓練指標的選項。
載入模型並提供預期的標籤數量(您可以在 Yelp Review 資料集卡 上找到此資訊)。
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained("google-bert/bert-base-cased", num_labels=5)
"Some weights of BertForSequenceClassification were not initialized from the model checkpoint at google-bert/bert-base-cased and are newly initialized: ['classifier.bias', 'classifier.weight']"
"You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference."
以上訊息提醒,模型預訓練的頭部被丟棄,並替換為隨機初始化的分類頭部。隨機初始化的頭部需要針對您的特定任務進行微調,才能輸出有意義的預測。
模型載入完成後,在 TrainingArguments 中設定訓練超引數。超引數是控制訓練過程的變數——例如學習率、批次大小、時期數——這反過來會影響模型效能。選擇正確的超引數非常重要,您應該進行試驗以找到適合您任務的最佳配置。
對於本指南,您可以使用預設超引數,它們提供了一個良好的基線。本指南中唯一要配置的設定是儲存檢查點的位置、如何在訓練期間評估模型效能以及將模型推送到 Hub。
Trainer 需要一個函式來計算和報告您的指標。對於分類任務,您將使用 evaluate.load 從 Evaluate 庫中載入 accuracy 函式。在 compute 中收集預測和標籤以計算準確率。
import numpy as np
import evaluate
metric = evaluate.load("accuracy")
def compute_metrics(eval_pred):
logits, labels = eval_pred
# convert the logits to their predicted class
predictions = np.argmax(logits, axis=-1)
return metric.compute(predictions=predictions, references=labels)
設定 TrainingArguments,指定儲存模型的位置以及何時在訓練期間計算準確率。下面的示例將其設定為 "epoch"
,這意味著在每個 epoch 結束時報告準確率。新增 push_to_hub=True
以在訓練後將模型上傳到 Hub。
from transformers import TrainingArguments
training_args = TrainingArguments(
output_dir="yelp_review_classifier",
eval_strategy="epoch",
push_to_hub=True,
)
建立一個 Trainer 例項,並向其傳遞模型、訓練引數、訓練和測試資料集以及評估函式。呼叫 train() 開始訓練。
trainer = Trainer(
model=model,
args=training_args,
train_dataset=dataset["train"],
eval_dataset=dataset["test"],
compute_metrics=compute_metrics,
)
trainer.train()
最後,使用 push_to_hub() 將您的模型和分詞器上傳到 Hub。
trainer.push_to_hub()
TensorFlow
Trainer 與 Transformers TensorFlow 模型不相容。相反,由於這些模型是作為標準 tf.keras.Model 實現的,因此可以使用 Keras 對它們進行微調。
from transformers import TFAutoModelForSequenceClassification
from datasets import load_dataset
from transformers import AutoTokenizer
model = TFAutoModelForSequenceClassification.from_pretrained("google-bert/bert-base-cased", num_labels=5)
dataset = load_dataset("yelp_review_full")
tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-cased")
def tokenize(examples):
return tokenizer(examples["text"])
dataset = dataset.map(tokenize)
有兩種方法可以將資料集轉換為 tf.data.Dataset。
- prepare_tf_dataset() 是建立 tf.data.Dataset 的推薦方法,因為您可以檢查模型以確定使用哪些列作為輸入以及丟棄哪些列。這使您可以建立更簡單、效能更高的資料集。
- to_tf_dataset 是 Datasets 庫中更底層的函式,它透過指定要使用的列和標籤列,讓您更精細地控制資料集的建立方式。
將分詞器新增到 prepare_tf_dataset() 以填充每個批次,您還可以選擇隨機打亂資料集。對於更復雜的預處理,可以將預處理函式傳遞給 collate_fn
引數。
tf_dataset = model.prepare_tf_dataset(
dataset["train"], batch_size=16, shuffle=True, tokenizer=tokenizer
)
沒必要向 compile 傳遞損失引數,因為 Transformers 會自動選擇適合任務和架構的損失。但是,如果您願意,可以隨時指定損失引數。
from tensorflow.keras.optimizers import Adam
model.compile(optimizer=Adam(3e-5))
model.fit(tf_dataset)
資源
有關各種任務的更詳細訓練指令碼,請參閱 Transformers 示例。您還可以檢視筆記本以獲取互動式示例。
< > 在 GitHub 上更新