
Implementazione di riferimento in PyTorch di un metodo di addestramento avversariale rapido che previene l'overfitting catastrofico tramite obiettivi accoppiati e una protezione contro la deriva dei pesi basata su EMA, con valutazione AutoAttack.
Implementazione di riferimento in PyTorch del metodo descritto nel paper sopra citato. Il fast adversarial training (FAT) soffre di catastrophic overfitting (CO): l'accuratezza robusta FGSM resta alta mentre l'accuratezza robusta PGD crolla nel giro di un paio di epoche. Questa codebase implementa i due contributi del paper:
Accuratezza robusta (%) sotto la completa AutoAttack (AA) standard e l'attacco a rilassamento dei vincoli (CR), ε = 8/255, ResNet18 (PreActResNet18 su Tiny-ImageNet), media ± deviazione standard campionaria. Le righe di baseline sono i risultati rilasciati di FastAT_Benchmark sotto il medesimo protocollo.
| Metodo | C10 AA | C10 CR | C100 AA | C100 CR | Tiny AA | Tiny CR |
|---|---|---|---|---|---|---|
| PGD-AT-WA (rif. multi-step) | 50.49±0.15 | 50.51±0.16 | 26.90±0.17 | 26.87±0.17 | 19.77±0.16 | 19.75±0.13 |
| NuAT | 50.10±0.18 | 50.11±0.19 | 14.41±3.29 | 17.66±0.42 | 10.20±0.44 | 10.19±0.44 |
| LIET | 49.99±0.15 | 49.93±0.15 | 26.64±0.13 | 26.63±0.14 | 19.88±0.09 | 19.86±0.07 |
| FGSM-PGI | 49.89±0.08 | 49.89±0.12 | 26.29±0.16 | 26.31±0.12 | 19.55±0.11 | 19.52±0.12 |
| FGSM-FUAP | 49.73±0.12 | 49.71±0.12 | 25.95±0.08 | 25.94±0.05 | 19.10±0.18 | 19.09±0.19 |
| FGSM-CUAP | 49.55±0.22 | 49.54±0.22 | 25.85±0.50 | 25.83±0.49 | 19.19±0.09 | 19.20±0.11 |
| Base + guard (nostro) | 50.45±0.20 | 50.44±0.16 | 27.15±0.04 | 27.20±0.07 | 20.47±0.11 | 20.54±0.15 |
La più alta accuratezza AutoAttack e CR tra i metodi fast su tutti e tre i dataset, a un costo da FAT (~0.7–1.1 h/run su una A100, contro ~2 h per il riferimento multi-step). Su CIFAR-10 la base senza guardia è un lancio di moneta: 2 semi su 4 collassano in artefatti di CO (AutoAttack 7.5) mentre i sopravvissuti eguagliano la riga con guardia (50.67±0.08) — l'effetto della guardia è esattamente la rimozione di questa modalità di fallimento. In particolare, le componenti FAB-T e square di AutoAttack trovano zero punti aggiuntivi su tutti i nostri checkpoint rilasciati (nessuna firma di gradient masking). Numeri per seme e log grezzi: logs/.
pip install -r requirements.txt
Testato con Python 3.12, torch 2.5.1, torchvision 0.20.1, torchattacks 3.5.1, CUDA 12.4, su A100-PCIE-40GB. La directory autoattack/ in questo repo è la copia vendorizzata con cui sono stati prodotti i numeri rilasciati (AutoAttack di Francesco Croce); eseguendo dalla radice del repo, questa ha la precedenza su qualsiasi copia installata tramite pip.
train.py implementa il metodo del paper; i valori predefiniti corrispondono alla ricetta per CIFAR-10.
# CIFAR-10 (γ_max=4.0, m_max=2.5, λ_d=0.3, guard θ=0.08) — 4 seeds
bash scripts/train_cifar10.sh 0 # GPU 0, seeds 0 1 2 3
# CIFAR-100 (γ_max=1.25, m_max=4.5, λ_d=0)
bash scripts/train_cifar100.sh 0
# Tiny-ImageNet (PreActResNet18, γ_max=1.0, m_max=2.5, λ_d=0)
bash scripts/train_tiny.sh 0
# or a single run directly (equivalent to the CIFAR-10 script)
python train.py --dataset cifar10 --seed 0 --gpu 0 \
--nuc-max 4.0 --mse-extra 2.5 --lam-d 0.3 --guard val --guard-thr 0.08 \
--out-dir results/cifar10/guard_s0
Ogni esecuzione scrive train.log (PGD-10 di validazione per epoca dei pesi raw ed EMA, righe di attivazione della guardia), probe.csv (dinamica CO opzionale a livello di batch) e best.pth / last.pth / ema_last.pth. best.pth è l'epoca con il PGD-10 di validazione più alto (pesi raw vs EMA, spareggio basato sull'accuratezza pulita).
--guard none disabilita la guardia (la base non protetta; aspettarsi il lancio della moneta CO su CIFAR-10).--init-style bu cambia l'inizializzazione della perturbazione dal semi-segno fresco a 0.5ε del paper a 70% ±ε Rademacher / 30% U[−ε, ε].--probe-every 0 disabilita le sonde diagnostiche. Nota che le sonde consumano RNG e quindi perturbano la traiettoria di addestramento (la "lotteria della strumentazione" riportata nel paper) — allinea questo flag all'esecuzione rilasciata con cui confronti (vedi logs/README.md).# complete standard AutoAttack + CR attack, full test set, bs=200
bash scripts/eval.sh results/cifar10/guard_s0 0 # GPU 0, ResNet18
bash scripts/eval.sh results/tiny-imagenet/guard_s0 0 preact18
# or individually
python aa_eval.py --run-dir results/cifar10/guard_s0 --gpu 0 --full # autoattack_full.log
python cr_eval.py --run-dir results/cifar10/guard_s0 --gpu 0 # cr_attack.log
aa_eval.py --full esegue la suite standard completa (apgd-ce, apgd-t, FAB-T, square) — il protocollo di ogni numero AA nel paper. Senza --full esegue la variante di sviluppo a 2 attacchi del benchmark (apgd-ce + apgd-t), che sui nostri modelli differisce al massimo di 0.02.
train.py # coupled FAT + EMA self-anchor guard (the method)
aa_eval.py # AutoAttack evaluation (full suite / 2-attack variant)
cr_eval.py # CR attack evaluation
models/ # ResNet18 / PreActResNet18 (from FastAT_Benchmark)
utils/ # datasets, seeding, logger (from FastAT_Benchmark)
attacks/ # CR attack (from FastAT_Benchmark)
autoattack/ # vendored AutoAttack (Francesco Croce, fra31)
scripts/ # per-dataset training launchers + eval
logs/ # raw logs of every run behind the paper's tables
Identico a FastAT_Benchmark: ResNet18 (CIFAR-10/100) e PreActResNet18 (Tiny-ImageNet); ε = 8/255; 100 epoche; SGD (lr 0.1, momentum 0.9, weight decay 5e-4) con OneCycleLR; batch size 128; split 49 000 / 1 000 train / val; label smoothing 0.4; selezione del modello tramite PGD-10 di validazione; valutazione sull'intero test set con PGD-{10,20,50}, AutoAttack e l'attacco CR. Tutte le esecuzioni usano set_seed con modalità cudnn deterministica.
models/, utils/, attacco CR in attacks/) e tutti i risultati di baseline provengono da FastAT_Benchmark — si prega di citarlo se si utilizzano i numeri di confronto.autoattack/ è AutoAttack di Francesco Croce (incluso senza modifiche).Il paper è in fase di revisione. Se si utilizza questo codice, si prega di citarlo tramite il suo titolo fino alla disponibilità di una voce BibTeX: