Ritual overfit satu batch

Ritual debug nomor satu: memastikan model mampu menghafal satu batch sebelum pelatihan penuh.

Daftar isi

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.

  1. 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.
  2. Bangun model yang akan digunakan pada pelatihan penuh, bukan model tiruan yang lebih kecil, karena ritual harus menguji perangkat yang asli.
  3. Jalankan sekitar tiga ratus langkah perulangan pelatihan lengkap, yaitu kelima barisnya, pada batch yang sama.
  4. Cetak loss dan akurasi batch pada beberapa titik langkah, misalnya setiap lima puluh langkah.
  5. 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.

python ritual_overfit.py
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}")
text Keluaran
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.000

Penghitungan 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 ln⁡3\ln 3, 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 ritualYang patut dicurigaiPerbaikan pertama
Loss tidak turun sama sekaliLearning rate terlalu kecil, atau gradien tidak mengalir karena parameter tidak terdaftarNaikkan learning rate satu atau dua tingkat besaran, periksa model.parameters() yang diberikan ke optimizer
Loss turun lalu berhenti di nilai tinggiFormat target tidak cocok dengan fungsi loss, misalnya target berbentuk one-hot untuk CrossEntropyLossSamakan bentuk dan tipe target dengan tuntutan fungsi loss
Akurasi tetap rendah meskipun loss turunLabel tertukar antara sampel atau urutan kelas salahPeriksa pembuatan label dan pastikan argmax dibandingkan dengan label yang sepadan
Muncul error saat forwardShape masukan, target, dan keluaran model tidak sepakatCetak .shape setiap tensor, lalu cocokkan dengan tuntutan setiap layer
Loss menjadi nanLearning rate terlalu besar, atau data memuat nilai tidak sahKecilkan 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#