Episode ini adalah yang paling “matematika” sejauh seri ini, dan saya menulisnya sambil sedikit gemetar. Tapi ternyata inti dari melatih model bisa dijelaskan tanpa satu pun turunan yang ditulis lengkap — cukup dengan analogi yang familiar buat programmer: training itu optimasi parameter, dan semua istilah menakutkannya cuma bagian dari satu loop yang sama.
Loss function: mengukur seberapa salah
Sebelum bisa belajar, model butuh cara mengukur kesalahannya. Itu tugas loss function: fungsi yang menerima prediksi dan jawaban benar, lalu mengembalikan angka “seberapa buruk”. Prediksi pas dengan kunci jawaban? Loss mendekati nol. Melenceng jauh? Loss membengkak.
Dua contoh yang paling umum:
- MSE (Mean Squared Error) — untuk regresi. Rata-rata kuadrat selisih prediksi vs kenyataan. Dikuadratkan supaya error besar dihukum jauh lebih berat.
- Cross-entropy — untuk klasifikasi. Menghukum prediksi yang percaya diri tapi salah.
Analogi programmer: loss function itu seperti assertion di test suite — dia yang menentukan lulus atau tidaknya. Bedanya, kita tidak berhenti di lulus/gagal, tapi menghitung seberapa jauh dari lulus.
Gradient descent: turun gunung dalam gelap
Sekarang pertanyaan besarnya: kalau loss mengukur kesalahan, siapa yang memperbaiki parameter? Jawabannya gradient descent, dan analogi klasiknya masih terbaik yang pernah saya baca: kita berdiri di lereng gunung berkabut, ingin mencapai lembah (loss minimum). Kabut tebal — tidak bisa lihat peta. Yang bisa dilakukan: meraba kemiringan tanah di bawah kaki, lalu melangkah ke arah yang paling menurun. Ulangi ribuan kali.
“Meraba kemiringan” itulah gradien — arah penurunan loss terhadap tiap parameter. Framework seperti PyTorch menghitungnya otomatis lewat diferensiasi otomatis; kita tidak perlu menurunkan rumus manual. Loop pelatihannya secara konsep sesederhana ini:
for epoch in range(epochs):
y_pred = model(X_train) # 1. forward pass
loss = loss_fn(y_pred, y_train) # 2. hitung loss
optimizer.zero_grad() # 3. reset gradien
loss.backward() # 4. hitung gradien
optimizer.step() # 5. update bobotLima baris ini adalah seluruh deep learning pada dasarnya. Forward, ukur, mundur, geser. Ulangi.
Epoch: berapa kali membaca buku yang sama
Satu epoch = satu putaran penuh model melewati seluruh data latih. Seperti membaca ulang buku yang sama: sekali belum tentu hafal, sepuluh kali mulai nempel, seratus kali malah hafal kata per kata tanpa paham (ini overfitting — bahas tersendiri nanti). Terlalu sedikit epoch, model belum belajar; terlalu banyak, dia menghafal.
Learning rate: seberapa besar langkah
Learning rate menentukan panjang langkah tiap update bobot. Ini hyperparameter paling sensitif yang saya temui sejauh ini:
- Terlalu besar — langkah melompati lembah, loss naik-turun liar atau malah divergen.
- Terlalu kecil — progres nyaris tidak terasa, training makan waktu berjam-jam untuk hasil biasa saja.
- Pas — loss turun stabil lalu melandai.
| Istilah | Analogi | Risiko salah setting |
|---|---|---|
| Loss function | Assertion di test suite | Mengukur hal yang salah |
| Gradient descent | Turun gunung berkabut | Terjebak di titik tinggi |
| Epoch | Baca ulang buku | Underfit / overfit |
| Learning rate | Panjang langkah | Divergen / lambat sekali |
Catatan untuk diri sendiri
Kesulitan terbesar saya: dulu menganggap training sebagai kotak hitam ajaib. Setelah memecahnya jadi lima langkah di loop di atas, rasa takutnya hilang. Saran praktis kalau baru mulai: plot kurva loss per epoch. Grafik itu adalah “kamera” satu-satunya ke dalam proses training — naik berarti learning rate kebesaran, datar berarti terlalu kecil atau model salah arsitektur.
Komentar Terbaru