准备工作
作业十是黑箱攻击(Blackbox Attack),完成作业需要助教代码和数据集,运行代码过程中保持联网可以自动下载数据集,已经有数据集的情况可关闭助教代码中的下载数据部分。关注本公众号,可获得代码和数据集(文末有方法)。
提交地址
JudgeBoi:https://ml.ee.ntu.edu.tw/hw10/,非课程选修学生无法提交,有想讨论沟通的同学可进QQ群:156013866。以下为作业解析,详细代码见文末。
Simple Baseline(acc <= 0.70)
方法:FGSM方法。FGSM只对图片进行一次攻击,对应助教代码中fgsm函数,无需修改。代理模型(proxy models)是resnet110_cifar10,在被攻击图片中的精度benign_acc=0.95, benign_loss=0.22678。在攻击中,使用gen_adv_examples函数调用fgsm函数,精度降低:fgsm_acc=0.59, fgsm_loss=2.49272。
Medium Baseline (acc <= 0.50)
方法:I-FGSM方法 + Ensembel Attack。ifgsm方法相比与fgsm相比,使用了多次的fgsm循环攻击,对应代码中的ifgsm函数,无需修改。另外使用了Ensemble attack,该方法使用多个代理模型攻击,这里我们需要改动ensembelNet这个类中的forward函数,在攻击前测试的精度benign_acc=095, benign_loss=0.15440。在攻击中,使用gen_adv_examples函数调用emsebel_model和ifgsm,精度降低明显:ensemble_ifgsm_acc = 0.00, emsemble_ifgsm_loss=13.41106。
def forward(self, x):
emsemble_logits = None
for i, m in enumerate(self.models):
emsemble_logits = m(x) if i == 0 else emsemble_logits + m(x)
return emsemble_logits/len(self.models)
Strong Baseline (acc <= 0.30)
方法:MIFGSM + Ensemble Attack(pick right models)。mifgsm相比于ifgsm,加入了momentum,避免攻击陷入local maxima(这个与optimizer里面momentum的原理类似),这里我们修改mifgsm函数。在medium baseline中,我们随机挑选了一些代理模型,这样很盲目,根据文章Query-Free Adversarial Transfer via Undertrained Surrogates(https://arxiv.org/abs/2007.00806)描述,可以选择一些训练不充分的模型,训练不充分的意思包括两方面:一是模型的训练epoch少,二是模型在验证集(val set)未达到最小loss。我们依据论文中的一个例子,使用https://github.com/kuangliu/pytorch-cifar中的训练方法,选择resnet18模型,训练30个epoch(正常训练到达最好结果大约需要200个epoch),将其加入ensmbleNet中。攻击后的精度和loss:ensemble_mifgsm_acc = 0.00, emsemble_mifgsm_loss = 12.25672。可以尝试更多的undertrain model来加强攻击。
# TODO: Momentum calculation
grad = x_adv.grad.detach()
grad = decay * momentum + grad/(grad.abs().sum() + 1e-8)
momentum = grad
x_adv = x_adv + alpha * grad.sign()
Boss Baseline (acc <= 0.15)
方法:DIM-MIFGSM + Ensemble Attack(pick right models)。相对于strong baseline,我们将mifgsm替换为dim-mifgsm,后者在前者的基础上,对被攻击图片加入了transform来避免overfitting。该技巧来自于文章Improving Transferability of Adversarial Examples with Input Diversity(https://arxiv.org/pdf/1803.06978.pdf),文章中的transform是先随机的resize图片,然后随机padding图片到原size,我们在mifgsm函数的基础上写dim_mifgsm函数,后者添加的部分代码如下。在攻击中,使用gen_adv_examples函数调用emsebel_model和dim_mifgsm,攻击后的精度和loss:ensemble_dmi_mifgsm_acc = 0.00, emsemble_dim_mifgsm_loss = 13.71190。
if torch.rand(1).item() >= p:
#resize img to rnd X rnd
rnd = torch.randint(29, 33, (1,)).item()
x_adv = transforms.Resize((rnd, rnd))(x_adv)
#padding img to 32 X 32 with 0
left = torch.randint(0, 32 - rnd + 1, (1,)).item()
top = torch.randint(0, 32 - rnd + 1, (1,)).item()
right = 32 - rnd - left
bottom = 32 - rnd - top
x_adv = transforms.Pad([left, top, right, bottom])(x_adv)
作业十答案获得方式:
关注微信公众号 “机器学习手艺人”
后台回复关键词:202210