Sigmoid och softmax som funktioner
Kunna härleda sigmoid och softmax ur exponentialfunktionen och förklara deras egenskaper.
Förkunskaper
Intuition
Ett neuralt nät spottar ut godtyckliga tal — «logits» — som kan vara −13,7 eller 42. Sannolikheter måste ligga mellan 0 och 1 och summera till 1. Någon måste översätta.
Sigmoid översätter ett tal till en sannolikhet:
| −4 | 0,018 |
| −1 | 0,269 |
| 0 | 0,5 |
| 1 | 0,731 |
| 4 | 0,982 |
S-formad, symmetrisk kring , platt i båda ändar.
Softmax översätter flera tal till en fördelning:
Alla blir positiva (tack vare ) och summan blir exakt 1 (tack vare divisionen med summan).
Enkel regel: en fråga med ja/nej → sigmoid. En fråga med flera ömsesidigt uteslutande alternativ → softmax. Flera etiketter som kan gälla samtidigt → sigmoid per etikett.
Härledning
Sigmoid ur odds. Odds för en händelse är . Log-odds (logit) är . Lös ut :
Sigmoid är alltså inversen till logit-funktionen. Det är inte en godtycklig S-kurva som någon hittade på — den är den funktion som gör om log-odds till sannolikhet, vilket är precis vad logistisk regression behöver.
Derivatan är ovanligt elegant:
Härledning: , så .
Derivatan går alltså att räkna ut från funktionsvärdet — inget behov av att spara . Det är en av anledningarna till att sigmoid var populär i tidiga nätverk.
Men: maximum är , och vid är derivatan nära noll. Det är försvinnande gradienter i sin renaste form, och orsaken till att ReLU tog över i djupa nät.
Softmax-egenskaper:
- Translationsinvarians. för varje konstant — faktorn förkortas bort. Det används för numerisk stabilitet () och betyder att bara skillnaderna mellan logits spelar roll.
- Sigmoid är specialfallet med två klasser: .
- Temperatur. : låg ger en skarp fördelning, hög en jämn. Det är samma parameter som styr slumpen i textgenerering.
- Jacobianen är — en matris, inte en enkel elementvis derivata, eftersom varje utdata beror på alla logits.
Kod
import numpy as np
def sigmoid(z):
return 1.0 / (1.0 + np.exp(-z))
def softmax(z):
z = np.asarray(z, float)
e = np.exp(z - z.max()) # translationsinvarians → numerisk stabilitet
return e / e.sum()
for z in (-4, -1, 0, 1, 4):
s = sigmoid(z)
print(f"z={z:3d} σ={s:.4f} σ'={s * (1 - s):.4f}")
# z= -4 σ=0.0180 σ'=0.0177
# z= 0 σ=0.5000 σ'=0.2500 ← maximal derivata
# z= 4 σ=0.9820 σ'=0.0177 ← nästan platt: försvinnande gradient
print(softmax([2.0, 1.0, 0.1])) # [0.6590 0.2424 0.0986]
print(softmax([2.0, 1.0, 0.1]) - softmax([102.0, 101.0, 100.1])) # ~0 — invariant
# Sigmoid är softmax med två klasser
z = 1.3
print(round(float(sigmoid(z)), 6), round(float(softmax([z, 0.0])[0]), 6)) # 0.785835 0.785835
# Temperatur styr skärpan
for T in (0.5, 1.0, 2.0, 5.0):
print(f"T={T}: {np.round(softmax(np.array([2.0, 1.0, 0.1]) / T), 3)}")
# T=0.5: [0.864 0.117 0.019] skarp
# T=1.0: [0.659 0.242 0.099]
# T=2.0: [0.502 0.304 0.194]
# T=5.0: [0.4 0.327 0.273] jämn
# Derivatan går att räkna ur funktionsvärdet — praktiskt i bakåtpasset
s = sigmoid(np.array([-2.0, 0.0, 2.0]))
print(np.round(s * (1 - s), 4)) # [0.105 0.25 0.105]
Behärskning innebär
- Härleder sigmoid och beräknar dess derivata
- Förklarar softmax och dess egenskaper
- Vet när man använder vilken
Logga in för att göra övningarna och bygga upp din behärskning.
Källor
- Dive into Deep Learning (CC BY-SA 4.0) — CC BY-SA 4.0
- Matteboken (Mattecentrum) — fri läsning, ideell förening
- Khan Academy — matematik — CC BY-NC-SA 3.0