This is the code for the paper "Understanding Generalization in Adversarial Training via the Bias-Variance Decomposition".
- Python
- Pytorch (1.3.1)
- CUDA
- numpy
There are 4 folders, cifar10, cifar100, 2d, and logistic_regression.
First cd into the directory.
To run the L-infinity adversarial training with eps=8.0 on the CIFAR10 dataset saved to folder model_Linf_eps8, run
python train_adv.py --norm l_inf --fname model_Linf_eps8 --epsilon 8 --width-factor 10
norm:l_pnorm for adversarial attack.width-factor: width-factor of the WideResNet-28.epochs: how many epochs for training.fname: specify the name of the folder for saving logs and checkpoints.
To evaluate the standard (squared loss) bias-variance on the above model model_Linf_eps8 on epoch 200, run
python eval_adv_bv_mse.py --fname model_Linf_eps8 --resume 200 --attack none
To evaluate the adversarial (squared loss) bias-variance on the above model model_Linf_eps8 on epoch 200
with perturbation size eps=6, run
python eval_adv_bv_mse.py --fname model_Linf_eps8 --resume 200 --attack pgd --epsilon 6
To evaluate the standard (cross-entropy) bias-variance on the above model model_Linf_eps8 on epoch 200, run
python eval_adv_bv_kl.py --fname model_Linf_eps8 --resume 200 --attack none
fname: specify the name of the folder for evaluation.resume: specify the epoch of the train models for evaluation.attack: attack method for evaluation.epsilon: perturbation radius of the adversarial attack.
The results (including bias and variance) will be save in 'bv_mse_log_epoch{}_eps{}.txt'.format(resume, epsilon) (for mse)/bv_kl_log_epoch{}_eps{}.txt'.format(resume, epsilon)(for cross-entropy), in the folder fname.
The log file includes the following,
| trial | train loss | test acc | bias | variance |
|---|
To run the L-infinity adversarial training with eps=8.0 on the CIFAR100 dataset saved to folder model_Linf_eps8, run
python train_adv.py --norm l_inf --fname model_Linf_eps8 --epsilon 8
To evaluate the standard (squared loss) bias-variance on the above model model_Linf_eps8 on epoch 200, run
python eval_adv_bv_mse.py --fname model_Linf_eps8 --resume 200 --attack none
To reproduce the 2D box example results, run 2d_bv.ipynb.
To reproduce the logistic_regression results, run logistic_regression.ipynb.
For more experimental and technical details, please check our paper.
@article{yu2021understanding,
title={Understanding Generalization in Adversarial Training via the Bias-Variance Decomposition},
author={Yaodong Yu and Zitong Yang and Edgar Dobriban and Jacob Steinhardt and Yi Ma},
journal={arXiv preprint arXiv:2103.09947},
year={2021}
}

