b belajar.myudak

Gradient check

Untuk loss

L(W)=1Nk∑n,j((XW)nj−Ynj)2L(W) = \frac{1}{Nk}\sum_{n,j}\bigl((XW)_{nj} - Y_{nj}\bigr)^2

hitung ∂L/∂W\partial L / \partial W secara numerik: geser setiap entri W sebesar ±h (beda tengah, h = 1e-5). Hasilnya akan dibandingkan dengan gradien analitik 2NkX⊤(XW−Y)\frac{2}{Nk}X^\top(XW - Y), jadi kamu bisa mengecek keduanya sendiri dengan print.

W = [[1]], X = [[1]], Y = [[0]]  →  [[2.0]]

Untuk apa

Gradien hasil backprop yang salah adalah bug yang paling licin di ML: kode tetap berjalan, loss kadang tetap turun pelan-pelan, tapi model tidak pernah benar-benar bagus. Gradient check membandingkan gradien analitik dengan gradien numerik:

rel_err=∣ganalitik−gnumerik∣max⁡(∣ganalitik∣+∣gnumerik∣, 10−12)\text{rel\_err} = \frac{\lvert g_\text{analitik} - g_\text{numerik}\rvert}{\max(\lvert g_\text{analitik}\rvert + \lvert g_\text{numerik}\rvert,\ 10^{-12})}

Patokan kasarnya: <10−7< 10^{-7} bagus, 10−510^{-5} masih wajar, dan >10−3> 10^{-3} hampir pasti ada bug.

Tips

  • Pakai float64, jangan float32.
  • Cek dengan jaringan dan batch yang kecil: biayanya 2 kali forward per parameter.
  • Matikan dropout dan semua sumber keacakan saat mengecek.
  • Titik patah ReLU di 0 bisa membuat galat besar walau kodenya benar. Hindari input yang tepat 0.

Penjelasan

Yang diminta. Gradien ∂L/∂W\partial L/\partial W untuk L(W)=mean((XW−Y)2)L(W) = \text{mean}((XW - Y)^2), dihitung numerik: geser setiap entri W sedikit dan lihat perubahan loss.

Ide kunci. Ini beda tengah dari soal O1, tapi diterapkan ke setiap parameter satu per satu:

∂L∂Wij≈L(W+h Eij)−L(W−h Eij)2h\frac{\partial L}{\partial W_{ij}} \approx \frac{L(W + h\,E_{ij}) - L(W - h\,E_{ij})}{2h}

EijE_{ij} adalah matriks yang bernilai 1 hanya di posisi (i,j)(i, j).

Langkah di kode:

  1. loss = lambda M: ((X @ M - Y) ** 2).mean().
  2. for idx in np.ndindex(*W.shape) mengunjungi semua indeks (i, j).
  3. Simpan old = W[idx], set W[idx] = old + h lalu hitung up, set W[idx] = old - h lalu hitung down, lalu kembalikan W[idx] = old. Tanpa langkah terakhir ini, entri berikutnya dihitung dari W yang sudah rusak.
  4. G[idx] = (up - down) / (2 * h).

Kenapa berguna. Gradien analitiknya 2NkX⊤(XW−Y)\frac{2}{Nk}X^\top(XW - Y). Jika backprop-mu memberi angka yang berbeda jauh dari gradien numerik, ada bug. Cobalah print keduanya dan bandingkan.

Biaya. 2 kali forward per parameter. Untuk jaringan berjuta parameter ini terlalu mahal, karena itu gradient check hanya dipakai untuk debugging pada model kecil.

Yang dikembalikan: array berbentuk sama dengan W.

Topik
gradiendebuggingfinite difference
Petunjuk 1

Untuk setiap entri W[i, j]: geser ke +h, hitung loss; geser ke −h, hitung loss; selisihnya dibagi 2h.

Petunjuk 2

np.ndindex(*W.shape) memberi semua indeks. Jangan lupa mengembalikan W[i, j] ke nilai aslinya setelah selesai.

Python 3.14 · NumPy

Pengaturan editor

Ukuran font
Ukuran huruf di editor.
Ukuran tab
Lebar indentasi. Otomatis: 2 spasi untuk TypeScript, 4 untuk Python.
Key bindings
Ganti ke mode Vim.
Nomor baris relatif
Nomor baris dihitung dari posisi kursor (berguna untuk gerakan Vim).
Word wrap
Baris panjang dilipat agar muat di lebar editor.
IntelliSense
Saran kode otomatis saat mengetik (Ctrl+Spasi tetap bisa dipakai saat mati).

Nilai ditulis sebagai JSON. Output yang diharapkan dihitung dari solusi referensi.