Sebelum pelatihan penuh dibiarkan berjalan berjam-jam, ada satu pemeriksaan yang berjalan dalam hitungan detik dan menyaring sebagian besar bug pelatihan, yaitu ritual overfit satu batch. Ritual ini memaksa model menghafal satu kelompok kecil data yang sama berulang kali, lalu menuntut loss mendekati nol dan akurasi batch mencapai 1.0. Topik ini menuliskan prosedurnya, menyediakan skrip yang siap dijalankan, dan merinci arti setiap kemungkinan hasilnya.
Prosedur ritual#
Inti ritualnya sederhana, yaitu menjalankan perulangan pelatihan yang sama pada satu batch tetap hingga model menghafalnya. Urutan langkahnya adalah sebagai berikut.
- Ambil satu batch dari data, lalu simpan tensor masukan dan targetnya ke dua variabel tetap. Batch ini tidak melalui pengacakan lagi, dan tidak ada langkah yang memuat batch lain.
- Bangun model yang akan digunakan pada pelatihan penuh, bukan model tiruan yang lebih kecil, karena ritual harus menguji perangkat yang asli.
- Jalankan sekitar tiga ratus langkah perulangan pelatihan lengkap, yaitu kelima barisnya, pada batch yang sama.
- Cetak loss dan akurasi batch pada beberapa titik langkah, misalnya setiap lima puluh langkah.
- Nyatakan ritual lulus bila loss mendekati nol dan akurasi batch mencapai 1.0.
Alasan ritual ini menjadi pemeriksaan pertama ada pada sifat tugasnya. Menghafal 32 pasangan data adalah pekerjaan yang paling mudah bagi jaringan saraf sekecil apa pun, karena model cukup mengingat tanpa perlu menggeneralisasi. Model yang gagal menghafal satu batch pasti memiliki kesalahan pada perangkat pelatihannya, misalnya label yang tertukar, shape yang tidak cocok, learning rate yang terlalu kecil, atau fungsi loss yang salah, dan bug semacam itu jauh lebih murah ditemukan pada tahap ini daripada setelah pelatihan penuh selesai.
Skrip ritual#
Skrip berikut mencontohkan ritual dari awal sampai akhir. Datanya sintetis, yaitu 32 sampel dengan empat fitur dan tiga kelas, dan modelnya dua layer linear dengan aktivasi ReLU. Perhatikan bahwa batch x dan y tidak pernah diganti selama tiga ratus langkah berjalan, dan seluruh perulangan pelatihan tetap menggunakan kelima baris inti.
import torch
import torch.nn as nn
torch.manual_seed(0)
# Satu batch tetap: 32 sampel, 4 fitur, 3 kelas
n_sampel, n_fitur, n_kelas = 32, 4, 3
x = torch.randn(n_sampel, n_fitur)
y = torch.randint(0, n_kelas, (n_sampel,))
model = nn.Sequential(
nn.Linear(n_fitur, 16),
nn.ReLU(),
nn.Linear(16, n_kelas),
)
loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.05)
titik_cetak = {1, 50, 100, 150, 200, 250, 300}
for langkah in range(1, 301):
optimizer.zero_grad()
loss = loss_fn(model(x), y)
loss.backward()
optimizer.step()
if langkah in titik_cetak:
with torch.no_grad():
prediksi = model(x).argmax(dim=1)
akurasi = (prediksi == y).float().mean().item()
print(f"langkah {langkah:>3}: loss {loss.item():.4f} akurasi batch {akurasi:.3f}")langkah 1: loss 1.1126 akurasi batch 0.469
langkah 50: loss 0.0836 akurasi batch 1.000
langkah 100: loss 0.0091 akurasi batch 1.000
langkah 150: loss 0.0030 akurasi batch 1.000
langkah 200: loss 0.0015 akurasi batch 1.000
langkah 250: loss 0.0010 akurasi batch 1.000
langkah 300: loss 0.0008 akurasi batch 1.000Penghitungan akurasi dibungkus torch.no_grad() karena hanya untuk pembacaan, bukan bagian dari pelatihan. Optimizer Adam dipilih agar penghafalan cepat tercapai pada jumlah langkah kecil, sedangkan CrossEntropyLoss meminta target berupa indeks kelas, yaitu bentuk yang digunakan skrip ini. Loss turun dari 1.1126, angka yang dekat dengan , nilai awal alami untuk tiga kelas sebelum model belajar apa pun, hingga 0.0008 pada langkah ketiga ratus.
Membaca hasil yang berhasil#
Ritual yang lulus memberi empat kepastian sekaligus, dan keempatnya adalah perangkat yang sama dengan pelatihan penuh. Shape masukan, target, dan keluaran model sudah cocok, karena CrossEntropyLoss menerima data tanpa error. Label tersambung dengan benar ke sampel yang tepat, karena akurasi mencapai 1.0, artinya setiap prediksi jatuh pada label yang bersanding dengannya. Fungsi loss dan optimizer bekerja, karena loss turun konsisten. Learning rate cukup besar untuk menggerakkan bobot, karena perubahan terlihat dalam puluhan langkah.
Karena keempat perangkat itulah yang diuji, ritual harus menggunakan model, fungsi loss, dan pipeline data yang sama dengan pelatihan penuh. Ritual pada model tiruan hanya memastikan perangkat tiruan bekerja, dan hasilnya tidak boleh digunakan untuk menyimpulkan perangkat aslinya.
Saat ritual gagal#
Ritual yang gagal adalah informasi yang lebih berharga daripada ritual yang lulus, karena kegagalan selalu menunjuk pada perangkat yang salah. Tabel berikut merangkum gejala yang paling sering muncul beserta dugaan dan perbaikan pertamanya.
| Gejala pada ritual | Yang patut dicurigai | Perbaikan pertama |
|---|---|---|
| Loss tidak turun sama sekali | Learning rate terlalu kecil, atau gradien tidak mengalir karena parameter tidak terdaftar | Naikkan learning rate satu atau dua tingkat besaran, periksa model.parameters() yang diberikan ke optimizer |
| Loss turun lalu berhenti di nilai tinggi | Format target tidak cocok dengan fungsi loss, misalnya target berbentuk one-hot untuk CrossEntropyLoss | Samakan bentuk dan tipe target dengan tuntutan fungsi loss |
| Akurasi tetap rendah meskipun loss turun | Label tertukar antara sampel atau urutan kelas salah | Periksa pembuatan label dan pastikan argmax dibandingkan dengan label yang sepadan |
| Muncul error saat forward | Shape masukan, target, dan keluaran model tidak sepakat | Cetak .shape setiap tensor, lalu cocokkan dengan tuntutan setiap layer |
Loss menjadi nan | Learning rate terlalu besar, atau data memuat nilai tidak sah | Kecilkan learning rate dan periksa data, termasuk pembagian dengan nol |
Satu kali perbaikan biasanya cukup untuk memicu penurunan loss, karena kegagalan menghafal satu batch hampir selalu berpunca dari satu kesalahan tunggal yang jelas. Apabila beberapa gejala muncul bersamaan, urutkan pemeriksaan dari shape, karena shape yang salah membuat semua pengamatan setelahnya tidak berarti.
Ringkasan#
- Ritual overfit satu batch menjalankan perulangan pelatihan lengkap pada satu batch tetap selama sekitar tiga ratus langkah, dan menyatakan lulus bila loss mendekati nol serta akurasi batch mencapai 1.0.
- Ritual yang lulus menegaskan shape, label, fungsi loss, optimizer, dan learning rate sudah bekerja, sedangkan ritual yang gagal selalu menunjuk perangkat yang salah sebelum pelatihan penuh dibiarkan berjalan.
- Ritual menggunakan model, fungsi loss, dan pipeline data yang sama dengan pelatihan penuh, dan hasilnya bukan ukuran kualitas model pada data baru.
Referensi#
- Deep Learning with PyTorch: A 60 Minute Blitz — PyTorch
— Tutorial resmi yang menjadi dasar alur pelatihan dan penggunaan
CrossEntropyLosspada ritual. - PyTorch documentation — PyTorch
— Rujukan API optimizer, fungsi loss, dan
torch.no_grad()yang digunakan pada skrip ritual.