
Implémentation de référence PyTorch d'une méthode d'entraînement adversarial rapide qui prévient le surapprentissage catastrophique via des objectifs couplés et une protection contre la dérive des poids basée sur l'EMA, avec évaluation AutoAttack.
Implémentation de référence en PyTorch de la méthode décrite dans l'article ci-dessus. L'entraînement adversarial rapide (FAT) souffre de surapprentissage catastrophique (CO) : la précision robuste FGSM reste élevée tandis que la précision robuste PGD s'effondre en quelques époques. Cette base de code implémente les deux contributions de l'article :
Précision robuste (%) sous l'AutoAttack (AA) standard complet et l'attaque par relaxation de contrainte (CR), ε = 8/255, ResNet18 (PreActResNet18 sur Tiny-ImageNet), moyenne ± écart-type d'échantillon. Les lignes de référence sont les résultats publiés de FastAT_Benchmark sous un protocole identique.
| Méthode | C10 AA | C10 CR | C100 AA | C100 CR | Tiny AA | Tiny CR |
|---|---|---|---|---|---|---|
| PGD-AT-WA (réf. multi-pas) | 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 + garde-fou (nôtre) | 50.45±0.20 | 50.44±0.16 | 27.15±0.04 | 27.20±0.07 | 20.47±0.11 | 20.54±0.15 |
Meilleure précision AutoAttack et CR parmi les méthodes rapides sur les trois jeux de données, à un coût FAT (~0,7–1,1 h/exécution sur un A100, contre ~2 h pour la référence multi-pas). Sur CIFAR-10, la base sans garde-fou est un pile ou face : 2 des 4 graines s'effondrent en artefacts de CO (AutoAttack 7,5) tandis que les survivantes correspondent à la ligne avec garde-fou (50,67±0,08) — l'effet du garde-fou est exactement la suppression de ce mode de défaillance. Notably, les composantes FAB-T et square d'AutoAttack ne trouvent aucun point supplémentaire sur tous nos checkpoints publiés (aucune signature de masquage de gradient). Chiffres par graine et journaux bruts : logs/.
pip install -r requirements.txt
Testé avec Python 3.12, torch 2.5.1, torchvision 0.20.1, torchattacks 3.5.1, CUDA 12.4, sur A100-PCIE-40GB. Le répertoire autoattack/ de ce dépôt est la copie vendorisée avec laquelle les chiffres publiés ont été produits (l'AutoAttack de Francesco Croce) ; l'exécution depuis la racine du dépôt lui donne la priorité sur toute copie installée via pip.
train.py implémente la méthode de l'article ; les valeurs par défaut correspondent à la recette 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
Chaque exécution écrit train.log (PGD-10 de validation par époque pour les poids bruts et EMA, lignes de déclenchement du garde), probe.csv (dynamique CO optionnelle au niveau du lot), et best.pth / last.pth / ema_last.pth. best.pth correspond à l'époque ayant le PGD-10 de validation le plus élevé (poids bruts vs EMA, départagés par la précision propre).
--guard none désactive le garde (la base non gardée ; attendez-vous au pile ou face CO sur CIFAR-10).--init-style bu fait passer l'initialisation de la perturbation du demi-signe frais à 0,5ε de l'article à 70 % ±ε Rademacher / 30 % U[−ε, ε].--probe-every 0 désactive les sondes de diagnostic. Notez que les sondes consomment le RNG et perturbent donc la trajectoire d'entraînement (la « loterie d'instrumentation » rapportée dans l'article) — faites correspondre ce drapeau à l'exécution publiée à laquelle vous vous comparez (voir 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 exécute la suite standard complète (apgd-ce, apgd-t, FAB-T, square) — le protocole de chaque chiffre AA dans l'article. Sans --full, il exécute la variante de développement à 2 attaques du benchmark (apgd-ce + apgd-t), qui sur nos modèles diffère d'au plus 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
Identique à FastAT_Benchmark : ResNet18 (CIFAR-10/100) et PreActResNet18 (Tiny-ImageNet) ; ε = 8/255 ; 100 époques ; SGD (lr 0,1, momentum 0,9, weight decay 5e-4) avec OneCycleLR ; taille de lot 128 ; découpage 49 000 / 1 000 train / val ; label smoothing 0,4 ; sélection du modèle par PGD-10 sur validation ; évaluation sur l'ensemble de test complet avec PGD-{10,20,50}, AutoAttack et l'attaque CR. Toutes les exécutions utilisent set_seed avec le mode déterministe de cudnn.
models/, utils/, attaque CR de attacks/) et tous les résultats de référence proviennent de FastAT_Benchmark — veuillez le citer si vous utilisez les chiffres de comparaison.autoattack/ est AutoAttack de Francesco Croce (intégré sans modification).