对抗样本是一个顽固的问题,研究如何克服它们可以帮助我们避免潜在的安全问题,并且会让深度学习算法对所要解决的问题有一个更准确的了解。百度安全实验室为PaddlePaddle平台贡献了对抗样本工具包Advbox,便于平台的开发者、使用者更好地发现和降低模型健壮性的风险敞口,守护AI安全。
1.背景
2014年,科学家 Szegedy 发表了一篇论文:《intriguing properties of neural networks》,在论文中,研究者首先提出来了“对抗样本”的概念,这种对抗样本扮演攻击的角色、试图用来引发模型出错。攻击者可以在正常数据输入的基础上精心构造足够小的扰动,生成对抗样本。对抗样本在难以被肉眼或者常用统计方法所检测到的同时,能够导致AI模型以较高的置信度输出错误的分类(non-targeted attack),或者错误分类为攻击者指定的目标类别(targeted attack)。
对抗样本的存在,将威胁深度神经网络在实际业务和物理场景中的应用。举两个例子:
熊猫和长臂猿
左图被神经网络以60%的置信度将它识别为“熊猫”,然后给它人为叠加上中图所示微小的扰动(实际叠加权重只有0.7%),得到右图。在人类看来,几乎没有什么变化,但人工智能却以99.3%的置信度识别为“长臂猿”。
山地车和蟑螂
正常情况下,inception v3[1]模型将上左侧图片识别山地车(上右),通过加入肉眼无法区分的扰动构成对抗样本(下左侧的图片),被inception v3模型以高置信度识别成蟑螂(下左)。
对抗样本在多种机器学习、深度学习模型中广泛存在。并且对抗样本存在显著的迁移特性,即同一模型(白盒)的不同实例间(不同的超参数)可以使用对抗样本进行迁移,不同模型(黑盒)间同样能够被对抗样本迁移攻击。对抗样本存在潜在危险性。比如,攻击者可能会用贴纸或者一幅画做一个对抗式「停止(stop)」交通标志,将攻击对象瞄准自动驾驶汽车,这样,车辆就可能将这一「标志」解释为「放弃」或其他标识,进而引发危险。
为了防卫对抗样本,保证人工智能安全,以及利用生成的对抗样本加固模型,目前主流的深度学习平台均提供了对抗样本生成的工具包。百度安全实验室为PaddlePaddle贡献了对抗样本工具包Advbox,相较于其他深度学习平台对抗样本生成的工具包,Advbox在代码结构、易用性和参数调优上都更有优势。目前Advbox已经在github[2]上随PaddlePaddle一起开源,Advbox对抗样本工具包能够为研究者深入开展研究提供极大的便利,研究者和开发者可以高效地使用最新的生成方法构造对抗样本数据集用于对抗样本的特征统计、攻击全新的AI应用抑或是加固业务AI模型。
2.Advbox工具包
Advbox的目的
作为测试深度学习模型抵御对抗样本的健壮性基准。
通过生成的对抗样本加固现有的模型(对抗训练)。
作为对抗样本研究的工具包。
Advbox的核心功能
Advbox主要分成以下几个模块:
Attack:attack class定义了攻击方法的接口,后面所有攻击方法都继承Attack基类,实现相应的接口。
Model:model class表示深度学习的模型,定义了模型相关的接口。
Adversary:adversary class包含初始图像,以及生成的untargeted或者targeted对抗样本。
3.Advbox相关算法介绍
目前Advbox支持FGSM,BIM,JSMA和DeepFool等方法,后续将会有更多的攻击方法(如L-BFGS[10], Carlini/Wagner[11])加入。
FGSM算法
FGSM由Goodfellow等研究者于2015年提出,他们试图从AI模型的线性角度解释对抗样本存在的原因。假设线性模型权重参数为w,输入为n,扰动为,则新的输出为。这样一来,激活函数输入就相较原始输入增加了。如果权重w的量级为m,其维度为n,扰动最大值为ε,那么对抗样本对激活函数造成的影响即为
,随着维度n的增加,扰动给激活函数输入带来的增量也相应增大,最终将会改变激活函数的输出值。
作者认为目前大部分深度神经网络的激活函数都采用ReLU而不再是sigmoid函数,越来越多的线性被引入导致了对抗样本的存在。基于这一假设,作者提出了FGSM用于生成对抗样本,采用Linfinity作为范数约束,对于非指定目标攻击,其构造目标函数为;对于指定目标攻击,目标函数变化为。直观上来看,损失函数对于输入x的梯度是损失函数变化最快的方向。在非指定目标攻击场景下,沿着梯度方向增加像素值将会使得原始类别标签的损失值增大,从而降低模型判定对抗样本为原始类别的概率;在指定目标攻击场景下,沿着梯度相反方向增加像素值将会使得指定目标类别标签的损失值减小,从而增加模型判定对抗样本为指定目标类别的概率。
同时在论文中,作者还首次揭示了对抗样本的分布特征,即对抗样本往往存在于模型决策边界的附近,在线性搜索范围内,模型的正常分类区域和被对抗样本攻击的区域都仅占分布范围的较小一部分,剩余部分为垃圾类别(rubbish class),如图2-1所示。
图2-1 对抗样本的分布
左图展示了在一张输入样本上变化ε,mnist10个类别每个类别对应softmax层参数的变化。这张图片的正确类别是4。右图是生成曲线的输入,黄色框中表明了正确分类的输入,黄色框左上角对应负ε,右下角对应正ε。每个类别对应的非规范化的对数概率明显与ε分段线性相关,而且在广泛的ε范围内错误的分类比较稳定。
BIM算法
2017年Google Brain的Kurakin等研究者在FGSM的基础上提出了BIM用于快速生成对抗样本。BIM实际上是一个迭代版的FGSM,同样采用Linfinity作为范数约束。
对于非指定目标攻击,作者在每次迭代中使用FGSM生成对抗样本,并加入clip函数用于图片归一化的值域回归,即:
对于指定目标攻击,作者在迭代中采用类似的方法,即:
在实际生成对抗样本的过程中,作者建议值为1。直观上,BIM与FGSM一样方便理解,同时简洁高效,攻击效果显著优于FGSM。后续有很多BIM的变种[6],都有着不俗的攻击效果。
不过后续研究表明,基于迭代的方法有相对较差的迁移性,使得进行黑盒攻击的效果变差。而只有一步的基于梯度的方法虽然白盒攻击的效果不好,但是能产生更具迁移性的对抗样本。
DeepFool算法
DeepFool[4]由EPFL的Moosavi-Dezfooli等研究者于2015年提出,收录于2016年CVPR会议中。作为一种白盒对抗样本生成方法,DeepFool原理上由二分类模型出发,计算最小扰动距离为当前输入点到分割超平面的最短距离,推导出二分类任务下的扰动生成方法,并从二分类推广至多分类。DeepFool使用L2范数约束,对抗样本生成效果优于FGSM与JSMA方法,在当时是比较先进的攻击方法。
JSMA算法
2016年Papernot等研究者基于L0的范数约束,提出了指定目标攻击的JSMA[7]方法用于生成对抗样本。JSMA旨在尽可能减少需要改变的像素点,目标是找到整幅图片中对指定目标具有利的最大显著性像素点,通过改变该像素值的大小,实现基于单像素点的对抗样本生成。
作者构造了显著性列表(saliency map)用于搜索最佳像素点,如公式2-1所示,当像素点对指定目标类别的偏导数小于0时,增加该像素点的像素值将导致指定目标类别的得分函数值降低;当该像素点对其它类别的偏导数和大于0时,增加该像素点的像素值将导致其它类别的得分函数值增大,等价于降低了指定目标类别的得分函数值。这样的像素点对指定目标不利,不属于最佳像素点。相反,当像素点对指定目标类别的偏导数大于0或者对其它类别的偏导数和小于0时,增加该像素点的像素值将有利于模型判定为指定目标类别,显著性最大的像素点即为JSMA所要搜索的像素点。在实际的对抗样本生成中,由于单像素点的约束过强,作者建议放宽至两个像素点对的生成上,如公式2-2所示。
公式2-1 JSMA显著性列表计算公式
公式2-2 像素点对的显著性列表计算
作者在MNIST数据集上使用JSMA生成了对抗样本,如图2-1所示。我们可以看到,对角线上的图片为原始图片,在L0的范数约束下,肉眼较容易地区分对抗样本与原始图片的差别。
图2-2 JSMA在MNIST数据集上生成的对抗样本
4.Advbox攻击步骤
Advbox目前实现的方法都是基于白盒的攻击。我们在mnist数据集上训练了简单的cnn模型,训练的准确率达到了98%。然后在此模型上进行了untargeted攻击,选取了mnist的测试集10000张图片。分别使用了FGSM和BIM进行攻击,攻击成功率分别达到了97.6%和99.98%。下面以mnist举例,
(1)首先要训练一个模型并保存模型参数。
fluid.io.save_params(exe,"./mnist/", main_program=fluid.default_main_program())
(2)然后加载模型的参数还原模型。
fluid.io.load_params(exe,"./mnist/", main_program=fluid.default_main_program())
(3)利用还原的模型,构造一个PaddleModel对象。
m= PaddleModel(fluid.default_main_program(), IMG_NAME, LABEL_NAME,
logits.name, avg_cost.name, (-1,1))
(4)选择一种攻击方法,比如GradientSignAttack(FGSM),将PaddleModel作为参数传给GradientSignAttack。
att= GradientSignAttack(m)
(5)把image和label作为参数传入4中的attack对象中,则进行攻击,生成对抗样本保存在返回值Adversary中。
adversary= att(Adversary(data[0][0], data[0][1]))
end
Advbox的github地址如下:https://github.com/PaddlePaddle/models/tree/develop/fluid/adversarial
期待有更多开发者和研究者加入到PaddlePaddle平台中来,共同丰富和完善PaddlePaddle平台的安全生态,也欢迎贡献自己最新的对抗样本检测、生成或防护算法,验证评估后我们也会及时更新至Advbox中。
【参考资料】
[1] ChristianSzegedy, VincentVanhoucke, Sergey Ioffe,et al. Rethinking the Inception Architecture for Computer Vision, 2015.
[2]https://github.com/PaddlePaddle/models/tree/develop/fluid/adversarial
[3]Ian J.Goodfellow,JonathonShlens, ChristianSzegedy. Explaining and Harnessing Adversarial Examples, 2014.
[4] AlexeyKurakin, IanGoodfellow, Samy Bengio.Adversarial examples in the physical world, 2016.
[5]Seyed-MohsenMoosavi-Dezfooli,AlhusseinFawzi, PascalFrossard. DeepFool: a simple and accurate method to fool deep neuralnetworks, 2015.
[6]Yinpeng Dong, Fangzhou Liao, Tianyu Pang,et al. Boosting Adversarial Attacks with Momentum, 2017.
[7] NicolasPapernot, PatrickMcDaniel, Somesh Jha,et al. The Limitations of Deep Learning in Adversarial Settings,2015.
[8]http://staging.paddlepaddle.org/docs/develop/documentation/en/design/fluid.html
[9] https://github.com/tensorflow/cleverhans
[10] Pedro Tabacof, Eduardo Valle.Exploring the Space of Adversarial Images, 2015
[11] NicholasCarlini, David Wagner.Towards Evaluating the Robustness of Neural Networks, 2017
*感谢 姜辉 对本文的校审
领取专属 10元无门槛券
私享最新 技术干货