神经网络中的对抗攻击与对抗样本

什么是对抗攻击

初识神经网络会惊叹它的神奇,在不了解的情况下我相信很多人会好奇它为什么可以成功,这种好奇中其实还隐藏着一种担忧——面对这样一个黑盒子如果不能有一个合理直观的解释,又怎敢放心使用这项技术?无论是在网络还是操作系统领域,现实应用中我们或多或少对网络攻击和病毒软件都有所耳闻,那么在神经网络这一领域是否存在类似的威胁?果不其然,偶然看到一篇介绍『一像素攻击』的文章,引发了我对老本行『安全』领域的兴趣,于是研究了一下在计算机视觉方面深度学习中的对抗攻击。

我们先用最直观的方式认识一下什么是对抗攻击?如上图,左边是一张能够被GoogLeNet正常分类为熊猫的图片,在添加一定的噪音后变成右图,在人的肉眼看来,它还是熊猫,但GoogLeNet会判定为长臂猿。这种被修改后人类无法明显察觉,却被机器识别错误的数据即为对抗样本,而这整个过程就可以理解为对抗攻击。

什么情况?这么容易就被骗去了?这也太脆弱了,要是稍作修饰岂不是可以骗过人脸识别伪装人其他人?自动驾驶的汽车认错路牌岂不是很危险?类似的现实世界中的试验和研究也接踵而至,这些攻击并不只存在于实验室中,以路标为例,对同样的路牌稍作改动,加几个便签便可以让『停止』路标被识别成『限速45』。

我最开始的反应也是这样惊讶,但事实就是这样。仔细想来,其实人的视觉也经常会出现错觉,我相信你一定看到过类似下面这个动图一样欺骗你的图片或视频。存在即合理,人类的视觉尚且如此,在没有深入了解神经网络的情况下,什么样欺骗机器的样本其实都应该是很合理的存在。接下来,我们就了解一下对抗攻击和对抗样本出现的来龙去脉。

对抗攻击的来龙去脉

2013年,Google研究员Szegedy等人在题为《Intriguing properties of neural networks(神经网络有趣的特性)》的论文中指出了神经网络的两个有趣的特性:其一是神经网络中包含语义信息的部分并不是在每个独立的神经元,而是整个空间;其二是神经网络学习到的从输入到输出的映射在很大程度上是不连续的。这篇论文更重要的意义是验证了将图片做适当修改后能欺骗深度学习模型的可能性,并给出了相应的训练方法,从此学术界展开对对抗攻击的进一步研究,各种有关攻击方式和攻击原理的论文纷至沓来,详见最近的一篇总述性论文《Threat of Adversarial Attacks on Deep Learning in Computer Vision: A Survey》,以下简称『Survey』。

个人认为其中影响力最大的当属GoodFellow等人2014年发表的《Explaining and harnessing adversarial examples》,中文常翻译为『对抗性例子的解读和掌握』,文中提出了产生对抗攻击根本原因的猜测——深度神经网络在高纬空间中的线性特性已经足以产生这种攻击行为——而非之前人们猜测的神经网络的复杂性,同时在这个假设前提下提出了一种更高效制造对抗样本的方法,并通过实验加以验证,实验结论表明:一个测试效果良好的分类器,其实并不像人类一样学习到了所分类样本的真正底层意义,只不过刚好构建了一个在训练数据上运行相当良好的模型,而这个模型实际上就像是一个富丽堂皇的假象,当遇到一些空间中不太可能出现的点时,模型能力的有限性就会随之暴露出来。

其他的攻击样本训练方式个人还没有精力去研究,但我觉得基本思想大同小异,这里也不一一展开,上面的两篇论文更具有代表性,就用Survey中的一张表格做个简单说明,这张表格将这些攻击方法按时间排序,并结合相关特性做了一个对比。其中,黑/白盒表示是否需要有训练模型的先验知识,如训练用的网络结构、参数、超参数、训练样本等,黑盒攻击可以在完全不知道或仅知道有限知识的条件下完成攻击,目标分类针对性表示的是对于攻击样本的目标分类是否有指向性还是仅仅使其预测错误即可,图片针对性表示攻击方式是否跟特定的图片有关,扰动范式指的是对噪音的限制计算方式,这一定程度上决定了对抗样本的最终形态,例如 L0 扰动范式在极端情况下就会出现文章开头提到的『一像素攻击』,这种攻击样本在现实世界中更容易构造,而 L1 和 L∞ 扰动范式则会对图像的全局范围进行扰动,人类视觉更难明显发现,学习方式分为单次和逐渐迭代,最后的强度表示攻击强度。

