
PyTorch-Referenzimplementierung einer schnellen adversarialen Trainingsmethode, die katastrophales Overfitting durch gekoppelte Ziele und einen EMA-basierten Weight-Drift-Schutz verhindert, mit AutoAttack-Evaluierung.
Referenz-PyTorch-Implementierung der im obigen Paper beschriebenen Methode. Schnelles adversarisches Training (Fast Adversarial Training, FAT) leidet unter katastrophalem Overfitting (CO): Die robuste Genauigkeit gegenüber FGSM bleibt hoch, während die robuste Genauigkeit gegenüber PGD innerhalb weniger Epochen zusammenbricht. Diese Codebasis implementiert die beiden Beiträge des Papers:
Robuste Genauigkeit (%) unter der vollständigen Standard-AutoAttack (AA) und dem Constraint-Relaxation-Angriff (CR), ε = 8/255, ResNet18 (PreActResNet18 auf Tiny-ImageNet), Mittelwert ± Stichproben-Standardabweichung. Die Baseline-Zeilen sind die veröffentlichten Ergebnisse des FastAT_Benchmark unter identischem Protokoll.
| Methode | C10 AA | C10 CR | C100 AA | C100 CR | Tiny AA | Tiny CR |
|---|---|---|---|---|---|---|
| PGD-AT-WA (Mehrschritt-Referenz) | 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 |
| Basis + Guard (unser Ansatz) | 50,45±0,20 | 50,44±0,16 | 27,15±0,04 | 27,20±0,07 | 20,47±0,11 | 20,54±0,15 |
Stärkste AutoAttack- und CR-Genauigkeit unter allen schnellen Methoden auf allen drei Datensätzen, zu FAT-Kosten (~0,7–1,1 h pro Lauf auf einer A100, gegenüber ~2 h für die Mehrschritt-Referenz). Auf CIFAR-10 ist die ungeschützte Basis ein Münzwurf: 2 von 4 Seeds kollabieren zu CO-Artefakten (AutoAttack 7,5), während die überlebenden Seeds mit der geschützten Zeile übereinstimmen (50,67±0,08) — die Wirkung des Guards besteht genau in der Beseitigung dieses Fehlermodus. Bemerkenswert ist, dass die FAB-T- und Square-Komponenten von AutoAttack auf allen unseren veröffentlichten Checkpoints keine zusätzlichen Punkte finden (keine Signatur von Gradient Masking). Zahlen pro Seed und Rohprotokolle: logs/.
pip install -r requirements.txt
Getestet mit Python 3.12, torch 2.5.1, torchvision 0.20.1, torchattacks 3.5.1, CUDA 12.4, auf einer A100-PCIE-40GB. Das Verzeichnis autoattack/ in diesem Repo ist die gebündelte Kopie, mit der die veröffentlichten Zahlen erzeugt wurden (Francesco Croces AutoAttack); wenn man vom Repo-Stammverzeichnis aus startet, hat sie Vorrang vor jeder per pip installierten Kopie.
train.py implementiert die Methode des Papers; die Standardwerte entsprechen dem CIFAR-10-Rezept.
# 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
Jeder Lauf schreibt train.log (pro Epoche Val PGD-10 der Roh- und EMA-Gewichte, Guard-Fire-Zeilen), probe.csv (optional CO-Dynamik auf Batch-Ebene) sowie best.pth / last.pth / ema_last.pth. best.pth ist die Epoche mit dem höchsten Validierungs-PGD-10 (Roh- vs. EMA-Gewichte, bei Gleichstand entscheidet die Clean-Accuracy).
--guard none deaktiviert den Guard (die ungeschützte Basis; erwarte den CO-Münzwurf auf CIFAR-10).--init-style bu ändert die Perturbations-Initialisierung vom frischen Halbvorzeichen bei 0,5ε aus dem Paper zu 70 % ±ε Rademacher / 30 % U[−ε, ε].--probe-every 0 deaktiviert die Diagnose-Probes. Beachte, dass die Probes RNG verbrauchen und dadurch die Trainings-Trajektorie verändern (die im Paper berichtete „Instrumentation Lottery") — stimme dieses Flag auf den veröffentlichten Lauf ab, mit dem du vergleichst (siehe 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 führt die vollständige Standard-Suite aus (apgd-ce, apgd-t, FAB-T, square) — das Protokoll jedes AA-Werts im Paper. Ohne --full wird die 2-Angriffs-Entwicklungsvariante des Benchmarks ausgeführt (apgd-ce + apgd-t), die sich bei unseren Modellen um höchstens 0,02 unterscheidet.
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
Identisch zu FastAT_Benchmark: ResNet18 (CIFAR-10/100) und PreActResNet18 (Tiny-ImageNet); ε = 8/255; 100 Epochen; SGD (lr 0.1, Momentum 0.9, Weight Decay 5e-4) mit OneCycleLR; Batch-Größe 128; 49 000 / 1 000 Train-/Val-Split; Label Smoothing 0.4; Modellauswahl per Validierungs-PGD-10; Evaluierung auf dem vollständigen Testset mit PGD-{10,20,50}, AutoAttack und dem CR-Angriff. Alle Läufe verwenden set_seed mit cudnn-Determinismus-Modus.
models/, utils/, attacks/ CR-Angriff) und alle Baseline-Ergebnisse stammen aus FastAT_Benchmark — bitte zitieren Sie es, wenn Sie die Vergleichszahlen verwenden.autoattack/ ist AutoAttack von Francesco Croce (unverändert eingebunden).