Ritual overfit satu batch adalah langkah debug pertama yang dijalankan pada setiap model baru, yaitu memaksa satu batch kecil dilatih hingga loss mendekati nol sebelum pelatihan penuh dimulai. Topik ini menjelaskan mengapa ritual ini mampu menangkap sebagian besar kekeliruan pelatihan, menuliskan prosedurnya lengkap dengan kode, dan menyediakan tabel membaca gejalanya. Setelah selesai, ritual ini menjadi kebiasaan kerja yang dijalankan tanpa perlu diingatkan.
Mengapa ritual ini menangkap hampir semua masalah#
Model yang arsitekturnya masuk akal hampir selalu mampu menghafal delapan sampai tiga puluh dua contoh dalam ratusan langkah, karena kapasitasnya jauh melampaui kebutuhan batch kecil. Apabila loss satu batch gagal turun mendekati nol, kekeliruannya hampir pasti bukan pada kapasitas, melainkan pada salah satu dari empat tempat, yaitu koneksi antara data dan model, perhitungan loss, arah gradien, atau langkah optimizer. Kekeliruan semacam ini tersembunyi pada pelatihan penuh di balik kurva yang turun perlahan, tetapi telanjang pada ritual satu batch.
Ritual ini juga memisahkan dua pertanyaan yang sering bercampur saat debug. Pertanyaan apakah sistemnya benar dijawab oleh ritual satu batch, sedangkan pertanyaan apakah modelnya cukup untuk masalah penuh dijawab oleh pelatihan sungguhan dengan kurva validasi. Menjalankan pelatihan berjam-jam untuk mengetahui bahwa labelnya salah adalah pemborosan paling umum yang dicegah ritual ini, dan kebiasaannya dipopulerkan oleh tulisan Karpathy tentang resep pelatihan jaringan saraf.
Prosedur lengkap dengan kode#
Prosedurnya empat langkah. Pertama, ambil satu batch tetap dari DataLoader dengan benih, dan jangan dikacaukan lagi di seluruh ritual. Kedua, jalankan siklus pelatihan full-batch pada batch itu dengan optimizer yang akan dipakai sungguhan. Ketiga, pastikan loss turun mendekati nol dan metrik sampel yang diprediksi tepat semuanya. Keempat, periksa bentuk setiap tensor dengan print sebelum loop pertama, karena ketidakcocokan bentuk sering bersembunyi di balik broadcasting yang diam-diam berhasil.
import torch
import torch.nn as nn
torch.manual_seed(0)
X = torch.randn(16, 2)
t = ((X[:, 0] + X[:, 1]) > 0).long()
model = nn.Sequential(nn.Linear(2, 32), nn.ReLU(), nn.Linear(32, 2))
opt = torch.optim.Adam(model.parameters(), lr=0.01)
print("bentuk X:", tuple(X.shape), "| bentuk t:", tuple(t.shape))
for langkah in range(1, 401):
opt.zero_grad()
loss = nn.functional.cross_entropy(model(X), t)
loss.backward()
opt.step()
if langkah % 100 == 0:
benar = (model(X).argmax(dim=1) == t).float().mean()
print(f"langkah {langkah:3d}: loss={loss.item():.5f} akurasi={benar.item():.3f}")bentuk X: (16, 2) | bentuk t: (16,)
langkah 100: loss=0.00630 akurasi=1.000
langkah 200: loss=0.00131 akurasi=1.000
langkah 300: loss=0.00056 akurasi=1.000
langkah 400: loss=0.00031 akurasi=1.000Berkas dijalankan dengan python3 ritual_satu_batch.py, dan hasil ritualnya tuntas karena loss menyusut dari sekitar 0,7 menuju mendekati nol dengan akurasi sempurna pada batch itu. Keluaran seperti ini menandakan rantai data, model, loss, dan optimizer sudah tersambung dengan benar, sehingga pelatihan penuh boleh dimulai. Apabila ritual berjalan pada model sederhana namun gagal pada arsitektur baru, kecurigaan berpindah ke kapasitas atau skala masalah, dan itulah temuan yang sah dari ritual ini.
Membaca gejala yang muncul#
Kegagalan ritual bukan akhir, melainkan diagnosis awal yang arahnya jelas. Tabel berikut memetakan gejala ke penyebab utamanya, dan urutan pemeriksanaannya mengikuti baris tabel.
| Gejala pada satu batch | Penyebab utama | Pemeriksaan lanjutan |
|---|---|---|
| Loss tidak turun sama sekali | Label tidak nyambung dengan keluaran | Cocokkan indeks kelas dan bentuk target |
Loss menjadi nan | Learning rate terlalu besar atau pembagian nol | Turunkan lr, periksa log dan pembagi |
| Loss turun lalu menetap tinggi | Aktivasi atau bentuk tensor salah | Cetak bentuk dan rentang tiap layer |
| Akurasi sempurna sejak langkah awal | Kebocoran label ke masukan | Periksa fitur yang mencerminkan target |
Gejala terakhir layak digarisbawahi karena terlihat seperti keberhasilan. Akurasi yang sempurna sejak sebelum pelatihan biasanya berarti masukan memuat informasi jawabannya, misalnya kolom yang merupakan transformasi langsung dari label, dan hanya perbandingan dengan intuisi masalah yang menangkapnya. Keempat gejala bermuara pada kebiasaan yang sama, yaitu tidak percaya pada kode pelatihan sebelum ritualnya lolos.
Kapan ritual dijalankan#
Ritual dijalankan setiap kali salah satu dari tiga hal berubah, yaitu arsitektur, sumber data, atau fungsi loss. Perubahan hyperparameter seperti learning rate atau ukuran batch tidak menuntut ritual dari nol, tetapi apabila pelatihan penuh berperilaku aneh, kembali ke satu batch adalah langkah isolasi pertama yang paling murah. Pada modul Pengerjaan proyek, ritual ini masuk ke daftar periksa sebelum kampanye pelatihan resmi, dan hasilnya dicatat sebagai bagian dari eksperimen.
Kebiasaan ini menutup modul Disiplin pelatihan di posisi yang tepat, karena diagnosis kurva, pembagian data, dan inisialisasi seluruhnya melayani satu tujuan, yaitu memastikan pelatihan yang berjalan lama memang layak dijalankan.
Ringkasan#
- Model yang sehat mampu menghafal satu batch kecil, sehingga kegagalan ritual menunjuk kekeliruan data, loss, gradien, atau optimizer.
- Prosedurnya empat langkah dengan satu batch tetap, pelatihan full-batch, target loss mendekati nol, dan pemeriksaan bentuk tensor di awal.
- Tabel gejala memetakan kegagalan ritual ke tersangkanya, termasuk akurasi sempurna dini yang justru menandai kebocoran label.
- Ritual diulang setiap perubahan arsitektur, data, atau loss, dan hasilnya dicatat bersama eksperimen.
Referensi#
- A Recipe for Training Neural Networks — Andrej Karpathy — Tulisan yang menetapkan overfit satu batch sebagai langkah awal proses pelatihan.
- torch.nn.functional.cross_entropy — PyTorch — Dokumentasi loss yang dipakai pada ritual contoh.
- Training a Classifier — PyTorch Tutorials — Tutorial resmi yang menunjukkan pola loop pelatihan yang diritualkan di sini.