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

Projekt 6: Reproducera ett paper — Dropout (Srivastava m.fl. 2014)

Formulera paperets påstående som hypotes, reproducera det i liten skala (dropout minskar gapet mellan tränings- och testfel), köra ablation över p ∈ {0, 0.2, 0.5} och tre frön, rapportera medel ± std och skriva en reproducerbar rapport som artefakt.

Teori

Srivastava m.fl. (2014) visar att dropout minskar överanpassning genom att slumpmässigt stänga av neuroner under träning. Hypotes: med dropout p=0,5 är test−tränings-gapet mindre än utan, och testfelet lägre, på ett litet MLP tränat på lite data. Reproduktion kräver: fasta frön, samma data, samma budget, flera körningar.

Deluppgifter

  1. modell med dropout — make_model(p) → MLP 64→256→256→10 med nn.Dropout(p) efter varje ReLU.
  2. ett experiment — run_once(p, seed, n_train, epochs) → {train_acc, test_acc, gap} på digits med litet träningsset (n_train=300) för att framkalla överanpassning.
  3. ablation — ablation(ps, seeds) → per p: medel och std av gap och test_acc.
  4. rapport — write_report(results, path) skriver out/report.md med tabell, hypotes, metod, frön, slutsats.

Godkänt när: gap_reduction >= 0.15

Startkoden

körs i en isolerad sandlåda på servern
import os
import statistics
import torch
import torch.nn as nn
from sklearn.datasets import load_digits


def data(seed, n_train=300):
    d = load_digits()
    X = torch.tensor(d.data, dtype=torch.float32) / 16; y = torch.tensor(d.target)
    g = torch.Generator().manual_seed(seed); idx = torch.randperm(len(X), generator=g)
    return X[idx[:n_train]], y[idx[:n_train]], X[idx[n_train:]], y[idx[n_train:]]


def make_model(p):
    # TODO
    ...


def accuracy(model, X, y):
    model.eval()
    with torch.no_grad():
        return float((model(X).argmax(1) == y).float().mean())


def run_once(p, seed, n_train=300, epochs=200, lr=1e-2):
    # TODO: torch.manual_seed(seed); data; modell; Adam; full-batch träning epochs steg; return {train_acc, test_acc, gap}
    ...


def ablation(ps=(0.0, 0.2, 0.5), seeds=(0, 1, 2), **kw):
    # TODO: {p: {"gap_mean", "gap_std", "test_mean", "test_std", "runs": [...]}}
    ...


def write_report(results, path="out/report.md"):
    # TODO: markdown med hypotes, metod (data, modell, budget, frön), tabell per p, slutsats
    ...

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

Gapet (train−test) med p=0,5 är minst 15 % mindre än med p=0 (medel över 3 frön, 300 epoker). I den här lilla skalan är effekten tydlig men mindre än i papret — det är en del av reproduktionens resultat och ska stå i rapporten. out/report.md redovisar medel ± std och frön.

Vanliga fel

  • Glömmer model.eval() vid utvärdering → dropout aktiv under test.
  • Samma frö för alla körningar → std = 0 och ingen osäkerhet.
  • Mäter test_acc på träningsdata.