Hoppa till innehållet
AI-grafen
D· AI-utvecklarematematik· ca 45 min· grundläggande — ändras sällan· verifierad 2026-09-20

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:

σ(z)=11+e−z\sigma(z) = \frac{1}{1 + e^{-z}}

zzσ(z)\sigma(z)
−40,018
−10,269
00,5
10,731
40,982

S-formad, symmetrisk kring (0;0,5)(0; 0{,}5), platt i båda ändar.

Softmax översätter flera tal till en fördelning:

softmax(z)i=ezi∑jezj\mathrm{softmax}(z)_i = \frac{e^{z_i}}{\sum_j e^{z_j}}

Alla blir positiva (tack vare ex>0e^x > 0) 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 p1−p\frac{p}{1-p}. Log-odds (logit) är z=ln⁡p1−pz = \ln\frac{p}{1-p}. Lös ut pp:

ez=p1−p  ⇒  ez−pez=p  ⇒  p=ez1+ez=11+e−ze^z = \frac{p}{1-p} \;\Rightarrow\; e^z - p e^z = p \;\Rightarrow\; p = \frac{e^z}{1+e^z} = \frac{1}{1+e^{-z}}

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:

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

Härledning: σ(z)=(1+e−z)−1\sigma(z) = (1+e^{-z})^{-1}, så σ′(z)=−(1+e−z)−2⋅(−e−z)=e−z(1+e−z)2=σ(z)⋅e−z1+e−z=σ(z)(1−σ(z))\sigma'(z) = -(1+e^{-z})^{-2}\cdot(-e^{-z}) = \dfrac{e^{-z}}{(1+e^{-z})^2} = \sigma(z)\cdot\dfrac{e^{-z}}{1+e^{-z}} = \sigma(z)(1-\sigma(z)).

Derivatan går alltså att räkna ut från funktionsvärdet — inget behov av att spara zz. Det är en av anledningarna till att sigmoid var populär i tidiga nätverk.

Men: maximum är σ′(0)=0,25\sigma'(0) = 0{,}25, och vid ∣z∣>5|z| > 5 ä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:

  1. Translationsinvarians. softmax(z+c)=softmax(z)\mathrm{softmax}(z + c) = \mathrm{softmax}(z) för varje konstant cc — faktorn ece^c förkortas bort. Det används för numerisk stabilitet (c=−max⁡zc = -\max z) och betyder att bara skillnaderna mellan logits spelar roll.
  2. Sigmoid är specialfallet med två klasser: softmax([z,0])0=ezez+1=σ(z)\mathrm{softmax}([z, 0])_0 = \frac{e^z}{e^z + 1} = \sigma(z).
  3. Temperatur. softmax(z/T)\mathrm{softmax}(z/T): låg TT ger en skarp fördelning, hög TT en jämn. Det är samma parameter som styr slumpen i textgenerering.
  4. Jacobianen är ∂pi∂zj=pi(δij−pj)\frac{\partial p_i}{\partial z_j} = p_i(\delta_{ij} - p_j) — 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

Alla källor och licenser