b belajar.myudak

Satu neuron: forward dan backward

Sebuah neuron dengan aktivasi sigmoid dan loss kuadrat:

z=w⋅x+b,p=σ(z),L=(p−y)2z = w\cdot x + b,\qquad p = \sigma(z),\qquad L = (p - y)^2

Kembalikan [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]
Backpropagation langkah demi langkah
x1.500w0.800b-0.300×+σy1.000−( )²

Nilai input sudah diketahui. Tekan ▶ untuk forward pass.

langkah 1/14

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:

∂L∂w=2(p−y)⏟∂L/∂p⋅p(1−p)⏟∂p/∂z⋅x⏟∂z/∂w\frac{\partial L}{\partial w} = \underbrace{2(p-y)}_{\partial L/\partial p}\cdot\underbrace{p(1-p)}_{\partial p/\partial z}\cdot\underbrace{x}_{\partial z/\partial w}

Kenapa backprop efisien

Faktor ∂L/∂z\partial L/\partial z dipakai bersama oleh ww dan bb. 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=0z = 0 sehingga gradiennya normal. Tapi kalau ∣z∣|z| besar, p(1−p)≈0p(1-p) \approx 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)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:

  1. z = w @ x + b: skor mentah (dot product + bias).
  2. p = 1 / (1 + np.exp(-z)): sigmoid memeras skor ke (0, 1) sehingga bisa dibaca sebagai probabilitas.
  3. 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∂w=∂L∂p⋅∂p∂z⋅∂z∂w\frac{\partial L}{\partial w} = \frac{\partial L}{\partial p}\cdot\frac{\partial p}{\partial z}\cdot\frac{\partial z}{\partial w}
  • ∂L/∂p=2(p−y)\partial L/\partial p = 2(p - y): turunan kuadrat.
  • ∂p/∂z=p(1−p)\partial p/\partial z = p(1 - p): ini turunan sigmoid. Ia bisa ditulis memakai pp sendiri karena σ′=σ(1−σ)\sigma' = \sigma(1-\sigma) (lihat soal “Sigmoid stabil”). Praktis, karena p sudah kita punya dari forward.
  • ∂z/∂w=x\partial z/\partial w = x karena z=w⋅x+bz = w\cdot x + b linear di ww. Untuk bias, ∂z/∂b=1\partial z/\partial 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=0z = 0, p=0.5p = 0.5, L=0.25L = 0.25. Gradiennya 2(0.5−1)⋅0.25⋅1=−0.252(0.5-1) \cdot 0.25 \cdot 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
backpropaturan rantaineuron
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.

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.