Satu neuron: forward dan backward
Sebuah neuron dengan aktivasi sigmoid dan loss kuadrat:
z=w⋅x+b,p=σ(z),L=(p−y)2Kembalikan [L, dL/dw, dL/db]. dL/dw berbentuk sama dengan w.
x = [1], w = [0], b = 0, y = 1 → [0.25, [-0.25], -0.25]
Nilai input sudah diketahui. Tekan ▶ untuk forward pass.
Graf komputasi
Tulis perhitungan sebagai rantai operasi kecil: x, w → z → p → L. Backward berjalan dari belakang. Setiap simpul mengalikan gradien yang datang dengan turunan lokalnya sendiri:
Kenapa backprop efisien
Faktor ∂L/∂z dipakai bersama oleh w dan b. Backprop menghitung setiap faktor sekali lalu menggunakannya kembali. Untuk jaringan dengan jutaan parameter, biaya backward hanya sekitar 2× biaya forward, bukan sejuta kali.
Saturasi
Coba case w = [5, 5] dengan x = [0, 0]: z=0 sehingga gradiennya normal. Tapi kalau ∣z∣ besar, p(1−p)≈0 dan gradien nyaris hilang walaupun prediksinya salah total. Itulah alasan cross-entropy lebih disukai daripada MSE untuk klasifikasi: CE membatalkan faktor p(1−p) ini.
Penjelasan
Yang diminta. Kita membuat satu neuron, lalu menjalankannya maju (forward: hitung prediksi dan loss) dan mundur (backward: hitung seberapa besar loss berubah jika w atau b digeser sedikit). Kembalikan [L, dL/dw, dL/db].
Forward, tiga langkah kecil:
z = w @ x + b: skor mentah (dot product + bias).p = 1 / (1 + np.exp(-z)): sigmoid memeras skor ke (0, 1) sehingga bisa dibaca sebagai probabilitas.L = (p - y) ** 2: seberapa jauh tebakan dari target.
Backward: aturan rantai, dari belakang ke depan. Loss bergantung pada w lewat rantai w → z → p → L, jadi gradiennya adalah perkalian turunan lokal setiap mata rantai:
- ∂L/∂p=2(p−y): turunan kuadrat.
- ∂p/∂z=p(1−p): ini turunan sigmoid. Ia bisa ditulis memakai p sendiri karena σ′=σ(1−σ) (lihat soal “Sigmoid stabil”). Praktis, karena
psudah kita punya dari forward. - ∂z/∂w=x karena z=w⋅x+b linear di w. Untuk bias, ∂z/∂b=1.
Langkah di kode: dL_dp = 2 * (p - y), lalu dL_dz = dL_dp * p * (1 - p). Faktor ini dipakai bersama oleh w dan b, jadi cukup dihitung sekali. Terakhir dw = dL_dz * x dan db = dL_dz.
Cek manual. x=[1], w=[0], b=0, y=1: z=0, p=0.5, L=0.25. Gradiennya 2(0.5−1)⋅0.25⋅1=−0.25. Negatif berarti menaikkan w akan menurunkan loss, dan memang benar: p perlu naik menuju 1.
Yang dikembalikan: [float, array (d,), float]. dL/dw berbentuk sama dengan w.
Topik
Petunjuk 1
Aturan rantai: dL/dw = dL/dp · dp/dz · dz/dw. Hitung dari belakang, satu faktor per langkah.
Petunjuk 2
dL/dp = 2(p − y), dp/dz = p(1 − p), dz/dw = x, dz/db = 1.
Nilai ditulis sebagai JSON. Output yang diharapkan dihitung dari solusi referensi.