如何理解对抗攻击

Szegedy等发现的两个有趣特性以及GoodFellow等的高维空间线性特性猜测都可以认为是产生对抗攻击的根本原因,那么如何理解呢?

2014年,天才少年Christopher Olah在一篇博客中将神经网络,流形与拓扑联系在一起对比,虽说可能没那么恰当,但这篇文章确实在更低的纬度帮助我进一步理解了Szegedy论文中的两个有趣特性。接下来我将这篇文章的前半部分用尽可能少的篇幅分稍作总结,希望能帮助大家更容易的理解这两个特性。

我们知道在神经网络中每层神经元的输入 a = g(Wx+b),其中 g 为激活函数,W 为权重参数,x 为上一层的样本数据,b 为偏置参数,那么从拓扑学角度来看,在一个二维平面上,这个过程相当于哪几个步骤呢?

一次使用权重参数矩阵 W 的线性变换

一次使用偏执向量 b 的移动

一次应用非线性激活函数 g 的变换

在二维平面上,其实是将整个平面进行了旋转、移动和拉伸这三个操作。下面通过文中的几个分类问题进行说明以帮助理解。

对于较简单的分类问题,可能一层神经网络就可以完成分类,通过变换空间布局,最终通过一条直线完成分类。

而对于较为复杂的螺旋缠绕分类,也可以通过多几次的变幻完成将问题转换为一条直线可分割的空间,过程见下面的动图。

至此,我们可能从较低的纬度下更直观的理解了训练好的神经网络所做的事情。但是对于如下图所示的圆套圆的情况,我们很难在二维空间将其拉伸到理想的位置。

但是,通过增加神经元,我们可以在三维空间中轻松将其分离。

至此,我们可能会觉得再复杂的问题应该都能通过类似的方法解决,只不过过程可能更复杂更长,这种猜测有可能是对的。但是对于下面的这种两个相互套起来的环,可能需要在四维空间中才能完全分开,然而我们已经很难去想象,更不要说在真实世界的数据集中,这种死结或者缠绕问题很可能会更复杂。

不过对于神经网络来说,完全可以避重就轻去将打成死结的数据尽可能拉伸开,而不是完全解开,如下图,这对于分类问题来说,其实已经有了足够高的准确率和召回率。当然从另一个角度看的话,有些情况下,为了更精确地分类,较宽的神经网络可能相对深度来说更重要。

回到我们要理解的问题上,这可能会略显牵强,也可能我的理解会有错误,但确实给我个人带来更多直观上的认知:

神经网络中包含语义信息的不在每个独立的神经单元,而是整个空间。神经网络在最后一层能将样本中这么多变化的因子理清楚并理解其语义,并不是因为某个独立神经元中包含了什么特定的语义,而是对整个空间进行变换后从最终的表征层中学到的,经过学习,神经网络会放大某些相关因子,同时缩小某些无关因子。

神经网络学习到的输入到输出的映射在很大程度上是不连续的。就像上面图中为了解开一个死结所做的拉伸结果一样,肉眼来看,在拉伸距离较大的地方我们可以认为这种映射是连续的,然而对于仍然缠绕在一起的部分,之前可以用来划分界限的直线或者超平面已经无法连续,虽然可以通过仔细观察区分出来,但是我们要知道这只是一个简单的例子,现实世界中的真实数据可要比这复杂得多,对于我们的肉眼来说可能很难分清楚缠绕在一起的部分。于是,对抗样本的出现也就容易理解得多,即,对于神经网络来说,对抗样本已经严重的跨过了用于分类的界限,而对于肉眼其实还看不出来它有移动。

Szegedy等的发现证明了这种攻击的存在,并且提出了可以通过 Box-constrained L-BFGS优化算法找到对抗样本的途径。但是如何抵御这种攻击呢?一个直观的方法是将这种对抗样本加入到训练集中去训练模型,并且实验表明虽然不能完全解决问题,但这种方法是有效的,那么如何找到更多的对抗样本呢?要知道在当时想生成这种对抗攻击也是需要相当大的计算量的,更不要说生成更多的样本去训练验证。前面提到GoodFellow的论文指出深度神经网络在高纬空间中的线性特性已经足以产生这种攻击行为,并提出了一种更高效生成对抗样本的方法,接下来我们就简单分析一下这一理论和方法。

GoodFellow提出的这种方法的根基是目前神经网络为了提高训练效率所使用的激活函数在局部都过于线性,怎么理解呢?看图,在局部看来确实接近直线。

