Transformers 文件

微調

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

微調

微調透過較小的專業資料集調整預訓練模型以適應特定任務。與從頭開始訓練模型相比,這種方法所需的資料和計算量要少得多,因此對於許多使用者來說,它是一種更易於訪問的選項。

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.loadEvaluate 庫中載入 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_datasetDatasets 庫中更底層的函式,它透過指定要使用的列和標籤列,讓您更精細地控制資料集的建立方式。

將分詞器新增到 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 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.