Sigmoid stabil dan turunannya
Kembalikan list [s, ds] dengan s = σ(z) dan ds = σ'(z), keduanya berbentuk sama dengan z:
Implementasimu harus stabil: untuk z = -1000 hasilnya 0, bukan nan, dan tidak boleh ada peringatan overflow.
[-2, 0, 2] → [[0.1192, 0.5, 0.8808], [0.105, 0.25, 0.105]]
| sigmoid(1) | = 0.7311 | turunan = 0.1966 | Output 0..1. Turunan maksimal hanya 0.25 → vanishing gradient di jaringan dalam. |
| tanh(1) | = 0.7616 | turunan = 0.4200 | Output −1..1 dan berpusat di 0, tapi tetap jenuh untuk |x| besar. |
Turunan sigmoid
σ′(z)=σ(z)(1−σ(z))Nilai maksimumnya 0.25 di z=0, dan mendekati 0 untuk ∣z∣ besar. Inilah sumber vanishing gradient: di jaringan yang dalam, gradien dikalikan ≤0.25 di setiap layer, sehingga cepat mengecil. Itu salah satu alasan ReLU menggantikan sigmoid di hidden layer.
Stabilitas numerik
np.exp(1000) bernilai inf. Rumus naif kadang masih kebetulan benar (1/(1+∞)=0), tapi rumus lain seperti ez/(1+ez) menghasilkan ∞/∞ = nan. Trik umumnya: jangan pernah memanggil exp dengan argumen positif besar. Kita akan memakai trik yang sama untuk softmax dan cross-entropy.
Penjelasan
Yang diminta. Dua array berbentuk sama dengan z: σ(z) dan σ′(z), tanpa overflow untuk z = ±1000.
Turunan sigmoid. Dari σ(z)=(1+e−z)−1:
σ′(z)=(1+e−z)2e−z=σ(z)(1−σ(z))Jadi setelah punya s, turunannya cukup s * (1 - s), tanpa exp lagi.
Masalah overflow. Untuk z = -1000, np.exp(-z) = np.exp(1000) = inf dan NumPy memberi peringatan. Triknya: hitung e = np.exp(-np.abs(z)). Argumennya selalu ≤ 0, jadi e selalu di antara 0 dan 1. Lalu:
- untuk z≥0: σ(z)=1+e−z1=1+e1
- untuk z<0: σ(z)=1+ezez=1+ee
Kedua rumus itu sama secara matematika, tapi masing-masing hanya memakai exp dari bilangan negatif.
Langkah di kode: e = np.exp(-np.abs(z)), lalu s = np.where(z >= 0, 1/(1+e), e/(1+e)), lalu return [s, s * (1 - s)].
Yang dikembalikan: list berisi dua array [s, ds].
Topik
Petunjuk 1
σ'(z) = σ(z)(1 − σ(z)). Setelah punya σ, turunannya gratis.
Petunjuk 2
np.exp(1000) overflow. Hitung e = exp(−|z|), yang selalu ≤ 1, lalu pakai 1/(1+e) untuk z ≥ 0 dan e/(1+e) untuk z < 0.
Nilai ditulis sebagai JSON. Output yang diharapkan dihitung dari solusi referensi.