12
Contoh Finetune dan Tutorial
Direktori examples/ dan tutorial/ menyimpan materi praktik repository ini. examples/ berisi enam notebook finetune yang siap dijalankan, sedangkan tutorial/ berisi satu notebook yang menyusun konsep dari bag-of-words sampai finetune BERT. Keduanya memakai modul yang sama: forward_sequence_classification dari utils.forward_fn, document_sentiment_metrics_fn dari utils.metrics, serta DocumentSentimentDataset dan DocumentSentimentDataLoader dari utils.data_utils. tutorial/finetune_smsa_tutorial.ipynb:17-401
Dependensi notebook dikumpulkan dalam satu berkas: numpy, pandas, torch, tqdm, transformers, nltk, sklearn, matplotlib, seaborn, dan ipywidgets. examples/requirements.txt:1-102
Jalur belajar dari konsep ke praktik
graph TD
A["Traditional Approach"] --> B["Bag-of-Word Model"]
B --> C["TF-IDF"]
C --> D["Word Vector Model"]
D --> E["FastText cc.id.300.bin"]
E --> F["Deep Learning Approach"]
F --> G["Finetuning SmSA dengan BERT"]
G --> H["Fine Tuning & Evaluation"]
style A fill:#f59e0b,color:#000
style D fill:#8b5cf6,color:#fff
style E fill:#8b5cf6,color:#fff
style G fill:#2d7d46,color:#fff
style H fill:#2d7d46,color:#fff
%% fig: Jalur belajar notebook tutorial
%% desc: Notebook tutorial bergerak dari pendekatan statistik, word vector FastText, dasar deep learning, sampai finetune BERT pada SmSA.Judul notebook tutorial adalah # Tutorial NLU - Finetuning SmSA, dan deskripsinya menyebut tiga label: positive, negative, dan neutral. tutorial/finetune_smsa_tutorial.ipynb:7-83
Simpul Traditional Approach membuka tiga pendekatan sekaligus: Bag of Word, TF-IDF, dan Word Vector. tutorial/finetune_smsa_tutorial.ipynb:356-3604
Simpul Word Vector Model memuat tiga keluarga model: CBOW, Skip-Gram yang mengarah ke FastText, dan GLoVe. tutorial/finetune_smsa_tutorial.ipynb:1817-18305
Kumpulan notebook finetune di examples/
| Berkas | Yang terbaca dari notebook | Rujukan |
|---|---|---|
finetune_smsa.ipynb | # Finetuning SmSA, tiga label sentimen | examples/finetune_smsa.ipynb:7-86 |
finetune_casa.ipynb | # Finetuning CASA | examples/finetune_casa.ipynb:77 |
finetune_wrete.ipynb | # Finetuning WReTe | examples/finetune_wrete.ipynb:78 |
finetune_emot.ipynb | memanggil document_sentiment_metrics_fn | examples/finetune_emot.ipynb:9429 |
finetune_ner_grit.ipynb | loop for epoch in range(n_epochs) | examples/finetune_ner_grit.ipynb:110910 |
finetune_fasttext_casa.ipynb | loop for epoch in range(n_epochs) | examples/finetune_fasttext_casa.ipynb:115811 |
Notebook finetune_smsa.ipynb memakai urutan sel # Load Tokenizer and Config, # Instantiate model, # Prepare Dataset, # Test model on sample sentences, # Fine Tuning & Evaluation, # Train, dan # Evaluate on test. examples/finetune_smsa.ipynb:103-10912 Notebook CASA memakai judul sel # Fine Tuning & Evaluation yang sama. examples/finetune_casa.ipynb:63113
Alur satu notebook finetune
graph LR
L["BertTokenizer + BertConfig"] --> M["BertForSequenceClassification"]
M --> S1["Test model on sample sentences"]
M --> T["Train n_epochs = 5"]
T --> V["Evaluate on validation"]
V --> E["Evaluate on test"]
E --> P["pred.txt"]
style M fill:#f59e0b,color:#000
style T fill:#2d7d46,color:#fff
style E fill:#2d7d46,color:#fff
style P fill:#336791,color:#fff
%% fig: Urutan sel notebook finetune
%% desc: Model dimuat, diuji sebelum finetune, dilatih lima epoch, divalidasi tiap epoch, lalu prediksi test ditulis ke pred.txt.Model dimuat lewat BertTokenizer.from_pretrained('indobenchmark/indobert-base-p1'), BertConfig.from_pretrained dengan config.num_labels = DocumentSentimentDataset.NUM_LABELS, lalu BertForSequenceClassification.from_pretrained(...). examples/finetune_smsa.ipynb:103-10912
Tiga berkas data dibaca dari ./dataset/smsa_doc-sentiment-prosa/: train_preprocess.tsv, valid_preprocess.tsv, dan test_preprocess_masked_label.tsv. examples/finetune_smsa.ipynb:463-46514
Dataset dibungkus DocumentSentimentDataset(..., lowercase=True), lalu DocumentSentimentDataLoader dipanggil dengan max_seq_len=512, batch_size=32, num_workers=16, dan shuffle=True untuk train. examples/finetune_smsa.ipynb:474-48015
Optimizer optim.Adam(model.parameters(), lr=3e-6) dipasang bersama model = model.cuda(). examples/finetune_smsa.ipynb:595-59616
Loop # Train berjalan n_epochs = 5. Tiap batch memanggil forward_sequence_classification(model, batch_data[:-1], i2w=i2w, device='cuda'), lalu optimizer.zero_grad(), loss.backward(), dan optimizer.step(). examples/finetune_smsa.ipynb:762-77917 Rincian forward pass dan metriknya ada di Forward Pass dan Metrik Evaluasi, sedangkan pembentukan batch ada di Data Utils dan Dataloader.
Setelah training, # Evaluate on test mengumpulkan list_hyp dan menulis pred.txt melalui pd.DataFrame({'label':list_hyp}). examples/finetune_smsa.ipynb:865-87918
⚠️ Indeks label berbeda antar alur. Tutorial memetakan
positiveke 2,negativeke 1, danneutralke 0 (tutorial/finetune_smsa_tutorial.ipynb:232-24119), sedangkanDocumentSentimentDatasetdiexamples/memberi{'positive': 0, 'neutral': 1, 'negative': 2}(examples/finetune_smsa.ipynb:498-50020). Hasil kedua alur tidak bisa dibandingkan per indeks.
⚠️ Dua alur memakai berkas test berbeda.
examples/finetune_smsa.ipynbmembacatest_preprocess_masked_label.tsv(examples/finetune_smsa.ipynb:463-46514), sedangkantutorial/finetune_smsa_tutorial.ipynbmembacatest_preprocess.tsv(tutorial/finetune_smsa_tutorial.ipynb:98-10021). Metrik test hanya bermakna pada berkas yang labelnya tidak di-mask.
Eksperimen traditional approach di tutorial
Setiap konfigurasi diuji dengan LogisticRegression dan dievaluasi memakai document_sentiment_metrics_fn. tutorial/finetune_smsa_tutorial.ipynb:390-39322
Rentang 17241 sampai 391358 fitur menunjukkan biaya n-gram tanpa pembatas, dan max_features memotongnya kembali ke 10000 atau 300. tutorial/finetune_smsa_tutorial.ipynb:40423 tutorial/finetune_smsa_tutorial.ipynb:57926
TfidfVectorizer() memakai pola yang sama: fit pada train, lalu transform pada valid dan test. tutorial/finetune_smsa_tutorial.ipynb:1300-130337
FastText sebagai word vector
Embedding bahasa Indonesia diunduh lewat cc.id.300.bin.gz dan dibuka dengan fasttext.load_model("./tutorial/cc.id.300.bin"). tutorial/finetune_smsa_tutorial.ipynb:1846-184838 tutorial/finetune_smsa_tutorial.ipynb:186539
Fungsi encode_fasttext menumpuk vektor setiap kata hasil word_tokenize dengan np.stack. tutorial/finetune_smsa_tutorial.ipynb:1874-188240
Setiap dokumen diringkas menjadi satu vektor dengan np.mean(x, axis=0) sebelum masuk LogisticRegression. tutorial/finetune_smsa_tutorial.ipynb:1891-189341
Deep learning dan finetune BERT
Deep Learning Approach dibuka dengan latar belakang bahwa pendekatan sebelumnya hanya memakai fitur statistik berjumlah tetap, sehingga informasi dari sekuens asli hilang. tutorial/finetune_smsa_tutorial.ipynb:2021-202942
Model yang dibahas mencakup Multi Layer Perceptron dan Convolution Neural Network (CNN). tutorial/finetune_smsa_tutorial.ipynb:2106-213643
Finetune di tutorial memakai indobenchmark/indobert-base-p1 dengan config.num_labels = DocumentSentimentDataset.NUM_LABELS, sama seperti di examples/. tutorial/finetune_smsa_tutorial.ipynb:2251-225744
Kesimpulan tutorial mendaftar lima bahan: Bag-of-words, TF-IDF, word vector (fasttext), pengantar deep learning, dan pemakaian BERT untuk analisis sentimen. tutorial/finetune_smsa_tutorial.ipynb:3033-304545
Catatan penutup menyebut hasil bisa lebih tinggi bila di-tuning lebih lanjut. tutorial/finetune_smsa_tutorial.ipynb:305246
Pemilihan model dan parameternya dibahas lebih jauh di Konfigurasi Argumen dan Pemilihan Model.