Hoppa till innehållet
AI-grafen
F· AI engineeringinterpretability· ca 90 min· volatil — kontrolleras ofta· verifierad 2026-09-20

Aktiveringar och linjära sonder

Kunna träna en linjär sond på aktiveringar och tolka vad ett lager representerar.

Förkunskaper

Intuition

En linjär sond är en enkel klassificerare (ofta logistisk regression) tränad på ett lagers aktiveringar för att förutsäga en egenskap: är ordet ett verb? är påståendet sant? vilket språk är texten på?

Om sonden lyckas är egenskapen linjärt läsbar i det lagret. Det är en användbar signal om vad representationen bär.

Men: att informationen finns betyder inte att modellen använder den. En sond mäter läsbarhet, inte kausalitet. För kausalitet krävs intervention (aktiveringspatchning).

Formellt

Sondens grundproblem: en tillräckligt uttrycksfull sond kan lära sig egenskapen själv ur aktiveringarna, även om modellen inte representerar den. Därför:

  1. Använd linjär sond — begränsad kapacitet, mäter om informationen är lätt tillgänglig.
  2. Kör en kontrolluppgift (Hewitt & Liang 2019): träna samma sond på slumpmässigt omfördelade etiketter. Hög «selectivity» = skillnaden mellan riktig och kontrolluppgift är stor → sonden läser modellen, inte memorerar.
  3. Jämför mot baslinjer: samma sond på slumpmässiga vikter (otränad modell) och på embeddinglagret. Om lager 12 inte slår embeddinglagret säger resultatet inget om vad modellen lärt sig.
  4. Rapportera lagerprofil, inte ett enda lager — var informationen uppstår och var den försvinner är själva resultatet.

Amnestic probing går ett steg längre: ta bort riktningen sonden hittade (t.ex. med INLP) och mät om modellens beteende ändras. Ändras det inte användes informationen inte.

Kod

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score

def sond_per_lager(aktiveringar: dict[int, np.ndarray], y: np.ndarray, seed=0):
    """aktiveringar: {lager: (n, d)}. Returnerar accuracy och selectivity per lager."""
    rng = np.random.default_rng(seed)
    y_kontroll = rng.permutation(y)                      # kontrolluppgift
    rader = []
    for lager, X in sorted(aktiveringar.items()):
        clf = LogisticRegression(max_iter=2000, C=1.0)
        acc = cross_val_score(clf, X, y, cv=5).mean()
        ctrl = cross_val_score(clf, X, y_kontroll, cv=5).mean()
        rader.append({"lager": lager, "acc": round(acc, 3),
                      "kontroll": round(ctrl, 3), "selectivity": round(acc - ctrl, 3)})
    return rader

for r in sond_per_lager(akt, y):
    print(r)
# {'lager': 0,  'acc': 0.62, 'kontroll': 0.50, 'selectivity': 0.12}
# {'lager': 6,  'acc': 0.88, 'kontroll': 0.51, 'selectivity': 0.37}   ← informationen uppstår här
# {'lager': 11, 'acc': 0.91, 'kontroll': 0.50, 'selectivity': 0.41}

Lagerprofilen är resultatet: den visar var i nätet egenskapen blir läsbar — och kontrollkolumnen visar att sonden inte bara memorerar.

Behärskning innebär

  • Tränar en linjär sond på aktiveringar
  • Tolkar resultatet med rätt förbehåll
  • Använder kontroller mot falska slutsatser

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

Källor

Alla källor och licenser