YourBench๋ ๊ธฐ์กด์ ์๋ ๋ชจ๋ธ, ๋๋ ์ฌ์ฉ์์ ๋ชจ๋ธ์ ์ ๋ ฅ๋ฐ์ adversarial attack ์ ์ผ๋ง๋ robustํ์ง ํ๊ฐ๋ฅผ ํด์ฃผ๋ pytorch library์ ๋๋ค. ๋ชจ๋ธ ๊ฐ๋ฐ์๋ค์ด ๋์ฑ ์ฝ๊ฒ adversarial training์ ํ ์ ์๋๋ก ๋ชจ๋ธ์ ํ๊ฐ ์งํ๋ฅผ Report์ ํจ๊ป ์ ๊ณตํฉ๋๋ค.
์ ๋์ ๊ณต๊ฒฉ์ ๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ๊ณต๊ฒฉํ๋ ๊ฐ์ฅ ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ํ์ต์ํค๋ ๋ฐฉ๋ฒ์ ์ญ์ผ๋ก ๋ชจ๋ธ ๊ณต๊ฒฉ์ ์ด์ฉํ์ฌ ๋ชจ๋ธ์ด ์ฌ๋ฐ๋ฅธ ์์ธก์ ํ์ง ๋ชปํ๋๋ก ๋ฐฉํดํ ์ ์์ต๋๋ค. ์ธ๊ฐ์ ๋์๋ ๋๊ฐ์ ๋ฐ์ดํฐ์ด์ง๋ง, ๋ชจ๋ธ์ ์ ๋ ฅํ๋ฉด ์ ํ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์๋ ๊ฒ์ด์ฃ . ๋ชจ๋ธ์ด ํ ์คํธ ์ด๋ฏธ์ง๋ฅผ ์ ๋ถ๋ฅํ๋๋ผ๋, ์ด๋ฌํ ์ ๋์ ๊ณต๊ฒฉ์ ์ทจ์ฝํ๋ค๋ฉด ์ฌ์ฉํ๊ธฐ ์ด๋ ค์ธ ๊ฒ์ ๋๋ค.
๋ชจ๋ธ์ด test data์ ๋ํด์ ์ถฉ๋ถํ ์ ๋ขฐ์ฑ ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ผ์ง๋ผ๋, ๊ฐ๋จํ ๋ฐ์ดํฐ ์กฐ์์ ์ทจ์ฝํ๋ค๋ฉด ๋ชจ๋ธ์ ์ธ ์ ์๊ฒ๋ฉ๋๋ค. adversarial attack๊ณผ model robustness๋ ๊ฒฝ์ฐฐ๊ณผ ๋๋ ๊ด๊ณ์ ๋๋ค. ์๋ก ๊พธ์คํ ๋ฐ์ ํ๋ฉด์ ๋ฐ๋ผ์ก์ผ๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ํ์ฌ ์์ ์ ์ ๊ฒฝ๋ง, ๋๋ ๋ชจ๋ธ์ด adversarial attack์ ๋ํด์ robust ํ ์ง๋ผ๋, ์ธ์ ๋ ์ง ์๋ก์ด ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ด ๋ํ๋ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ธ ๊ฐ๋ฐ์ ์ ์ฅ์์ ์๋ก์ด ๊ณต๊ฒฉ๊ธฐ๋ฒ์ ๋ํด์ ๋ ๋๋นํ๋ ์์ธ๊ฐ ์ค์ํฉ๋๋ค. ๋ค๋ง ๊ทธ ๋น์ฉ๊ณผ ์๊ฐ์ด ๋ง์ด ๋ค๊ธฐ ๋๋ฌธ์ ์์ ์ ์ ๊ฒฝ๋ง์ด ํ์ฌ๊น์ง ์๋ ค์ง ์๋ ๊ฐ๋ ฅํ adversarial attack์ ์ผ๋ง๋ robustํ์ง ํ์ธํ๋ ํ๋ก์ธ์ค ๋ํ ์ค์ํ๋ค๊ณ ํ ์ ์์ต๋๋ค.
๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ๋ฌ๋ฆฌ, YourBench๋ ๊ฐ์ธ Neural Network๋ฅผ ์ ๋ ฅ๋ฐ์ adversarial attack์ ๋ํ Benchmark ์ ์๋ฅผ report์ ํจ๊ป ์ ๊ณตํฉ๋๋ค. Report๋ ๋ชจ๋ธ์ ์ทจ์ฝ์ ๊ณผ ๊ทธ์ ๋ํ ๊ฐ์ ๋ฐฉ์์ ์ ์ํฉ๋๋ค.๊ฐ๋ฐ์๋ ์ด๋ฅผ ํตํด์ ์์ ์ ๋ชจ๋ธ์ ์์ ์ฑ์ด ์ด๋์ ๋ ์ธ์ง ๊ฐ๋ ํ ์ ์์ ๊ฒ์ ๋๋ค.
usage: main.py [-h] -a [{FGSM,CW,PGD,DeepFool} ...] -m {ResNet101_2,ResNet18,Custom} -d {CIFAR-10,CIFAR-100,ImageNet,Custom}
main.py: error: the following arguments are required: -a/--attack_method, -m/--model, -d/--dataset
-a ์ต์
์ ์ํํ ๊ณต๊ฒฉ์ ์
๋ ฅํฉ๋๋ค.
-m ๊ณต๊ฒฉ์ ์ํํ ๋ชจ๋ธ์ ์
๋ ฅํฉ๋๋ค. ์ฌ์ฉ์ ๋ชจ๋ธ ์ํํ๊ณ ์ถ๋ค๋ฉด ์๋ custom ๋ชจ๋ธ ๋ถ๋ฌ์ค๊ธฐ ์ค๋ช
์ ์ฝ์ด์ฃผ์ธ์.
-d ๋ฐ์ดํฐ์
์ ์
๋ ฅํฉ๋๋ค. ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅ์ผ๋ก ํ๊ณ ์ถ๋ค๋ฉด ์๋ custom ๋ฐ์ดํฐ์
๋ถ๋ฌ์ค๊ธฐ ์ค๋ช
์ ์ฝ์ด์ฃผ์ธ์.\
YourBench์์ ์ ๊ณตํ๋ ๋ชจ๋ธ ๋ง๊ณ ๋ ์ฌ์ฉ์ ๋ชจ๋ธ์ ๋ถ๋ฌ์ฌ ์ ์์ต๋๋ค.
YourBench ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฐ์ ํ, ์ฌ์ฉ์ ๋ชจ๋ธ์ด ์ ์๋ ํ์ด์ฌ ํ์ผ์ custom_net.py๋ก ์ ์ฅํด์ค๋๋ค.
custom_net.py์์ ์์ ์ ๋ชจ๋ธ ํด๋์ค๋ช
์ my_model์ด๋ผ๊ณ ํด์ฃผ์ธ์.
๋ชจ๋ธ์ ํ๋ผ๋ฏธํฐ ๊ฐ์ด ์ ์ฅ๋์ด์๋ state_dict๋ํ ๊ฐ์ YourBench ๋๋ ํ ๋ฆฌ ์์ my_model.pth๋ก ์ ์ฅํด์ฃผ์ธ์.
์ดํ ํฐ๋ฏธ๋์์ -m Custom ์ต์
์ ์ฃผ๋ฉด ์คํ์ด ๋ฉ๋๋ค.
elif args.parsedModel == 'Custom':
#์ฌ์ฉ์ ๋ชจ๋ธ ๋ถ๋ฌ์ค๊ธฐ
pkg = __import__('custom_net')
model_custom = pkg.my_model(pretrained = False)
#state_dict์ ๊ฒฝ๋ก๋ฅผ ๋ฃ๊ธฐ.
model_custom.load_state_dict(torch.load('./my_model.pth'))
model = nn.Sequential(
norm_layer,
model_custom
).cuda()
model = model.eval()
์ฌ์ฉ์ ๋ฐ์ดํฐ ๋ํ ๋ถ๋ฌ์ฌ ์ ์์ต๋๋ค. ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ธฐ ์ํด ์๋ 2๊ฐ์ง๋ฅผ ์ํํด์ฃผ์ธ์.
Report์ ์ ํํ ์ ๋ณด ํํ์ ํ๊ธฐ ์ํด์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ์
์ ํด๋์ค ์ด๋ฆ๊ณผ ์ธ๋ฑ์ค๋ฅผ dictionary ํํ๋ก ์ ์ํ .json ํ์ผ์ YourBench ๋๋ ํ ๋ฆฌ์ ์ ์ฅํด์ฃผ์ธ์.
์๋๋ ImageNet์ class_index.json์ ์์์
๋๋ค.
{"0": ["n01440764", "tench"],
"1": ["n01443537", "goldfish"], "2": ["n01484850", "great_white_shark"], "3": ["n01491361", "tiger_shark"], "4": ["n01494475", "hammerhead"], "5": ["n01496331", "electric_ray"], "6": ["n01498041", "stingray"], "7": ["n01514668", "cock"], "8": ["n01514859", "hen"], "9": ["n01518878", "ostrich"], "10": ["n01530575", "brambling"], "11": ["n01531178", "goldfinch"], "12": ["n01532829", "house_finch"], "13": ["n01534433", "junco"], "14": ["n01537544", "indigo_bunting"], "15": ["n01558993", "robin"], "16": ["n01560419", "bulbul"], "17": ["n01580077", "jay"], "18": ["n01582220", "magpie"], ... }
Data ๋๋ ํ ๋ฆฌ ์์ 'custom_dataset' ๋๋ ํ ๋ฆฌ๋ฅผ ๋ง๋ค์ด ์์ ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํด์ฃผ์ธ์. ์๋๋ imagenet์ ์์์ ๋๋ค.
YourBench๋ ๋ณด๋ค ์ ํํ test๋ฅผ ์ํํ๊ณ report๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด์ ์ธก์ ๊ฐ๋ฅํ ๋ชจ๋ธ์ ๋ํด์ ์ ์ฝ์ฌํญ์ ๋ก๋๋ค.
- No Zero Gradients
Obfuscated Gradients๋ก ์๋ ค์ง Vanishing/Exploding gradients, Shattered Gradients, ๊ทธ๋ฆฌ๊ณ Stochastic Gradients๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ธ์ ๋ํด์๋ ์ฌ์ฉ์ ๊ถ์ฅํ์ง ์์ต๋๋ค. ์ gradients๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ธ์ ์ ํฉํ ๋ฐฉ์ด ๊ธฐ๋ฒ์ด ์๋๋ฉฐ, adversarial attack generation์ด ๋งค์ฐ ํ๋ญ๋๋ค. Obfuscated gradients๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ธ๋ค์ EOT๋ BPDA, Reparameterizing์ ํตํด ๊ณต๊ฒฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. - No Loops in Forward Pass
Forward pass์ loop๊ฐ ์๋ ๋ชจ๋ธ์ backpropagation์ ๋น์ฉ์ ์ฆ๊ฐ์ํค๊ณ , ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๊ฒ ํฉ๋๋ค. ์ด๋ฌํ ๋ชจ๋ธ๋ค์ ๋ํด์ loop์ loss์ ํด๋น ๋ชจ๋ธ์ task๋ฅผ ํฉํ์ฌ ์ ์์ ์ผ๋ก ์ ์ฉํ ์ ์๋ ๊ณต๊ฒฉ์ ๊ถ์ฅํฉ๋๋ค.
- ๋ด์ฅ ๋ชจ๋ธ๋ก ์คํํ๊ธฐ
import yourbench
atk = yourbench.PGD(model, eps=8/255, alpha=2/255, steps=4)
adv_images = atk(images, labels)
- ์ฌ์ฉ์๋ก๋ถํฐ ๋ฐ์ดํฐ์ ๊ณผ ๋ชจ๋ธ, ๊ทธ๋ฆฌ๊ณ ์ด๋ฏธ์ง ๋ ์ด๋ธ์ ์ ๋ ฅ๋ฐ์ ๋ค์์ ์ํํ ์ ์์ต๋๋ค.
# label from mapping function
atk.set_mode_targeted_by_function(target_map_function=lambda images, labels:(labels+1)%10)
- Strong attacks
atk1 = torchattacks.FGSM(model, eps=8/255)
atk2 = torchattacks.PGD(model, eps=8/255, alpha=2/255, iters=40, random_start=True)
atk = torchattacks.MultiAttack([atk1, atk2])
- Binary serach for CW
atk1 = torchattacks.CW(model, c=0.1, steps=1000, lr=0.01)
atk2 = torchattacks.CW(model, c=1, steps=1000, lr=0.01)
atk = torchattacks.MultiAttack([atk1, atk2])
Name | Paper | Remark |
---|---|---|
FGSM (Linf) |
Explaining and harnessing adversarial examples (Goodfellow et al., 2014) | |
CW (L2) |
Towards Evaluating the Robustness of Neural Networks (Carlini et al., 2016) | |
PGD (Linf) |
Towards Deep Learning Models Resistant to Adversarial Attacks (Mardry et al., 2017) | Projected Gradient Method |
DeepFool (L2) |
DeepFool: A Simple and Accurate Method to Fool Deep Neural Networks (Moosavi-Dezfooli et al., 2016) |
๋ชจ๋ธ์ ๋ํ ์ ์์ ์ ๋ขฐ๋๋ฅผ ์ป๊ธฐ ์ํด์ Robustbench ๋ฅผ ์ธ์ฉํฉ๋๋ค.
Attack | Package | Standard | Wong2020Fast | Rice2020Overfitting | Remark |
---|---|---|---|---|---|
FGSM (Linf) | Torchattacks | 34% (54ms) | 48% (5ms) | 62% (82ms) | |
Foolbox* | 34% (15ms) | 48% (8ms) | 62% (30ms) | ||
ART | 34% (214ms) | 48% (59ms) | 62% (768ms) | ||
PGD (Linf) | Torchattacks | 0% (174ms) | 44% (52ms) | 58% (1348ms) | ๐ Fastest |
Foolbox* | 0% (354ms) | 44% (56ms) | 58% (1856ms) | ||
ART | 0% (1384 ms) | 44% (437ms) | 58% (4704ms) | ||
CWโ ?(L2) | Torchattacks | 0% / 0.40 (2596ms) |
14% / 0.61 (3795ms) |
22% / 0.56 (43484ms) |
๐ Highest Success Rate ๐ Fastest |
Foolbox* | 0% / 0.40 (2668ms) |
32% / 0.41 (3928ms) |
34% / 0.43 (44418ms) |
||
ART | 0% / 0.59 (196738ms) |
24% / 0.70 (66067ms) |
26% / 0.65 (694972ms) |
||
PGD (L2) | Torchattacks | 0% / 0.41 (184ms) | 68% / 0.5 (52ms) |
70% / 0.5 (1377ms) |
๐ Fastest |
Foolbox* | 0% / 0.41 (396ms) | 68% / 0.5 (57ms) |
70% / 0.5 (1968ms) |
||
ART | 0% / 0.40 (1364ms) | 68% / 0.5 (429ms) |
70% / 0.5 (4777ms) |
* FoolBox๋ ์ ํ๋์ adversarial image๋ฅผ ๋์์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์ค์ image generation ์๊ฐ์ ๊ธฐ์ฌ๋ ๊ฒ๋ณด๋ค ์งง์ ์ ์์ต๋๋ค.
Adversarial Attack์ ์์ผ๋ก๋ ๊ณ์ ์๋กญ๊ฒ ๋์ฌ ๊ฒ์ ๋๋ค. YourBench๋ ์ถํ์๋ model์ adversarial robustness๋ฅผ ์ฆ๋ช ํ ๋ ์ฌ์ฉ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ ์ ์๋๋ก ๋ ธ๋ ฅํ๊ณ ์ ํฉ๋๋ค. ์์ผ๋ก ์๋ก์ด adversarial attack์ด ๋์จ๋ค๋ฉด ์๋ ค์ฃผ์ธ์! YourBench ์ contribute ํ๊ณ ์ถ๋ค๋ฉด ์๋๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์. CONTRIBUTING.md.
-
Adversarial Attack Packages:
- https://github.com/IBM/adversarial-robustness-toolbox: Adversarial attack and defense package made by IBM. TensorFlow, Keras, Pyotrch available.
- https://github.com/bethgelab/foolbox: Adversarial attack package made by Bethge Lab. TensorFlow, Pyotrch available.
- https://github.com/tensorflow/cleverhans: Adversarial attack package made by Google Brain. TensorFlow available.
- https://github.com/BorealisAI/advertorch: Adversarial attack package made by BorealisAI. Pytorch available.
- https://github.com/DSE-MSU/DeepRobust: Adversarial attack (especially on GNN) package made by BorealisAI. Pytorch available.
- https://github.com/fra31/auto-attack: Set of attacks that is believed to be the strongest in existence. TensorFlow, Pyotrch available.
-
Adversarial Defense Leaderboard:
-
Adversarial Attack and Defense Papers:
- https://nicholas.carlini.com/writing/2019/all-adversarial-example-papers.html: A Complete List of All (arXiv) Adversarial Example Papers made by Nicholas Carlini.
- https://github.com/chawins/Adversarial-Examples-Reading-List: Adversarial Examples Reading List made by Chawin Sitawarin.
- Seyed-Mohsen Moosavi-Dezfooli, Alhussein Fawzi, Pascal Frossard. DeepFool: a simple and accurate method to fool deep neural networks. CVPR, 2016
- Nicholas Carlini, David Wagner. Toward evaluating the robustness of neural networks. arXiv:1608.04644
-
ETC:
- https://github.com/Harry24k/gnn-meta-attack: Adversarial Poisoning Attack on Graph Neural Network.
- https://github.com/ChandlerBang/awesome-graph-attack-papers: Graph Neural Network Attack papers.
- https://github.com/Harry24k/adversarial-attacks-pytorch/blob/master/README_KOR.md
- https://sdc-james.gitbook.io/onebook/2.-1/1./1.1.5
- https://github.com/szagoruyko/pytorchviz
- https://github.com/Harry24k/adversarial-attacks-pytorch/blob/master/README_KOR.md
- https://www.koreascience.or.kr/article/JAKO202031659967733.pdf