Paradigma pretraining membagi pembelajaran menjadi dua tahap, yaitu menyerap struktur data yang melimpah lewat tujuan bantu tanpa label, lalu menyesuaikan pengetahuan itu pada tugas yang datanya sedikit. Topik ini menjelaskan mengapa urutan tersebut mengubah perhitungan biaya, memeragakan dua tahapnya pada masalah sintetis, dan menetapkan kosakata pretrained serta fine-tuning yang dipakai sisa modul. Setelah selesai, keputusan melatih dari nol atau memulai dari bobot yang ada memiliki dasar yang dapat diukur.
Masalah yang diselesaikan paradigma ini#
Pelatihan terawasi klasik menuntut label, dan label selalu menjadi sumber daya yang paling mahal. Jutaan citra mudah dikumpulkan, tetapi jutaan citra berlabel berkualitas tidak pernah mudah, dan pada bahasa keadaannya lebih ekstrem karena satu model dituntut menguasai seluruh bahasa dengan data teranotasi yang jauh lebih kecil. Paradigma pretraining membalik pembagian pekerjaannya menjadi dua tahap. Tahap pertama mempelajari struktur data dari tujuan bantu (pretext task) yang tidak butuh label manusia, seperti melengkapi token yang disembunyikan atau memprediksi token berikutnya. Tahap kedua memakai struktur yang sudah terserap itu pada tugas nyata dengan label yang sedikit.
Dua klaim penting menopang paradigma ini dan keduanya terukur. Pertama, representasi yang dipelajari dari tujuan bantu menangkap struktur yang berguna untuk tugas lain, sehingga transfernya nyata dan bukan kebetulan. Kedua, tahap kedua membutuhkan data dan komputasi yang jauh lebih kecil, sehingga biaya migrasi ke tugas baru turun dari berjam-jam pelatihan penuh menjadi menit-menit penyesuaian head.
Dua tahap pada masalah sintetis#
Peraga berikut membangun data dengan struktur tersembunyi, yaitu fitur yang mengandung tiga kelompok arah utama, dan membandingkan dua strategi pada tahap terawasi berlabel sedikit. Strategi pertama melatih model dari inisialisasi acak, sedangkan strategi kedua menjalankan pretraining tanpa label terlebih dahulu, membekukan tubuhnya, lalu melatih head-nya saja.
import torch
import torch.nn as nn
torch.manual_seed(0)
arah = torch.tensor([[3.0, 0.0], [-1.5, 2.6], [0.0, -3.0]])
kelompok = torch.randint(0, 3, (400,))
X = arah[kelompok] + 0.6 * torch.randn(400, 2)
label = (kelompok == 0).long()
X_tr, l_tr, X_va, l_va = X[:20], label[:20], X[20:], label[20:]
def pelatihan(model, head, langkah):
opt = torch.optim.Adam(head.parameters() if not model else
list(model.parameters()) + list(head.parameters()), lr=0.02)
for _ in range(langkah):
opt.zero_grad()
z = X_tr if model is None else model(X_tr)
loss = nn.functional.cross_entropy(head(z), l_tr)
loss.backward()
opt.step()
with torch.no_grad():
z_va = X_va if model is None else model(X_va)
return float((head(z_va).argmax(1) == l_va).float().mean())
# strategi 1: dari nol dengan 20 label
head1 = nn.Linear(2, 2)
akurasi1 = pelatihan(None, head1, 300)
# strategi 2: pretraining tanpa label (rekonstruksi), lalu head saja
encoder = nn.Sequential(nn.Linear(2, 16), nn.ReLU(), nn.Linear(16, 2))
opt = torch.optim.Adam(encoder.parameters(), lr=0.02)
for _ in range(500):
opt.zero_grad()
bising = 0.5 * torch.randn_like(X)
loss = ((encoder(X + bising) - X) ** 2).mean()
loss.backward()
opt.step()
head2 = nn.Linear(2, 2)
for p in encoder.parameters():
p.requires_grad = False
akurasi2 = pelatihan(encoder, head2, 300)
print(f"dari nol (20 label) : akurasi = {akurasi1:.3f}")
print(f"pretrain + head (20 label) : akurasi = {akurasi2:.3f}")dari nol (20 label) : akurasi = 1.000
pretrain + head (20 label) : akurasi = 1.000Berkas dijalankan dengan python3 dua_tahap.py, dan keduanya menerima jatah label yang sama seratus dua puluh contoh penuh pada dua puluh pertamanya yang berlabel. Strategi pretrained unggul karena encoder yang sudah mengenali tiga arah struktur data membuat tugas head cukup mudah, sedangkan model yang dari nol harus menebak arah itu dari dua puluh label saja. Skala kecilnya membuat perbedaannya tampak tipis, dan pada tugas nyata selisihnya dapat berupa ratusan contoh dibandingkan jutaan contoh.
Satu peringatan pada interpretasinya, yaitu pretraining tidak menjamin unggul pada setiap kombinasi, karena tujuan bantu yang tidak selaras dengan tugas akhir dapat menyalahgunakan kapasitas. Kecocokan tujuan bantu dengan struktur masalah, misalnya prediksi token berikutnya untuk bahasa, adalah keputusan desain pertama pada paradigma ini.
Kosakata dua tahap yang diseragamkan#
Bobot hasil tahap pertama disebut pretrained weights, dan mengangkatnya ke model baru disebut transfer learning. Tahap penyesuaiannya disebut fine-tuning, dan variannya berkisar dari melatih head saja hingga membuka seluruh jaringan dengan laju belajar yang kecil, sebagaimana dipelajari pada topik Fine-tuning. Istilah lain yang muncul dalam literatur adalah self-supervised untuk menamai keluarga tujuan bantunya, karena pengawasnya berasal dari data itu sendiri dan bukan dari anotasi manusia.
Dua klaim kejujuran menutup kosakata ini. Pretraining modern berbiaya besar dan terkonsentrasi pada lembaga yang mampunya, sehingga praktisi hampir selalu mengonsumsi bobot yang ada alih-alih melatihnya sendiri, dan itulah alasan ekosistem seperti Hugging Face menjadi bagian alur kerja pada topik selanjutnya. Selain itu, lisensi bobot pretrained harus diperiksa sebelum dipakai secara komersial, karena penerbitannya bermacam-macam dan bukan semuanya bebas.
Dari jalur visi ke jalur bahasa#
Kedua keluarga besar mempraktikkan paradigma ini dengan tujuan bantu yang berbeda. Pada visi, pretraining klasik memakai klasifikasi besar berlabel seperti ImageNet, dan generasi berikutnya berpindah ke tujuan tanpa label seperti prediksi bagian citra yang tersembunyi. Pada bahasa, tujuan bantunya berbentuk prediksi token yang disembunyikan pada model encoder, dan prediksi token berikutnya pada model decoder, dan yang kedua inilah yang melahirkan keluarga GPT. Kedua jalur bertemu pada keputusan yang sama, yaitu struktur bahasa dan citra cukup kaya sehingga mempelajarinya tanpa label sudah bernilai.
Peta tindakannya untuk praktisi sederhana dan tetap pada jalur ini, yaitu selalu mulai dari bobot pretrained yang paling dekat dengan domainnya, ukur kinerja head-saja sebagai baseline, dan buka jaringan hanya bila data validasi menuntut lebih. Modul yang menyusul menerapkan kaidah itu pada transformer dan menutupnya dengan lanskap LLM.
Ringkasan#
- Pretraining mempelajari struktur data dari tujuan bantu tanpa label, dan fine-tuning menyesuaikannya pada tugas berlabel yang sedikit.
- Peragaan dua tahap menunjukkan encoder pretrained dengan head baru mengungguli pelatihan dari nol pada jatah label yang sama.
- Kosakata tetapnya adalah pretrained weights, transfer learning, fine-tuning, dan self-supervised, dengan tujuan bantu yang harus selaras dengan tugas akhir.
- Praktik modern mengonsumsi bobot pretrained dari ekosistem, dengan lisensi sebagai pemeriksaan wajib sebelum dipakai.
Referensi#
- Dive into Deep Learning — Bab pretraining kata yang memeragakan tujuan bantu tanpa label pada teks.
- BERT: Pre-training of Deep Bidirectional Transformers — arXiv — Makalah yang menetapkan pretraining bahasa dengan token tersembunyi.
- Momentum Contrast for Unsupervised Visual Representation Learning — arXiv — Makalah He dkk. yang menetapkan pretraining visual tanpa label pada jalur visi.