Cerita Saya Saat Model Machine Learning Ngambek di Tengah Pelatihan
Pernah suatu pagi saya berdiri menatap dashboard training yang biasanya riang—loss turun, akurasi naik—tapi hari itu model saya ‘ngambek’. Dalam hitungan epoch, loss naik drastis, metrik validasi anjlok, dan beberapa run berakhir dengan NaN. Saya sudah berkutat dengan model produksi untuk deteksi entitas selama beberapa bulan; ini bukan gangguan kecil, ini tanda masalah mendasar. Pengalaman itu mengajarkan saya lebih dari sekadar trik debugging — ia mengasah pola pikir detektif yang perlu dimiliki setiap engineer ML.
Tanda-tanda “ngambek” dan bagaimana saya menemukannya
Tanda pertama biasanya visual: kurva training loss yang tidak konsisten di TensorBoard atau Weights & Biases. Di kasus saya, loss training turun seminimal 0.02 per batch selama beberapa hari lalu tiba-tiba melonjak menjadi NaN pada epoch ke-7. Validasi yang sebelumnya stabil di ~92% langsung turun ke ~60%. Itu petunjuk besar. Saya juga melihat fluktuasi utilisasi GPU—kadang GPU gagal di satu batch tertentu, menimbulkan out-of-memory (OOM) atau waktu eksekusi yang tidak wajar. Log menunjukkan beberapa batch menghasilkan gradien yang sangat besar (exploding gradients).
Selain itu, ada tanda non-teknis yang sering diabaikan: pipeline data berubah tanpa dokumentasi. Seorang rekan mengganti augmentasi dan menonaktifkan shuffling untuk percobaan—perubahan kecil yang berujung pada data leakage antara train dan validation. Dari pengalaman, kombinasi gejala visual, metrik, dan perubahan kecil di pipeline sering jadi sumber utama model “ngambek”.
Diagnosa: langkah-langkah debugging yang saya pakai
Langkah pertama adalah reproduksi deterministik. Saya mengunci random seed, menonaktifkan non-deterministic CuDNN behavior, dan menjalankan train dengan subset kecil (500 sampel) sehingga setiap batch mudah ditelaah. Dalam kasus ini, run kecil segera memunculkan NaN pada loss, memudahkan saya menemukan batch bermasalah pada indeks tertentu.
Saya lalu memeriksa data: label noise, format token, dan nilai ekstrim. Ternyata ada ~8% label yang korup karena script preprocessing yang gagal menangani karakter Unicode tertentu. Perbaikan preprocessing menutup sebagian masalah. Selanjutnya saya menginspeksi optimizer dan hyperparameter. Model menggunakan AdamW dengan lr 3e-4 tanpa warmup. Setelah memeriksa grad_norm per-layer, terlihat ada beberapa lapisan dengan gradien sangat besar—indikasi perlu clipping atau warmup learning rate.
Perbaikan teknis yang berhasil
Perbaikan pertama: rollback preprocessing dan perbaiki pipeline validasi sehingga data tetap terpisah. Itu mengembalikan sebagian besar metrik validasi. Kedua, saya tambahkan learning rate warmup 500 langkah dan gradient clipping di 1.0; ini efektif menahan exploding gradients. Ketiga, saya mengaktifkan mixed-precision training dengan gradient scaler (AMP) tetapi memastikan pengecekan NaN aktif—mixed precision menghemat memori namun bisa memicu underflow/overflow bila tidak hati-hati.
Saya juga mengubah optimizer menjadi SGD dengan momentum 0.9 pada satu percobaan untuk melihat efeknya; hasilnya lebih stabil tapi konvergensinya lebih lambat. Akhirnya, kombinasi AdamW + warmup + clipping + robust preprocessing memberi solusi terbaik: training kembali stabil, loss turun secara konsisten, dan validasi kembali ke kisaran 91-93%.
Pelajaran yang saya terapkan sejak itu
Pertama—logging bukan opsi, itu kebutuhan. Simpan checkpoint lebih sering (misalnya setiap 500 langkah) dan catat metrik layer-wise. Saya juga membuat checklist pre-training: verifikasi shuffling, sample count, distribusi label, dan versi library. Kedua—automasi deteksi anomali: saya pasang alarm jika loss naik >10% dibanding epoch sebelumnya atau jika ada NaN. Ketiga—kembangkan kebiasaan kerja reproducible: containerize eksperimen, simpan seed dan konfigurasi, dan gunakan tools seperti W&B untuk riwayat eksperimen.
Sebagai catatan kecil namun penting: kadang ide terbaik datang saat menunggu eksperimen panjang selesai. Saya sering membaca hal-hal di luar domain seperti artikel desain produk untuk mengingatkan bahwa iterasi kecil lebih berharga daripada perubahan besar yang tak teruji—misalnya, saya pernah menemukan analogi berguna di sebuah blog desain pakaian yang tak terduga, urbanjacketars, tentang bagaimana prototyping cepat menyelamatkan proses kreatif. Perspektif itu membantu saya memilih eksperimen bertahap alih-alih perubahan menyeluruh pada model produksi.
Dalam dua dekade bekerja dengan model, saya belajar satu hal: model tidak “ngambek” tanpa alasan. Ia memberi sinyal lewat metrik, log, dan perilaku runtime. Tugasan kita adalah mendengar, mendiagnosa, dan merespons dengan sistematis—bukan panik. Pendekatan detektif, dokumentasi yang rapi, dan kebiasaan engineering yang disiplin membuat perbedaan antara kegagalan sementara dan peluncuran yang mulus. Dan ketika model akhirnya berperilaku baik lagi, kepuasan itu sederhana tapi mendalam—sebuah bukti bahwa debugging yang baik adalah seni yang diasah oleh pengalaman.