b belajar.myudak

Sigmoid stabil dan turunannya

Kembalikan list [s, ds] dengan s = σ(z) dan ds = σ'(z), keduanya berbentuk sama dengan z:

σ(z)=11+e−z\sigma(z) = \frac{1}{1 + e^{-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]]
Fungsi aktivasi
sigmoid(1)= 0.7311turunan = 0.1966
tanh(1)= 0.7616turunan = 0.4200

Turunan sigmoid

σ′(z)=σ(z) (1−σ(z))\sigma'(z) = \sigma(z)\,\bigl(1 - \sigma(z)\bigr)

Nilai maksimumnya 0.250.25 di z=0z = 0, dan mendekati 0 untuk ∣z∣|z| besar. Inilah sumber vanishing gradient: di jaringan yang dalam, gradien dikalikan ≤0.25\le 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+∞)=01/(1+\infty) = 0), tapi rumus lain seperti ez/(1+ez)e^z/(1+e^z) menghasilkan ∞/∞\infty/\infty = 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)\sigma(z) dan σ′(z)\sigma'(z), tanpa overflow untuk z = ±1000.

Turunan sigmoid. Dari σ(z)=(1+e−z)−1\sigma(z) = (1 + e^{-z})^{-1}:

σ′(z)=e−z(1+e−z)2=σ(z) (1−σ(z))\sigma'(z) = \frac{e^{-z}}{(1+e^{-z})^2} = \sigma(z)\,\bigl(1 - \sigma(z)\bigr)

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≥0z \ge 0: σ(z)=11+e−z=11+e\sigma(z) = \dfrac{1}{1 + e^{-z}} = \dfrac{1}{1+e}
  • untuk z<0z < 0: σ(z)=ez1+ez=e1+e\sigma(z) = \dfrac{e^{z}}{1 + e^{z}} = \dfrac{e}{1+e}

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
aktivasisigmoidnumerik
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.

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.