Hoppa till innehållet
AI-grafen
E· Universitetdeep-learning· ca 60 min· utvecklande· verifierad 2026-09-20

Initiering av vikter

Kunna förklara varför initiering spelar roll och använda Xavier/He.

Förkunskaper

Intuition

Alla vikter noll? Då ger varje neuron i ett lager exakt samma utdata och samma gradient — de förblir identiska för alltid. Nätet beter sig som om det hade en enda neuron per lager. Symmetrin måste brytas.

För stora vikter? Aktiveringarna växer lager för lager → gradienterna exploderar → NaN.

För små vikter? Aktiveringarna krymper mot noll → gradienterna försvinner → inget lär sig.

Målet: håll variansen på aktiveringarna ungefär konstant genom hela nätet. Det är precis vad Xavier- och He-initiering är konstruerade för.

Formellt

Vill man att Var(y)≈Var(x)\text{Var}(y) \approx \text{Var}(x) genom ett lager y=Wxy = Wx med ninn_{in} ingångar krävs ninVar(w)=1n_{in}\text{Var}(w) = 1.

Xavier/Glorot (för sigmoid/tanh, symmetriska kring noll): Var(w)=2nin+nout\text{Var}(w) = \dfrac{2}{n_{in}+n_{out}} — kompromissar mellan framåt- och bakåtpasset.

He/Kaiming (för ReLU): ReLU nollar hälften av värdena och halverar därmed variansen, så man kompenserar: Var(w)=2nin\text{Var}(w) = \dfrac{2}{n_{in}}.

Bias initieras normalt till 0.

Moderna arkitekturer är mindre känsliga tack vare normaliseringslager (batch/layer norm) och residualkopplingar, men initieringen avgör fortfarande de första hundra stegen — och i mycket djupa nät utan normalisering är den skillnaden mellan konvergens och NaN.

Kod

import torch, torch.nn as nn

def variansprofil(init_fn, lager=8, bredd=512):
    x = torch.randn(1000, bredd)
    for _ in range(lager):
        lin = nn.Linear(bredd, bredd, bias=False)
        init_fn(lin.weight)
        x = torch.relu(lin(x))
    return x.var().item()

print("för små:", round(variansprofil(lambda w: nn.init.normal_(w, std=0.01)), 8))
print("He:     ", round(variansprofil(lambda w: nn.init.kaiming_normal_(w, nonlinearity="relu")), 4))
print("för stora:", round(variansprofil(lambda w: nn.init.normal_(w, std=0.5)), 1))
# för små:   0.00000000   ← aktiveringarna har dött ut
# He:        ~0.3         ← samma storleksordning genom hela nätet
# för stora: 1e+08        ← exploderar

I PyTorch initieras nn.Linear och nn.Conv2d med en variant av Kaiming redan från början — men när du skriver egna lager eller laddar in vikter manuellt är det ditt ansvar.

Behärskning innebär

  • Förklarar varför initiering påverkar träningen
  • Väljer Xavier eller He efter aktiveringsfunktion

Logga in för att göra övningarna och bygga upp din behärskning.

Källor

Alla källor och licenser