Titta in i nätet
Kunna visualisera vad enskilda neuroner reagerar på i ett litet nät.
Förkunskaper
Intuition
Ett tränat nät är fullt av tal. Frågan «vad gör den här neuronen?» går faktiskt att undersöka, och det finns tre standardmetoder:
| Metod | Hur | Ger |
|---|---|---|
| Maximalt aktiverande exempel | kör hela datasetet, spara de indata som gav högst aktivering | enkelt, ärligt, alltid ett bra första steg |
| Feature visualization | optimera fram en syntetisk bild som maximerar neuronen | vackra bilder, men kan visa saker som inte finns i verkligheten |
| Ablation | nollställ neuronen och mät vad som ändras | den enda som visar orsak |
Börja alltid med den första. Den kräver ingen optimering, kan inte hitta på något, och svarar på den fråga du faktiskt ställde.
Men var försiktig med tolkningen. Att en neuron aktiveras av hundbilder betyder inte att den «är» en hunddetektor. Den kan reagera på päls, på gräsbakgrund, eller på något som råkar samvariera med hundar i just ditt dataset.
Formellt
Polysemantiska neuroner är det stora hindret. En och samma neuron kan reagera på till synes orelaterade saker — kattansikten, bilfronter och bokstaven A.
Förklaringen är superposition: nätet behöver representera fler begrepp än det har neuroner, och packar därför in flera i varje. Begrepp som sällan förekommer samtidigt kan dela neuron utan att störa varandra särskilt mycket.
Det betyder att enskilda neuroner ofta är fel enhet att studera. Riktningar i aktiveringsrummet — kombinationer av neuroner — är oftare monosemantiska. Det är hela idén bakom glesa autoencoders (SAE), som lär sig en större men glesare bas där varje riktning motsvarar ett begrepp.
Tre fällor:
| Fälla | Varför |
|---|---|
| Titta bara på topp-9-bilderna | de starkaste aktiveringarna är inte representativa — titta också på mitten av fördelningen |
| Dra slutsatser utan intervention | korrelation; ablera neuronen och se om något faktiskt ändras |
| Tolka feature visualization bokstavligt | den optimerade bilden ligger utanför datafördelningen |
Ett fullständigt påstående om en neuron har tre delar:
- Vad som aktiverar den — maximalt aktiverande exempel, från hela fördelningen.
- Vad som inte gör det — negativa kontroller som skulle ha aktiverat den om din hypotes vore fel på ett visst sätt.
- Vad som händer utan den — ablation, med mätning av effekten på utdata.
Utan del 3 har du beskrivit en korrelation, inte en funktion.
Kod
import torch, torch.nn as nn
def maximalt_aktiverande(modell, lager, neuron, dataloader, k=9):
"""Hitta de k indata som aktiverar en neuron mest — och några från mitten."""
lagrat = {}
h = lager.register_forward_hook(lambda m, i, o: lagrat.update(a=o.detach()))
poang, bilder = [], []
with torch.no_grad():
for x, _ in dataloader:
modell(x)
a = lagrat["a"]
v = a[:, neuron].flatten(1).max(dim=1).values if a.dim() == 4 else a[:, neuron]
poang += v.tolist(); bilder += list(x)
h.remove()
ordning = sorted(range(len(poang)), key=lambda i: -poang[i])
mitten = ordning[len(ordning) // 2:len(ordning) // 2 + k]
return ([bilder[i] for i in ordning[:k]], [bilder[i] for i in mitten],
[round(poang[i], 3) for i in ordning[:k]])
def ablera(modell, lager, neuron, dataloader):
"""Nollställ neuronen och mät hur mycket träffsäkerheten ändras."""
def noll(m, i, o):
o = o.clone(); o[:, neuron] = 0; return o
def traffsakerhet():
ratt = n = 0
with torch.no_grad():
for x, y in dataloader:
ratt += int((modell(x).argmax(1) == y).sum()); n += len(y)
return ratt / n
fore = traffsakerhet()
h = lager.register_forward_hook(noll)
efter = traffsakerhet()
h.remove()
return {"fore": round(fore, 4), "efter": round(efter, 4),
"effekt": round(fore - efter, 4)}
# print(ablera(modell, modell[3], neuron=7, dataloader=vl))
# {'fore': 0.9881, 'efter': 0.9878, 'effekt': 0.0003}
# ← neuronen är redundant: nätet klarar sig utan den
Utfallet i kommentaren är det vanligaste och mest lärorika: att ablera en neuron ändrar nästan ingenting, eftersom information är fördelad över många. Det är i sig ett viktigt resultat — och ett skäl att vara försiktig med berättelser om vad enskilda neuroner «gör».
Behärskning innebär
- Hittar vilka indata som aktiverar en neuron mest
- Tolkar resultatet försiktigt
- Känner till polysemantiska neuroner
Logga in för att göra övningarna och bygga upp din behärskning.
Källor
- Distill — Feature Visualization (CC BY 4.0) — CC BY 4.0
- arXiv — Toy Models of Superposition — arXiv (öppen åtkomst; licens per artikel)
- PyTorch — tutorials (BSD-3) — BSD-3-Clause