Lompat ke konten
dokumentasi.id
Commit ce728f6
v1
Star659

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-40

Dependensi notebook dikumpulkan dalam satu berkas: numpy, pandas, torch, tqdm, transformers, nltk, sklearn, matplotlib, seaborn, dan ipywidgets. examples/requirements.txt:1-10

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.
Fig. 1: Jalur belajar notebook tutorialNotebook 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-8

Simpul Traditional Approach membuka tiga pendekatan sekaligus: Bag of Word, TF-IDF, dan Word Vector. tutorial/finetune_smsa_tutorial.ipynb:356-360

Simpul Word Vector Model memuat tiga keluarga model: CBOW, Skip-Gram yang mengarah ke FastText, dan GLoVe. tutorial/finetune_smsa_tutorial.ipynb:1817-1830

Kumpulan notebook finetune di examples/

BerkasYang terbaca dari notebookRujukan
finetune_smsa.ipynb# Finetuning SmSA, tiga label sentimenexamples/finetune_smsa.ipynb:7-8
finetune_casa.ipynb# Finetuning CASAexamples/finetune_casa.ipynb:7
finetune_wrete.ipynb# Finetuning WReTeexamples/finetune_wrete.ipynb:7
finetune_emot.ipynbmemanggil document_sentiment_metrics_fnexamples/finetune_emot.ipynb:942
finetune_ner_grit.ipynbloop for epoch in range(n_epochs)examples/finetune_ner_grit.ipynb:1109
finetune_fasttext_casa.ipynbloop for epoch in range(n_epochs)examples/finetune_fasttext_casa.ipynb:1158

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-109 Notebook CASA memakai judul sel # Fine Tuning & Evaluation yang sama. examples/finetune_casa.ipynb:631

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.
Fig. 2: Urutan sel notebook finetuneModel 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-109

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-465

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-480

Optimizer optim.Adam(model.parameters(), lr=3e-6) dipasang bersama model = model.cuda(). examples/finetune_smsa.ipynb:595-596

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-779 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-879

⚠️ Indeks label berbeda antar alur. Tutorial memetakan positive ke 2, negative ke 1, dan neutral ke 0 (tutorial/finetune_smsa_tutorial.ipynb:232-241), sedangkan DocumentSentimentDataset di examples/ memberi {'positive': 0, 'neutral': 1, 'negative': 2} (examples/finetune_smsa.ipynb:498-500). Hasil kedua alur tidak bisa dibandingkan per indeks.

⚠️ Dua alur memakai berkas test berbeda. examples/finetune_smsa.ipynb membaca test_preprocess_masked_label.tsv (examples/finetune_smsa.ipynb:463-465), sedangkan tutorial/finetune_smsa_tutorial.ipynb membaca test_preprocess.tsv (tutorial/finetune_smsa_tutorial.ipynb:98-100). 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-393

Konfigurasi CountVectorizerJumlah fiturACC trainRujukan
CountVectorizer()172410.9810909090909091tutorial/finetune_smsa_tutorial.ipynb:390-393, tutorial/finetune_smsa_tutorial.ipynb:404, tutorial/finetune_smsa_tutorial.ipynb:468-472
ngram_range=(1,3)3913580.9983636363636363tutorial/finetune_smsa_tutorial.ipynb:565-568, tutorial/finetune_smsa_tutorial.ipynb:579, tutorial/finetune_smsa_tutorial.ipynb:646-649
min_df=5, ngram_range=(1,4), max_features=10000100000.9815454545454545tutorial/finetune_smsa_tutorial.ipynb:918-921, tutorial/finetune_smsa_tutorial.ipynb:932, tutorial/finetune_smsa_tutorial.ipynb:996-1000
ngram_range=(1,3), max_features=3003000.8342727272727273, valid 0.8063492063492064, test 0.656tutorial/finetune_smsa_tutorial.ipynb:1093-1096, tutorial/finetune_smsa_tutorial.ipynb:1107, tutorial/finetune_smsa_tutorial.ipynb:1171-1175, tutorial/finetune_smsa_tutorial.ipynb:1205, tutorial/finetune_smsa_tutorial.ipynb:1238-1241, tutorial/finetune_smsa_tutorial.ipynb:1251-1252

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:404 tutorial/finetune_smsa_tutorial.ipynb:579

TfidfVectorizer() memakai pola yang sama: fit pada train, lalu transform pada valid dan test. tutorial/finetune_smsa_tutorial.ipynb:1300-1303

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-1848 tutorial/finetune_smsa_tutorial.ipynb:1865

Fungsi encode_fasttext menumpuk vektor setiap kata hasil word_tokenize dengan np.stack. tutorial/finetune_smsa_tutorial.ipynb:1874-1882

Setiap dokumen diringkas menjadi satu vektor dengan np.mean(x, axis=0) sebelum masuk LogisticRegression. tutorial/finetune_smsa_tutorial.ipynb:1891-1893

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-2029

Model yang dibahas mencakup Multi Layer Perceptron dan Convolution Neural Network (CNN). tutorial/finetune_smsa_tutorial.ipynb:2106-2136

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-2257

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-3045

Catatan penutup menyebut hasil bisa lebih tinggi bila di-tuning lebih lanjut. tutorial/finetune_smsa_tutorial.ipynb:3052

Pemilihan model dan parameternya dibahas lebih jauh di Konfigurasi Argumen dan Pemilihan Model.