
在生活中,机器学习模型常用于甄别不好的东西,比如垃圾邮件或恶意软件的检测等,这样就可能有不法分子千方百计想要骗过训练好的模型。
拿图像分类来说,如果我们想攻击一个训练好的图像分类器,就可以改变一张图片中的某些像素点的值,使得改变后的图片和原图片肉眼看不出太大分别,但使得分类器结果发生改变。

具体来说,攻击可以分为有目标的攻击和无目标的攻击,有目标的攻击就是我想把一张图片的分类结果变成某个特定的类,无目标攻击则是只要分类结果和原来不同即可。

这两种攻击方法的思路其实和神经网络的训练很相似,那有目标的攻击来说,先把损失函数设定为网络输出和目标类别的相似度减去输出和真实类别的相似度,也就是说输出结果越接近目标类别且远离真实类别就越好。然后我们固定训练好的网络的参数,对输入进行调优得到结果。
注意这里有一个约束条件:改变后的图片和原图差别不能太大。这个距离度量可以有很多选择,这里我们举了的例子:

可以看到,度量图片的差异性时使用效果是不太好的,因为图中四个像素都作微笑改变和某一个像素作较大改变的
是相同的,但肉眼看来,显然后者较容易被发现。因此我们的思路就是使得所有像素改变量的最大值最小,这实际上就是
。

训练的步骤和神经网络的训练相似,都是采取梯度下降法。唯一的不同在于这里多了一个约束条件,就是改变后的图片和原图的distance不能太大,为了做到这一点,我们可以在梯度下降法的每次迭代中检查当前和原
的记离有没有违反约束,若违反,则找到约束范围内距离当前
最近的点即可。
下面是和
的例子:

那么实际运行效果如何呢?
以下是虎斑猫的例子:

通过微小的改变,我们就骗过了ResNet-50,让分类结果从虎斑猫变成了海星。
那么为什么我们可以做到这一点呢?

上图给出了一个直观的解释(更深层次的原因尚不得而知),纵轴是信心分数。
因为我们的输入维度是非常高的(128128的图片展开成向量都有上万维),因此很可能存在某个方向上各个类别的信心分数是“挤在一起的”,如图所示,此时我们将图片的像素向量在这个方向上移动一点点,就会导致分类结果发生改变。
具体的Adversarial Attack方法有很多,下面我们看最简单的一种(FGSM):

FGSM的思路非常直接,就是沿着负梯度方向移动一个步长,使得结果满足约束。就是这样一个简单的方法,已经可以攻击很多图像分类器了。
到目前为止我们讨论的都是,已知模型的参数,有针对性地进行攻击,但我们日常生活中投入应用的分类器可能并不会公开这些数据,甚至连架构都不会公开,这样一来不法分子是不是就无计可施了呢?
实际上并不是,以上我们讨论的是白箱攻击,还有另一种名为黑箱攻击的方法。顾名思义,黑箱攻击就是在不知道模型参数的情况下对模型进行攻击。

若我们知道要攻击的网络训练数据是什么,那么我们就可以使用这些数据来训练一个网络,并攻击我们训练好的网络,这样产生的图片有很大概率可以骗过要攻击的网络。
若我们不知道要攻击的网络的训练数据,也没关系,我们可以喂给这个网络一些图片并得到分类结果,把这些数据作为我们的训练数据,然后重复上述步骤。

可以看到,就是这样一个简单的思路,就让原本很厉害的模型表现大大下降。
CMU甚至做出了带有特殊图案的眼镜让人脸识别系统把自己识别成另外一个人。

看完这些攻击方法,我们可能会感到很悲观,再强的模型面对有意攻击都会变得很差,有没有什么办法抵御这些攻击呢?
下面就是一些防御方法:


第一种思路就是在我们训练好的网络前加上一层filter对输入进行平滑处理等操作。这样做可以抵御部分攻击的原因在于,攻击是在原图上加了一个微小的扰动向量,这个向量之所以有效,是因为它是沿某个特定方向的,而我们的平滑处理可以在不太影响正常图片的分类的前提下,将那些有问题的图片中添加的noise的方向改变,从而消除其对我们分类器训练的影响。

上述方法和第一种方法的思路有相似之处,也是对输入做一些改动,使得正常图片的分类不会受太大影响,但是异常图片则会被侦测出来。
当然这些做法都是被动的,知道自己的训练集受到了攻击后做出的异常检测,那么我们能不能在训练模型之初就想方设法训练一个稳健的模型可以抵御各种攻击呢?很难。

主动防御的做法是先把训练集喂给网络训练出一个分类器,然后我们使用攻击方法把训练集进行污染,但标签仍保持正确标签,然后再次喂给模型进行训练,然后使用
攻击方法把训练集进行污染……重复上述过程。
这个方法可以预先考虑一些可能的攻击方法并有针对性的进行防御,但如果你的模型是用来防御和
攻击方法的,但对方偏偏用
算法来攻击你,你一点脾气都没有……这个领域还有很多问题值得探索……
网友评论