Labb: ablation — vilken komponent gör jobbet?
Bygga ett ablationsverktyg som genererar konfigurationer (leave-one-out och add-one), kör en pipeline med flera frön, rapporterar medel ± std och Δ mot full konfiguration, och avgör med en förbestämd regel vilka komponenter som är visat viktiga.
Teori
En ablation isolerar en komponents bidrag genom att ändra en sak i taget med allt annat lika. Skillnader mindre än ~2 standardavvikelser (över frön) är inte visade. Add-one-varianter avslöjar interaktioner: två komponenter kan vara värdelösa var för sig men avgörande tillsammans. Pipelinen här är en textklassificerare med tre komponenter: bigram, stoppordsfilter och klassviktning — och datan är konstruerad så att bara vissa komponenter spelar roll.
Deluppgifter
- konfigurationer —
configurations(components)→ dict namn→config med "full", "baslinje", "utan_<k>" för varje k och "bara_<k>" för varje k. - körning och statistik —
run_ablation(run_fn, components, seeds)→ lista av rader {name, mean, std, delta} där delta = mean − mean(full); std med ddof=1; rader i samma ordning som configurations(). - tolkning —
important(rows, sigma_mult=2.0)→ sorterad lista av komponenter k där utan_k har delta < −sigma_mult·std(full);interactions(rows, components, sigma_mult)→ par (a, b) där bara_a och bara_b ≈ baslinje men full ≫ baslinje.
Godkänt när: correct >= 1
Startkoden
körs i en isolerad sandlåda på servern"""Ablationsverktyg. Fyll i funktionerna — pipeline.run(config, seed) är given."""
import numpy as np
def configurations(components):
"""namn -> config (dict komponent -> bool). Ordning: full, baslinje, utan_<k>…, bara_<k>…"""
# TODO
raise NotImplementedError
def run_ablation(run_fn, components, seeds):
"""Kör varje konfiguration med varje frö. Returnerar lista av dict {name, mean, std, delta} i configurations()-ordning."""
# TODO: std med ddof=1; delta = mean - mean(full)
raise NotImplementedError
def important(rows, sigma_mult=2.0):
"""Komponenter k där raden 'utan_k' har delta < -sigma_mult * std(full). Sorterad lista."""
# TODO
raise NotImplementedError
def interactions(rows, components, sigma_mult=2.0):
"""Par (a, b) (a < b) där bara_a och bara_b båda ligger inom sigma_mult*std(baslinje) från baslinjen,
men full ligger mer än sigma_mult*std(baslinje) över baslinjen."""
# TODO
raise NotImplementedError
Du skriver koden, tester du inte ser avgör om den håller. Skapa ett gratis konto för att köra labben.
Prova diagnosenSkapa konto gratisFörväntade resultat
Ablationen på den inbyggda pipelinen (3 frön) ska peka ut exakt {bigram, klassvikt} som viktiga och stoppordsfiltret som inte visat viktigt (Δ inom bruset). Titta också på add-one-raderna: bara_bigram och bara_klassvikt ligger båda nära baslinjen medan full ligger långt över — en interaktion. Eval: correct = 1 när mängden stämmer.
Vanliga fel
- std med ddof=0 (populationsvarians) i stället för ddof=1.
- Jämför delta mot std för varianten i stället för std för full.
- Glömmer att rader måste komma i configurations()-ordning.
- Kör olika frön för olika varianter — då mäter du brus, inte komponenten.