Hoppa till innehållet
AI-grafen
GFrontier LabLaboration· ca 90 min· sandlåda på servern

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

  1. konfigurationer — configurations(components) → dict namn→config med "full", "baslinje", "utan_<k>" för varje k och "bara_<k>" för varje k.
  2. 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().
  3. 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 gratis

Fö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.