Home

Awesome

Fast Certified Robust Training with Short Warmup

Interval bound based certified robust training such as IBP and CROWN-IBP are one of the most effective approaches for L_inf norm certified robustness. Unfortunately, IBP based training is often unstable and requires a large number of "warmup" epochs and a long training schedule. Existing works typically require a large number epochs (e.g., a few thousands) to achieve SOTA certified error.

We find that weight initialization adopted prior works, which were originally designed for regular network training, can cause exploding certified bounds and are thus not suitable for IBP. We also find that IBP leads to imbalanced ReLU activation states with the model perfers inactive (dead) ReLU neurons significantly more.

To address the above two issues, we propose the following improvements for certified training, and thereby significantly reduce the number of training epochs while outperforming literatures SOTA:

With our proposed initialization, architectural changes, and regularizers combined, we achieved 65.03% verified error on CIFAR-10 (eps=8/255), 82.13% verified error on TinyImageNet, and 10.98% verified error on MNIST (eps=0.4), which noticeably outperforms literature IBP and CROWN-IBP results. Additionally, we need much fewer training epochs to achieve these results: 160 epochs for CIFAR-10 and 80 epochs for TinyImageNet. More details can be found in our paper:

Fast Certified Robust Training with Short Warmup, by Zhouxing Shi*, Yihan Wang*, Huan Zhang, Jinfeng Yi and Cho-Jui Hsieh (* Equal contribution), to appear in NeurIPS 2021.

Dependencies

We use auto_LiRPA as a base framework for robustness verification. It can be installed via pip install auto-LiRPA==0.2 or source code:

git clone https://github.com/KaidiXu/auto_LiRPA.git
cd auto_LiRPA
python setup.py install

And install other required dependencies:

pip install -r requirements.txt

We are using PyTorch 1.8.1, but we expect the code to work well for other recent versions (since PyTorch 1.6.0).

How to run

We show sample usages for the three datasets below:

MNIST

python train.py --method={method} --dir=model_mnist --scheduler_opts=start=1,length=20 --lr-decay-milestones=50,60 --num-epochs=70 --config=config/mnist.json --model={model} 

where {method} can be chosen from ["vanilla", "fast"] (for Vanilla IBP and our fast training (initialization + regularizers) respectively), and {model} can be chosen from ["cnn", "wide_resnet_8", "resnext"].

CIFAR-10

python train.py --method={method} --dir=model_cifar --scheduler_opts=start=2,length=80 --lr-decay-milestones=120,140 --num-epochs=160 --config=config/cifar.json --model={model} 

where {model} can be chosen from ["cnn", "wide_resnet_8", "resnext"]. Others are similar to MNIST.

Tiny-ImageNet

Please prepare the Tiny-ImageNet dataset first with:

cd data/tinyimagenet
bash tinyimagenet_download.sh

Then

python train.py --method={method} --config=config/tinyimagenet.ibp.json --model={model} --scheduler_name=SmoothedScheduler --scheduler_opts=start=2,length=20 --reg-lambda=2e-1 --num-epochs=80  --lr-decay-milestones=61,71 --num-class 200 --grad-acc-steps=2 --batch-size=128

where {model} can be chosen from ["cnn_7layer_bn_imagenet", "wide_resnet_imagenet64", "ResNeXt_imagenet64"]. It is preferred to use a smaller lambda for TinyImagenet, by setting --reg-lambda (e.g., 0.1, in contrast to the default 0.5 value).

GPU Memory for Large Models

Since some models are relatively large, when the model cannot fit into the available GPU memory, you may add a --grad-acc-steps argument for gradient accmulation. Multi-GPU is not supported so far.

Checkpoint

We have released some of the checkpoints of our training.