这与前面我们看到的Olah对神经网络与拓扑学的对比中有些类似,在最后的表征层都是通过直线或超平面完成的分类,既然是在线性的假设下,我们暂且不通过二维或三维空间来理解,先从一个简单的数学公式角度看看。

其中 w 是训练好的参数向量,x 表示真实样本数据向量,η 表示给图像加入的噪音向量,x̄ 表示加入噪音后新生成的样本,当加入足够小的η时,肉眼无法区分出 x 的变化,直观上左边的式子可能也不会变化很大, 然而η当的方向与 w 完全一致的时候,即使很小,也会使整个激活值变化很大,有多大呢?如果 w 是一个 n 纬向量,而其权值的平均大小为 m,那么激活值将会增加 nm。可见,在一个肉眼几乎无法差觉的扰动干扰下,对神经网络最终激活层的计算会产生巨大的干扰,从而迷惑神经网络训练出来的模型。

我们前面提到当η与 w 的方向一致时会使激活值最大,那么,如何找到这个正确的方向呢?先给出结论,那就是损失函数在待构造样本上的梯度方向,即下面的式子,其中,ε 是一个调节系数,sign() 是一个符号函数,代表的意思也很简单,就是取一个值的符号,当值大于 0 时取 1,当值等于 0 时取 0,当值小于 0 时取 -1,▽表示求 x 的梯度,可以理解为偏导,J 是训练模型的损失函数。

怎么理解这个结论呢?首先我们看一下在正常的神经网络模型训练过程中,有一个过程叫反向传播,就是对参数求偏导,然后将参数更新,我们结合下面这张图看一下。

假设图中的函数即为损失函数,为了使损失函数降到最低,我们会根据当前值的梯度去调整,当梯度小于 0 的时候我们可以看出,当前值需要右移,而当梯度大于 0 的时候,当前值需要左移,这个过程实际上就是用 θ 减去 ∂θ。扩展到损失函数 J(θ, x, y)中,θ即为我们要调整的参数,因此在样本 x 和 y 不改变的情况下,我们会不断去调整参数θ以寻求局部最优解,即θ =θ - ∂θ。

现在如果我们想生成对抗样本,也可以采用类似的方法,那就是固定参数θ,调整 x 同时使损失函数增大,而不是变小,此时就应该让 x 往相反的方向走,即x̄ = x +∂x,这样是不是很容易可以理解上面η的定义呢?在实践中,我们还需要通过ε这个参数来调节噪音的大小,这种方法相比之前提到的优化方法非常高效,基本只需要一次计算就可以找到对抗样本,因此作者将这种方法叫做快速梯度符号法(Fast Gradient Sign Method,FGSM)。用GoodFellow在CS231中的PPT来总结一下FGSM,这种方法通过替换目标值

就可以让攻击样本朝着指定的分类目标走,即,可以做任意目标的欺骗。

其实不难发现,如果将GoodFellow的这种线性假设简化到二维空间,我们要求的η其方向正好就接近于参数 w 的方向,这里不再展开说明,有兴趣的读者可以自行画一画。

我们到目前为止的推导看起来一切理所应当,但是别忘了我们还建立在一个高维空间线性的假设或猜测前提下,还是需要实验支撑的,不多说,直接上图。

解释一下这张图,这张图是对数据集CIFAR-10的分类器的决策边界示意图,其中每个小格子代表的是不同的CIFAR-10样本,每个小格子中,横向从左往右代表的是FGSM算法中的梯度方向,纵向代表的是FGSM梯度方向的正交方向,白色表示模型能分类正确的情况,而彩色代表预测出错的情况,不同的颜色代表不同的错误预测分类。可以明显看出,在出错的区域都程线性分布,另外,如果横轴的方向走的不够远,即便再往其他方向走都无法使模型出错,而一单进入这个区域,就会出现大量的对抗样本。而在随机找到的对抗样本中,这种分布也是很随机的,甚至很难找到,见下图。

至此,从实验结果上也表明高维空间中的线性假设也是合理的,GoodFellow及其同事还专门开发了一个开源的攻击库CleverHans,FGSM方法的实现也在里面,代码很短。关于CleverHans,也就是题图,说起来也很有趣,一匹叫做 Clever Hans 的马,刚出现的时候人们认为这匹马会做算术,但实际上它只是会阅读人的表情,当它点马蹄的次数接近正确答案时,人们的表情会更兴奋,它就知道该这个时候停止了。这个项目的名字现在看起来其实是在隐喻神经网络,一个测试效果良好的分类器,其实并不像人类一样学习到了所分类样本的真正底层概念,只不过刚好构建了一个在训练数据上运行相当良好的模型,所以,你以为你以为的就是你以为的吗

