
Implementación de referencia en PyTorch de un método de entrenamiento adversario rápido que previene el sobreajuste catastrófico mediante objetivos acoplados y una protección contra la deriva de pesos basada en EMA, con evaluación mediante AutoAttack.
Implementación de referencia en PyTorch del método descrito en el artículo anterior. El entrenamiento adversario rápido (FAT) sufre de sobreajuste catastrófico (CO): la precisión robusta frente a FGSM se mantiene alta mientras que la precisión robusta frente a PGD colapsa en un par de épocas. Este código implementa las dos contribuciones del artículo:
Precisión robusta (%) bajo el AutoAttack (AA) estándar completo y el ataque de relajación de restricciones (CR), ε = 8/255, ResNet18 (PreActResNet18 en Tiny-ImageNet), media ± desviación estándar muestral. Las filas de referencia son los resultados publicados de FastAT_Benchmark bajo el protocolo idéntico.
| Método | C10 AA | C10 CR | C100 AA | C100 CR | Tiny AA | Tiny CR |
|---|---|---|---|---|---|---|
| PGD-AT-WA (ref. multi-paso) | 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 + guardián (nuestro) | 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 mayor precisión frente a AutoAttack y CR entre los métodos rápidos en los tres conjuntos de datos, a coste de FAT (~0.7–1.1 h/ejecución en una A100, frente a ~2 h para la referencia multi-paso). En CIFAR-10 la base sin guardián es una moneda al aire: 2 de 4 semillas colapsan a artefactos de CO (AutoAttack 7.5) mientras que las supervivientes igualan la fila con guardián (50.67±0.08) — el efecto del guardián es exactamente la eliminación de este modo de fallo. Notablemente, los componentes FAB-T y square de AutoAttack encuentran cero puntos adicionales en todos nuestros checkpoints publicados (sin firma de enmascaramiento de gradientes). Números por semilla y registros brutos: logs/.
pip install -r requirements.txt
Probado con Python 3.12, torch 2.5.1, torchvision 0.20.1, torchattacks 3.5.1, CUDA 12.4, en A100-PCIE-40GB. El directorio autoattack/ en este repositorio es la copia incluida con la que se generaron las cifras publicadas (AutoAttack de Francesco Croce); ejecutarlo desde la raíz del repositorio hace que tenga prioridad sobre cualquier copia instalada mediante pip.
train.py implementa el método del artículo; los valores predeterminados corresponden a la receta de 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
Cada ejecución escribe train.log (PGD-10 de validación por época de los pesos sin procesar y EMA, líneas de activación de la guarda), probe.csv (dinámica de CO a nivel de lote opcional) y best.pth / last.pth / ema_last.pth. best.pth es la época con el PGD-10 de validación más alto (pesos sin procesar vs EMA, desempatado por precisión limpia).
--guard none desactiva la guarda (la base sin guarda; se espera el lanzamiento de moneda de CO en CIFAR-10).--init-style bu cambia la inicialización de la perturbación del medio signo fresco a 0.5ε del artículo a 70% ±ε Rademacher / 30% U[−ε, ε].--probe-every 0 desactiva las sondas de diagnóstico. Tenga en cuenta que las sondas consumen RNG y, por lo tanto, perturban la trayectoria de entrenamiento (la "lotería de instrumentación" reportada en el artículo) — haga coincidir esta bandera con la ejecución publicada con la que compara (consulte 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 ejecuta la suite estándar completa (apgd-ce, apgd-t, FAB-T, square) — el protocolo de cada número de AA en el artículo. Sin --full, ejecuta la variante de desarrollo de 2 ataques del benchmark (apgd-ce + apgd-t), que en nuestros modelos difiere como máximo en 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
Idéntico a FastAT_Benchmark: ResNet18 (CIFAR-10/100) y PreActResNet18 (Tiny-ImageNet); ε = 8/255; 100 épocas; SGD (lr 0.1, momentum 0.9, weight decay 5e-4) con OneCycleLR; tamaño de lote 128; división de 49 000 / 1 000 train / val; label smoothing 0.4; selección de modelo mediante validación PGD-10; evaluación sobre el conjunto de test completo con PGD-{10,20,50}, AutoAttack y el ataque CR. Todas las ejecuciones usan set_seed con modo determinista de cudnn.
models/, utils/, ataque CR en attacks/) y todos los resultados de referencia provienen de FastAT_Benchmark — por favor, cítalo si utilizas las cifras de comparación.autoattack/ es AutoAttack de Francesco Croce (incluido sin modificaciones).