Traffine I/O

Bahasa Indonesia

2023-02-03

Hugging Face Transformers:Fine-tune

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.

https://huggingface.co/docs/transformers/v4.26.1/en/main_classes/trainer#transformers.TrainingArguments

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.

https://github.com/huggingface/transformers/tree/main/examples

Referensi

https://huggingface.co/docs/transformers/training
https://huggingface.co/transformers/v3.2.0/training.html
https://huggingface.co/docs/transformers/v4.26.1/en/main_classes/trainer#transformers.TrainingArguments
https://github.com/huggingface/transformers/tree/main/examples
https://huggingface.co/docs/transformers/notebooks

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!