但是,无论是Szegedy还是GoodFellow提到的方法,都是一种白盒方法,即,我们完全了解模型的网络结构、参数、超参数以及训练的数据集等等,那么正常情况下攻击者在面对一个黑盒的时候应该束手无策了吧,所以并没有什么威胁。然而事实上并非如此,『Survey』中提到的很多方法都具有迁移性,GoodFellow对此的解释是分类器能够在训练集的不同子集上训练时获得大致相同的分类权重,因为机器学习算法能够泛化, 基础分类权重的稳定性反过来又会导致对抗性样本的稳定性。因此,对抗攻击可以认为是存在于任何神经网络模型。

如何防御对抗攻击

既然问题这么严重,那么如何防止这种攻击呢?目前来看还没有能够完全抵抗这种攻击的方法,其实结合攻击的原理也不难看出,即便分类器做得再好,总能使一个样本用最小的干扰走到错误的分类区域,我们能做的更多是如何构造鲁棒性更强的模型,同时也保持对这个领域的关注。『Survey』中总结的目前抵御攻击的办法可以分为三大类:

修改训练样本,前文提到过的,通过添加更多的对抗样本到训练集中可以有效避免一部分攻击,但这更像是一种无奈的做法,当扩大样本集的时候,其实分类边界有可能也在随之扩大。

修改训练网络,这类方法会对训练网络做出一定调整,其中有一种方式是模拟生物学在最后一层使用更加非线性的激活函数,但这种方式又会导致训练效率和效果下降。修改训练网络的方法分为完全抵抗和仅检测两种方式,完全抵抗其实就是让模型能将对抗样本识别为正确的分类,而仅检测是为了发现这种攻击样本,从而拒绝服务。

附加网络,这种方式是在不改变原有模型的情况下使用额外的网络进行辅助,这样可以使原有网络保持不变,其中最有效的一种方式是生成式对抗网络——GAN。同样的,这种方式也分为完全抵抗和仅检测两种方式。

总结

这篇文章的主要目的是总结和分享对对抗攻击的一些原理的理解,而对于防御方法,虽然目前没有什么定论,但个人认为也不必过于担心,从计算机和互联网诞生开始,攻击就无处不在,防御方法也不断升级,如果你对ROP或者DDOS等一些攻击有所了解,你就会发现,道高一尺,魔高一丈,本来就是矛与盾的关系,毕竟哪有什么真正的安全,然而事实表明这并不会阻碍计算机和互联网行业的蓬勃发展。目前为止,我认为我们能做的只有两点:一是关注该领域的发展动向,二是做好针对此类攻击的风险控制。

参考汇总

Akhtar, N., & Mian, A. (2018). Threat of Adversarial Attacks on Deep Learning in Computer Vision: A Survey. IEEE Access, 1–1. http://doi.org/10.1109/ACCESS.2018.2807385

Szegedy, C., Zaremba, W., Sutskever, I., Bruna, J., Erhan, D., Goodfellow, I., & Fergus, R. (2013, December 21). Intriguing properties of neural networks. https://arxiv.org/abs/1312.6199

Goodfellow, I. J., Shlens, J., & Szegedy, C. (2014, December 20). Explaining and Harnessing Adversarial Examples. https://arxiv.org/abs/1412.6572

Adversarial Examples and Adversarial Training. CS231. https://www.youtube.com/watch?v=CIfsB_EYsVI&list=PL3FW7Lu3i5JvHM8ljYj-zLfQRF3EO8sYv

Neural Networks, Manifolds, and Topology:http://colah.github.io/posts/2014-03-NN-Manifolds-Topology/

cleverhans blog:http://www.cleverhans.io

How Adversarial Attacks Work:https://blog.ycombinator.com/how-adversarial-attacks-work/

Adversarial Attacks and Defences for Convolutional Neural Networks:https://medium.com/onfido-tech/adversarial-attacks-and-defences-for-convolutional-neural-networks-66915ece52e7

Adversarial Training-Fast gradient sign method: https://zhuanlan.zhihu.com/p/25462317

Adversarial examples in deep learning:https://towardsdatascience.com/adversarial-examples-in-deep-learning-be0b08a94953

对抗样本与对抗训练:http://blog.csdn.net/cdpac/article/details/53170940

忽悠神经网络指南:教你如何把深度学习模型骗得七荤八素:http://36kr.com/p/5091556.html

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180328G042KG00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券