Transformers documentation
Klasifikasi teks
Klasifikasi teks
Klasifikasi teks adalah tugas NLP yang umum, yang memberikan label atau kelas pada teks. Beberapa perusahaan terbesar menjalankan klasifikasi teks di lingkungan produksi untuk berbagai aplikasi praktis. Salah satu bentuk klasifikasi teks yang paling populer adalah analisis sentimen, yang memberikan label seperti 🙂 positif, 🙁 negatif, atau 😐 netral pada rangkaian teks.
Panduan ini akan menunjukkan cara Anda untuk:
- Lakukan finetuning DistilBERT pada dataset IMDb untuk menentukan apakah ulasan film bersifat positif atau negatif.
- Gunakan model yang telah Anda finetune untuk inferensi.
Untuk melihat semua arsitektur dan checkpoint yang kompatibel dengan tugas ini, kami menyarankan untuk memeriksa halaman tugas.
Sebelum memulai, pastikan Anda telah menginstal semua pustaka yang diperlukan:
pip install transformers datasets evaluate accelerate
Kami menyarankan Anda untuk masuk ke akun Hugging Face Anda agar dapat mengunggah dan membagikan model Anda kepada komunitas. Saat diminta, masukkan token Anda untuk masuk:
>>> from huggingface_hub import notebook_login
>>> notebook_login()Muat dataset IMDb
Mulai dengan memuat dataset IMDb dari pustaka 🤗 Datasets:
>>> from datasets import load_dataset
>>> imdb = load_dataset("stanfordnlp/imdb")Lalu, lihatlah sebuah contoh:
>>> imdb["test"][0]
{
"label": 0,
"text": "I love sci-fi and am willing to put up with a lot. Sci-fi movies/TV are usually underfunded, under-appreciated and misunderstood. I tried to like this, I really did, but it is to good TV sci-fi as Babylon 5 is to Star Trek (the original). Silly prosthetics, cheap cardboard sets, stilted dialogues, CG that doesn't match the background, and painfully one-dimensional characters cannot be overcome with a 'sci-fi' setting. (I'm sure there are those of you out there who think Babylon 5 is good sci-fi TV. It's not. It's clichéd and uninspiring.) While US viewers might like emotion and character development, sci-fi is a genre that does not take itself seriously (cf. Star Trek). It may treat important issues, yet not as a serious philosophy. It's really difficult to care about the characters here as they are not simply foolish, just missing a spark of life. Their actions and reactions are wooden and predictable, often painful to watch. The makers of Earth KNOW it's rubbish as they have to always say \"Gene Roddenberry's Earth...\" otherwise people would not continue watching. Roddenberry's ashes must be turning in their orbit as this dull, cheap, poorly edited (watching it without advert breaks really brings this home) trudging Trabant of a show lumbers into space. Spoiler. So, kill off a main character. And then bring him back as another actor. Jeeez! Dallas all over again.",
}Terdapat dua field dalam dataset ini:
text: teks ulasan film.label: nilai yang berupa0untuk ulasan negatif atau1untuk ulasan positif.
Pra-pemrosesan
Langkah selanjutnya adalah memuat tokenizer DistilBERT untuk memproses pra-text field:
>>> from transformers import AutoTokenizer
>>> tokenizer = AutoTokenizer.from_pretrained("distilbert/distilbert-base-uncased")Buat fungsi pra-pemrosesan untuk melakukan tokenisasi pada text dan memotong (truncate) urutan agar tidak lebih panjang dari panjang input maksimum DistilBERT:
>>> def preprocess_function(examples):
... return tokenizer(examples["text"], truncation=True)Untuk menerapkan fungsi prapemrosesan ke seluruh dataset, gunakan fungsi map dari 🤗 Datasets. Anda dapat mempercepat map dengan mengatur batched=True untuk memproses beberapa elemen dataset sekaligus:
tokenized_imdb = imdb.map(preprocess_function, batched=True)Sekarang buat satu batch contoh menggunakan DataCollatorWithPadding. Lebih efisien untuk melakukan padding secara dinamis kalimat hingga panjang terpanjang dalam satu batch saat collation, daripada melakukan padding seluruh dataset hingga panjang maksimum.
>>> from transformers import DataCollatorWithPadding
>>> data_collator = DataCollatorWithPadding(tokenizer=tokenizer)Evaluasi
Menambahkan metrik selama pelatihan sering kali membantu untuk mengevaluasi kinerja model Anda. Anda dapat dengan cepat memuat metode evaluasi dengan pustaka 🤗 Evaluate. Untuk tugas ini, muat metrik accuracy (lihat quick tour 🤗 Evaluate untuk mempelajari lebih lanjut tentang cara memuat dan menghitung metrik):
>>> import evaluate
>>> accuracy = evaluate.load("accuracy")Lalu buat fungsi yang meneruskan prediksi dan label Anda ke compute untuk menghitung akurasi:
>>> import numpy as np
>>> def compute_metrics(eval_pred):
... predictions, labels = eval_pred
... predictions = np.argmax(predictions, axis=1)
... return accuracy.compute(predictions=predictions, references=labels)Fungsi compute_metrics Anda sudah siap digunakan, dan Anda akan kembali ke fungsi ini saat menyiapkan pelatihan.
Latih
Sebelum Anda mulai melatih model, buatlah peta dari id yang diharapkan ke label mereka dengan id2label dan label2id:
>>> id2label = {0: "NEGATIVE", 1: "POSITIVE"}
>>> label2id = {"NEGATIVE": 0, "POSITIVE": 1}Jika Anda belum familiar dengan finetuning model menggunakan Trainer, silakan lihat tutorial dasar di sini!
Anda siap untuk mulai melatih model Anda sekarang! Muat DistilBERT dengan AutoModelForSequenceClassification beserta jumlah label yang diharapkan dan pemetaan label:
>>> from transformers import AutoModelForSequenceClassification, TrainingArguments, Trainer
>>> model = AutoModelForSequenceClassification.from_pretrained(
... "distilbert/distilbert-base-uncased", num_labels=2, id2label=id2label, label2id=label2id
... )Pada titik ini, hanya tersisa tiga langkah:
- Definisikan hiperparameter pelatihan Anda di TrainingArguments. Satu-satunya parameter yang wajib diisi adalah
output_diryang menentukan lokasi penyimpanan model Anda. Anda akan mendorong model ini ke Hub dengan mengaturpush_to_hub=True(Anda harus masuk ke Hugging Face untuk mengunggah model Anda). Di akhir setiap epoch, Trainer akan mengevaluasi akurasi dan menyimpan checkpoint pelatihan. - Lewatkan argumen pelatihan ke Trainer bersama dengan model, dataset, tokenizer, data collator, dan fungsi
compute_metrics. - Panggil train() untuk melakukan finetuning pada model Anda.
>>> training_args = TrainingArguments(
... output_dir="my_awesome_model",
... learning_rate=2e-5,
... per_device_train_batch_size=16,
... per_device_eval_batch_size=16,
... num_train_epochs=2,
... weight_decay=0.01,
... eval_strategy="epoch",
... save_strategy="epoch",
... load_best_model_at_end=True,
... push_to_hub=True,
... )
>>> trainer = Trainer(
... model=model,
... args=training_args,
... train_dataset=tokenized_imdb["train"],
... eval_dataset=tokenized_imdb["test"],
... processing_class=tokenizer,
... data_collator=data_collator,
... compute_metrics=compute_metrics,
... )
>>> trainer.train()Trainer menerapkan dynamic padding secara default ketika Anda meneruskan
tokenizerke dalamnya. Dalam kasus ini, Anda tidak perlu menentukan data collator secara eksplisit.
Setelah pelatihan selesai, bagikan model Anda ke Hub dengan metode push_to_hub() agar semua orang dapat menggunakan model Anda:
>>> trainer.push_to_hub()Untuk contoh yang lebih mendalam tentang cara melakukan finetuning model untuk klasifikasi teks, lihat notebook PyTorch yang sesuai.
Inferensi
Bagus, sekarang setelah Anda melakukan finetuning pada model, Anda dapat menggunakannya untuk inferensi!
Ambil beberapa teks yang ingin Anda jalankan inferensinya:
>>> text = "This was a masterpiece. Not completely faithful to the books, but enthralling from beginning to end. Might be my favorite of the three."Cara termudah untuk mencoba model finetune Anda untuk inferensi adalah dengan menggunakannya dalam pipeline(). Buat instans pipeline untuk analisis sentimen dengan model Anda, lalu lewati teks Anda ke dalamnya:
>>> from transformers import pipeline
>>> classifier = pipeline("sentiment-analysis", model="stevhliu/my_awesome_model")
>>> classifier(text)
[{'label': 'POSITIVE', 'score': 0.9994940757751465}]Anda juga dapat mereplikasi hasil dari pipeline secara manual jika Anda mau:
Tokenisasi teks dan kembalikan tensor PyTorch:
>>> from transformers import AutoTokenizer
>>> tokenizer = AutoTokenizer.from_pretrained("stevhliu/my_awesome_model")
>>> inputs = tokenizer(text, return_tensors="pt")Lewatkan input Anda ke model dan kembalikan logits:
>>> import torch
>>> from transformers import AutoModelForSequenceClassification
>>> model = AutoModelForSequenceClassification.from_pretrained("stevhliu/my_awesome_model")
>>> with torch.no_grad():
... logits = model(**inputs).logitsDapatkan kelas dengan probabilitas tertinggi, lalu gunakan pemetaan id2label dari model untuk mengubahnya menjadi label teks:
>>> predicted_class_id = logits.argmax().item()
>>> model.config.id2label[predicted_class_id]
'POSITIVE'