Fine-tuning
Hugging Face Transformers menyediakan akses ke ribuan model yang sudah dilatih sebelumnya untuk berbagai macam tugas. Ketika menggunakan model yang telah dilatih sebelumnya, model ini dilatih pada kumpulan data khusus untuk tugas yang diinginkan. Hal ini disebut fine-tuning dan merupakan teknik pembelajaran yang sangat kuat.
Model yang telah dilatih sebelumnya dapat disetel dengan cara berikut:
- Menyempurnakan model yang telah dilatih sebelumnya dengan Transformers Trainer
- Menyempurnakan model yang telah dilatih sebelumnya dengan TensorFlow
- Menyempurnakan model yang telah dilatih sebelumnya dengan PyTorch asli
Menyiapkan dataset
Sebelum menyempurnakan model yang telah dilatih sebelumnya, unduh dataset dan siapkan untuk pelatihan.
Muat dataset bernama Yelp Reviews.
$ pip install transformers datasets
from datasets import load_dataset
dataset = load_dataset("yelp_review_full")
dataset["train"][100]
{'label': 0,
'text': 'My expectations for McDonalds are t rarely high. But for one to still fail so spectacularly...that takes something special!\\nThe cashier took my friends\'s order, then promptly ignored me. I had to force myself in front of a cashier who opened his register to wait on the person BEHIND me. I waited over five minutes for a gigantic order that included precisely one kid\'s meal. After watching two people who ordered after me be handed their food, I asked where mine was. The manager started yelling at the cashiers for \\"serving off their orders\\" when they didn\'t have their food. But neither cashier was anywhere near those controls, and the manager was the one serving food to customers and clearing the boards.\\nThe manager was rude when giving me my order. She didn\'t make sure that I had everything ON MY RECEIPT, and never even had the decency to apologize that I felt I was getting poor service.\\nI\'ve eaten at various McDonalds restaurants for over 30 years. I\'ve worked at more than one location. I expect bad days, bad moods, and the occasional mistake. But I have yet to have a decent experience at this store. It will remain a place I avoid unless someone in my party needs to avoid illness from low blood sugar. Perhaps I should go back to the racially biased service of Steak n Shake instead!'}
Gunakan Tokenizer untuk memproses urutan panjang variabel. Untuk memproses kumpulan data, terapkan fungsi prapemrosesan ke seluruh kumpulan data menggunakan metode peta
pada Kumpulan Data.
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-cased")
def tokenize_function(ds):
return tokenizer(ds["text"], padding="max_length", truncation=True)
tokenized_datasets = dataset.map(tokenize_function, batched=True)
Untuk menghemat waktu, sebagian kecil dari seluruh kumpulan data akan dibuat untuk penyempurnaan.
small_train_dataset = tokenized_datasets["train"].shuffle(seed=42).select(range(1000))
small_eval_dataset = tokenized_datasets["test"].shuffle(seed=42).select(range(1000))
Transformers Trainer
Hugging Face Transformers menyediakan kelas Trainer
yang dioptimalkan untuk model pelatihan, sehingga mudah untuk memulai pelatihan tanpa harus menulis loop pelatihan Anda sendiri secara manual. API Trainer mendukung berbagai pilihan dan fitur pelatihan, termasuk pencatatan, akumulasi gradien, presisi campuran, dan banyak lagi.
Pertama, muat model dan tentukan jumlah label yang diharapkan; jika Anda memeriksa dataset Yelp Review, Anda akan melihat ada 5 label.
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", num_labels=5)
TrainingArguments
Selanjutnya, buat kelas TrainingArguments
. Kelas ini berisi semua hiperparameter yang dapat disetel dan flag yang mengatur opsi pelatihan.
from transformers import TrainingArguments
training_args = TrainingArguments(
output_dir='test_trainer', # output directory
num_train_epochs=3, # total # of training epochs
per_device_train_batch_size=16, # batch size per device during training
per_device_eval_batch_size=64, # batch size for evaluation
warmup_steps=500, # number of warmup steps for learning rate scheduler
weight_decay=0.01, # strength of weight decay
logging_dir='./logs', # directory for storing logs
)
Informasi lebih lanjut tentang TrainingArguments
dapat ditemukan di tautan berikut.
Evaluate
Pelatih tidak secara otomatis mengevaluasi performa model selama latihan; Anda harus mengoper fungsi ke Pelatih untuk menghitung dan melaporkan metrik. Pustaka Evaluate
menyediakan fungsi presisi sederhana yang dapat dimuat dengan fungsi evaluate.load
.
import numpy as np
import evaluate
metric = evaluate.load("accuracy")
Panggil compute
dengan metric
untuk menghitung akurasi prakiraan. Sebelum meneruskan prakiraan ke compute
, prakiraan tersebut harus dikonversi ke logit
.
def compute_metrics(pred):
logits, labels = pred
predictions = np.argmax(logits, axis=-1)
return metric.compute(predictions=predictions, references=labels)
Jika Anda ingin memantau metrik evaluasi selama penyempurnaan, tentukan parameter evaluation_strategy
sebagai argumen pembelajaran untuk melaporkan metrik evaluasi di akhir setiap epoch.
from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(
output_dir='test_trainer', # output directory
num_train_epochs=3, # total # of training epochs
per_device_train_batch_size=16, # batch size per device during training
per_device_eval_batch_size=64, # batch size for evaluation
warmup_steps=500, # number of warmup steps for learning rate scheduler
weight_decay=0.01, # strength of weight decay
logging_dir='./logs', # directory for storing logs
evaluation_strategy="epoch"
)
Trainer
Buat objek Trainer yang berisi model, argumen, set data pelatihan dan pengujian, dan fungsi evaluasi.
trainer = Trainer(
model=model,
args=training_args,
train_dataset=small_train_dataset,
eval_dataset=small_eval_dataset,
compute_metrics=compute_metrics,
)
Panggil train()
untuk menyempurnakan model.
trainer.train()
Tensorflow
Anda juga dapat melatih model Hugging Face Transformers di TensorFlow menggunakan API Keras.
Jika Anda ingin melatih model Hugging Face Transformers dengan API Keras, Anda perlu mengonversi dataset ke dalam format yang dapat dimengerti oleh Keras. Jika datasetnya kecil, ubah seluruh dataset menjadi larik NumPy dan berikan ke Keras.
Pertama, muat dataset. Karena ini adalah tugas klasifikasi teks biner sederhana, kita akan menggunakan tolok ukur GLUE dataset CoLA dan hanya mengambil pemisahan pelatihan untuk saat ini.
from datasets import load_dataset
dataset = load_dataset("glue", "cola")
dataset = dataset["train"] # Just take the training split for now
Selanjutnya, muat Tokenizer dan tokenisasi data sebagai larik NumPy. Karena label sudah berupa daftar 0 dan 1, kita mengonversinya secara langsung menjadi larik NumPy tanpa melakukan tokenisasi.
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-cased")
tokenized_data = tokenizer(dataset["sentence"], return_tensors="np", padding=True)
# Tokenizer returns a BatchEncoding, but we convert that to a dict for Keras
tokenized_data = dict(tokenized_data)
labels = np.array(dataset["label"]) # Label is already an array of 0 and 1
Terakhir, muat, susun, dan sesuaikan model.
from transformers import TFAutoModelForSequenceClassification
from tensorflow.keras.optimizers import Adam
# Load and compile our model
model = TFAutoModelForSequenceClassification.from_pretrained("bert-base-cased")
# Lower learning rates are often better for fine-tuning transformers
model.compile(optimizer=Adam(3e-5))
model.fit(tokenized_data, labels)
PyTorch
Anda dapat menyempurnakan model Hugging Face Transformers di PyTorch asli.
Pertama, secara manual melakukan post-processing tokenized_dataset
untuk mempersiapkannya untuk pelatihan.
Hapus kolom text
karena model tidak dapat menerima teks mentah sebagai input.
tokenized_datasets = tokenized_datasets.remove_columns(["text"])
Ganti nama kolom label
menjadi label
karena model mengharapkan argumen diberi nama labels
.
tokenized_datasets = tokenized_datasets.rename_column("label", "labels")
Atur format set data untuk mengembalikan tensor PyTorch, bukan daftar.
tokenized_datasets.set_format("torch")
Selanjutnya, buatlah subset yang lebih kecil dari kumpulan data untuk menghemat waktu.
small_train_dataset = tokenized_datasets["train"].shuffle(seed=42).select(range(1000))
small_eval_dataset = tokenized_datasets["test"].shuffle(seed=42).select(range(1000))
Buat DataLoader
untuk kumpulan data pelatihan dan pengujian sehingga Anda dapat melakukan iterasi melalui kumpulan data.
from torch.utils.data import DataLoader
train_dataloader = DataLoader(small_train_dataset, shuffle=True, batch_size=8)
eval_dataloader = DataLoader(small_eval_dataset, batch_size=8)
Jumlah label dibaca ke dalam model.
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", num_labels=5)
Buat pengoptimal dan penjadwal laju pembelajaran untuk menyempurnakan model. Kita akan menggunakan pengoptimal AdamW
dari PyTorch.
from torch.optim import AdamW
optimizer = AdamW(model.parameters(), lr=5e-5)
Membuat penjadwal laju pembelajaran default dari Trainer
.
num_epochs = 3
num_training_steps = num_epochs * len(train_dataloader)
lr_scheduler = get_scheduler(
name="linear", optimizer=optimizer, num_warmup_steps=0, num_training_steps=num_training_steps
)
Jika GPU tersedia, tentukan perangkat yang menggunakan GPU.
import torch
device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
model.to(device)
Untuk melacak kemajuan latihan, gunakan pustaka tqdm
untuk menambahkan bilah kemajuan berdasarkan jumlah langkah latihan.
from tqdm.auto import tqdm
progress_bar = tqdm(range(num_training_steps))
model.train()
for epoch in range(num_epochs):
for batch in train_dataloader:
batch = {k: v.to(device) for k, v in batch.items()}
outputs = model(**batch)
loss = outputs.loss
loss.backward()
optimizer.step()
lr_scheduler.step()
optimizer.zero_grad()
progress_bar.update(1)
Sama seperti saat Anda menambahkan fungsi evaluasi ke Trainer, Anda perlu melakukan hal yang sama saat menulis loop latihan Anda sendiri. Namun, alih-alih menghitung dan melaporkan nilai evaluasi di akhir setiap epoch, kali ini Anda akan mengakumulasikan semua batch dengan add_batch
dan menghitung nilai evaluasi di bagian paling akhir.
import evaluate
metric = evaluate.load("accuracy")
model.eval()
for batch in eval_dataloader:
batch = {k: v.to(device) for k, v in batch.items()}
with torch.no_grad():
outputs = model(**batch)
logits = outputs.logits
predictions = torch.argmax(logits, dim=-1)
metric.add_batch(predictions=predictions, references=batch["labels"])
metric.compute()
Resource tambahan
Untuk contoh penyetelan yang lebih rinci, lihat di bawah ini.
- Skrip untuk mempelajari tugas-tugas NLP yang umum di PyTorch dan TensorFlow
https://huggingface.co/docs/transformers/notebooks - Berbagai buku catatan tentang cara menyempurnakan model untuk tugas-tugas tertentu di PyTorch dan TensorFlow
Referensi