©PaperWeekly 原创 · 作者|孙裕道
学校|北京邮电大学博士生
研究方向|GAN图像生成、情绪对抗样本生成
论文标题:DeepFool: a simple and accurate method to fool deep neural networks
论文链接:https://arxiv.org/abs/1511.04599
引言
Deepfool 是一种经典的对抗攻击方式,它首次对样本鲁棒性和模型鲁棒性镜进行了定义,并且它可以精确计算深度分类器对大规模数据集扰动,从而可靠地量化分类器的鲁棒性。该论文通俗易懂,并且有大量细节丰富的图示,有高中的代数知识基本上就能看懂算法的核心原理。本文会对 Deepfool 算法的原理进行详解,最后一部分是对 Deepfool 核心代码的解读。
本文的贡献可以归结如下三点:
-
作者提出了一种新的计算对抗样本的方法 DeepFool,该方法是基于梯度迭代方法中生成扰动最小的,并且能有较高的攻击准确率。
-
作者用对抗样本增加训练数据,显著提高模型对对抗扰动的鲁棒性,该部分贡献对抗训练的前期研究。
-
作者分析了 FGSM 算法来验证分类器的鲁棒性的不合理性,并提出该算法会过分的评估分类器的鲁棒性,并定义了什么是样本鲁棒性,什么是模型的鲁棒性。
给定一个分类器,样本鲁棒性是使得模型出现误分类的最小扰动,具体形式如下:
其中,
为干净的样本,
为模型预测的标签。
为样本
在模型分类器
的鲁棒性。进而作者又定义出了模型在整个数据集上的鲁棒性,具体形式为:
这是一种期望的形式。这里有一个困惑,如果让我自己来定义模型的鲁棒性具体的形式为:
即表示所有样本鲁棒性的期望。但是作者的这种定义是在分母中都除以一个样本的 2 范数,作者的模型鲁棒性的定义与我理解的模型鲁棒性的定义的优劣需要日后验证。模型鲁棒性是更好地理解当前网络体系结构的局限性和设计增强健壮性的方法的关键。
3.2 DeepFool攻击二分类器
该论文写作方式是由浅入深,先介绍了 DeepFool 攻击二分类器的算法。
上图为对抗样本攻击线性分类器的图示。
其中
为一个二分类器。
为干净样本点
的最短距离,即为样本点
在分类器
中的鲁棒性。
为分类超平面。
为了更好的理解上图对抗样本攻击二分类器的原理,我重新画了一个图来对其进行解释。如下图所示,在二维平面中,有一条直线
和一个点
,其中直线的法向量为
,由高中的点到直线的距离知识可知点
到直线
为:
如果点
移动到直线的移动的位移为(需要注意的是位移带方向):
当从二维二分类器扩展到多维二分类器即为论文中所给出的公式:
上面目标函数可以通过迭代的方式来进行求解以获得最小对抗扰动,可以重新转换成如下的优化形式:
下图示对算法的生动的解释,以 n=2 为例,
,绿色平面是
点处的切平面为
,则此时会投影出现迭代点
,然后依次类推,最终将所有的扰动综合起来即为所求的对抗扰动。
3.3 DeepFool攻击多分类器
介绍完 DeepFool 攻击二分类器,这一节介绍有关 DeepFool 攻击多分类器。分类器预测标签如下公式所示:
其中,
是预测概率向量
的第 k 类的概率分量。多分类器模型误分类的优化函数如下所示:
为了更好的理解以上优化形式的含义,自己做了一个图示便于理解。如下图所示,左半部分是干净样本的概率向量的输出,预测的类别为
,加入对抗扰动后,预测类别变成了
。
如下图实例所示,已知一个四分类器,干净样本
被分为第四类中。
是分类的边界超平面。绿色区域为一个凸区域可以表示为:
根据高中的点到直线的距离公式,可以推算得知点
到三条边界最短的距离的计算公式为:
与 DeepFool 攻击二分类器相似,则多分类器的对抗扰动为:
综合以上 DeepFool 攻击多分类器模型的原理获得如下的算法流程:
作者在 MNIST、CIFAR-10 和 ImageNet 图像分类数据集上训练的深度卷积神经网络架构上测试 DeepFool 算法。下表显示了使用不同方法计算的每个分类器的精确度和平均鲁棒性。并且还展示了每种方法计算一个对抗性样本所需的运行时间。可以看出,DeepFool 估计的扰动比用其它方法计算的要小,并且运行的时间更短。
下表给出的是 DeepFool 和 FGSM 攻击的平均扰动情况,会发现 DeepFool 的平均扰动要远小于 FGSM,这就印证了 FGSM 过分的评估了分类器的鲁棒性。
下图表示的是不同微调策略中平均对抗扰动的变化情况,DeepFool 生成的对抗样本的经过微调显著提高了网络模型的鲁棒性,其中 MNIST 网络的鲁棒性提高了 50%,NIN 的鲁棒性提高了约 40%。
代码解读
5.1 对抗样本库介绍
DeepFool 的源码是来自于 torchattacks 轻量级的对抗样本库,调用 API 方法很简单库中经典的对抗攻击方法有 FGSM,BIM,RFGSM,CW,PGD,DeepFool 等。下载命令:pip install torchattacks。
5.2 DeepFool代码解读
DeepFool 攻击是一种基于迭代的攻击方法。如下图所示,DeepFool 类包含两个方法,一个是超参数的初始化,另一个生成对抗样本。
-
self.steps = steps:DeepFool 迭代的次数,默认值为 3。
-
image = images[b:b+1, :, :, :]:取出 batch 中的一张图片。
-
output = self.model(image)[0]:返回该图片的预测标签向量。
-
_, pre_0 = torch.max(output, 0):返回预测向量的最大值的索引。
-
f_0 = output[pre_0]:返回预测向量的最大值。
-
grad_f_0 = torch.autograd.grad(f_0, image):求出预测向量的最大值对图片的梯度。
-
num_classes = len(output):表示图片类别的数量。
接下来进入 DeepFool 代码的核心部分,会结合论文中的算法进行讲解。
-
if pre != pre_0::程序的终止条件,如果预测标签与原标签不符合,就输出对抗样本。
-
f_k = output[k]:计算每一个类别的预测向量的分量。
-
grad_f_k = torch.autograd.grad(f_k, image):求出每一个类别中预测向量的分量对图片的梯度。
-
f_prime = f_k - f_0:表示原论文中的分量差值:
-
grad_f_prime = grad_f_k - grad_f_0:表示原论文中的梯度差值:
-
value = torch.abs(f_prime)/torch.norm(grad_f_prime):为原论文中扰动量分量模长的求法:
-
r = (torch.abs(f_prime)/(torch.norm(grad_f_prime)**2))*grad_f_pre:为 DeepFool 生成的对抗扰动:
image = torch.clamp(image + r, min=0, max=1).detach():DeepFool 生成的进行截断的对抗样本。
如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。
总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。
PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学习心得或技术干货。我们的目的只有一个,让知识真正流动起来。
📝 来稿标准:
• 稿件确系个人原创作品,来稿需注明作者个人信息(姓名+学校/工作单位+学历/职位+研究方向)
• 如果文章并非首发,请在投稿时提醒并附上所有已发布链接
• PaperWeekly 默认每篇文章都是首发,均会添加“原创”标志
📬 投稿邮箱:
• 投稿邮箱:hr@paperweekly.site
• 所有文章配图,请单独在附件中发送
• 请留下即时联系方式(微信或手机),以便我们在编辑发布时和作者沟通
🔍
现在,在「知乎」也能找到我们了
进入知乎首页搜索「PaperWeekly」
点击「关注」订阅我们的专栏吧
关于PaperWeekly
PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。