Chapter 2. Attack and Defense
这部分主要来说明对于通过Machine Learning 训练好的模型如何进行攻击 和防止攻击。
Machine Learning 的目的在于通过大量的数据捕捉和学习来完成我们人类要做的事。 我们在第一章讲的大致就是对于异常数据的检测,既然我们的机器有检测异常的能力,那么发布异常的人当然有像一个方法来绕过我们的机器,让这种可以检测异常的模型对异常数据失效。这就构成了对模型的 Attack,我们要先了解敌人才能打败敌人,所以这部分先说明什么是 Attack,之后再讲如何根据恶意的攻击做出防御 Defense。
Attack
在简介部分已经大致说了为什么会有对训练好的模型进行攻击和对自身的模型进行防御的行为,但事实上,这种攻击还可能造成更加严重的后果。如果对一个自动驾驶汽车的网络进行攻击以至于汽车错误识别前方遇到的物体做出错误的判断,这种后果将是很严重的。
Attack 如何进行攻击
那恶意的攻击,究竟是怎样的攻击呢?
首先,出现了攻击肯定就有被攻击的模型,因此被攻击的肯定是某个已经训练好的模型。这里说到的攻击也不是恶意的损坏,导致这个网络无法工作,而是对网络的输入加上一些因素,使得已经训练好的模型无法正常识别。因此,攻击者的输入是对模型准确性造成的打击,让模型无法做出正确的判断,因而无法做出正确的决策。
其次,我们要注意的是。在训练模型的时候,我们说训练集是为了训练学习模型的参数。但对于攻击者来讲,攻击对象是已经训练好,即固定的参数。所以在这个过程中,攻击者要不断训练或是改变的是自己的攻击数据,即如何让自己的攻击数据能更好的“骗”过已经训练好的模型。
下图展示的就是 对于模型的攻击。
在图中,对于Attack的定义就是,若将本来具有特征 $\left[\begin{array}{c}x_1\x_2\…\end{array}\right]$ 的原图 $x^0$ 放入已经训练好的模型中(这里是神经网络模型),然后得到判定图片的类别Tiger Cat 的分数是0.64. 但如果将 这个图片加上一系列的干扰因素 即 $\left[\begin{array}{c}x_1\x_2\…\end{array}\right] + \left[\begin{array}{c}\Delta x_1\\Delta x_2\…\end{array}\right]$ , 这样的话后,将图片放入模型中,得出的是一些错误的分类。简而言之,我们希望一个新的输入数据 $x’ = x^0+\Delta x$ ,通过模型后,能和原图 $x^0$ 得到不同集错误的结果。但我们不希望这个 添加的扰动因素 $\Delta x$ 过大,导致 $x’$ 根本不像原图。因为如果直接变成企鹅而输出一个企鹅的结果,这个攻击则毫无意义。就是要在看不见的地方动手hhhhh。
如何训练攻击时增加的扰动因素 $\Delta x$
我们在训练分类模型(classification model)的时候,训练集是由训练数据 $x^0 = \left[\begin{array}{c}x1\x_2\…\end{array}\right]$ 和他们的真实标签 $\hat y = \left[\begin{array}{c}\hat y_1\\hat y_2\…\end{array}\right]$ 构成,训练的目标函数(cost function)则是关于预测出的标签 $y^0 =\left[\begin{array}{c}y_1\y_2\…\end{array}\right]$ 和真实标签$\hat y$的函数$L{train}(\theta) = C(y^0, \hat y)$ ,这里我们的模型主要是通过训练数据不断更新模型$f_{\theta}(\cdot)$中的参数 $\theta$ ,所以cost function是关于 $\theta$ 的函数。
假设已经训练好的参数模型为$f_{\theta^*}(\cdot)$, 则对于攻击网络的输入 $x’ = x^0 + \Delta x$, 得到的输出为 $y’$, 值得注意的是,因为此处我们是对攻击的输入进行训练,网络的参数是固定(即训练一个合适的输入数据能骗得过已经训练好的模型),所以这里cost function的是关于 $x’$ 的函数。
对已经训练好的模型进行的攻击主要分为两种:
Non-target 无目标攻击
也就是说,对于进行攻击的输入数据,模型只要输出错误的答案即可。比如说对图片分类网络进行攻击的图片是一张tiger cat的图片加上干扰因素,那么我们希望这个图片通过模型之后得出一个 非tiger cat 的标签,但是至于得出的标签是什么,我们并不在意。
因此,这里的cost function 为 $L(x’) = -C(y’, y^{true})$, $y^{true}$ 是正确的结果。【其实也就是$x^0$ 的标签 $y^0$,因为我们在改造 $x’$ 的时候就希望 $x’$ 和 $x^0$ 很像。】
Target 有目标攻击
也就是说,对于进行攻击的输入数据,我们期待模型给出一个特定的结果。比如说对图片分类网络进行攻击的图片是一张tiger cat的图片加上干扰因素,那么我们希望这个图片通过模型之后得出的标签必须是企鹅。
因此,这里的cost function 为 $L(x’) = -C(y’, y^{true}) + C(y’, y^{false})$, $y^{false}$ 就是指定的错误的标签。
Constraint
这里限制条件就是我们之前说的,我们希望扰动因素 $\Delta x$ 很小,希望我们进行攻击的数据 $x’$ 和原数据 $x^0$ 很像,能 “骗” 过机器。所以这里有个现实条件就是 $x’$ 和 $x^0$ 之间的距离小于一个不被人发现的距离,$d(x’, x^0) < \epsilon$.
因为我们知道$x’ = x^0 + \Delta x$ , 展开成向量的公式就可得到: $\left[\begin{array}{c}x1’\x_2’\…\end{array}\right] = \left[\begin{array}{c}x_1\x_2\…\end{array}\right] + \left[\begin{array}{c}\Delta x_1\\Delta x_2\…\end{array}\right]$,那么二者之间的距离就是关于$\Delta x$ 的函数。我们常用的表示两组数据之间的距离函数是 $L_2$ norm 和 $L{\infty} $ norm。
$L_2$ norm 就是我们经常说的欧氏距离,也就是向量的magnitude。
$L_{\infty} $ norm 则是取向量中的最大值。
一般情况下,我们会选择 $L_{\infty}$ ,因为在攻击数据中,我们希望和原数据差异最大的一个点 也很小,这样的话,攻击数据就不容易被察觉。
如何在有限制的情况下进行训练
在明确了cost function之后,我们的问题又变成了对cost function求最小值:
首先,我们面临的问题是如何在有限制条件的情况下求cost function的最小值。我们可以将有限制的优化问题转化为无限制条件的优化问题,然后再用限制条件对求出的解进行优化。
去掉限制条件,求出 $x^ = arg\ \min\ L_{\theta^}(x’)$。
进入更新循环:
更新 $x^*$ 的方法可以用普通的梯度下降法, $x’$ 的取值从原图 $x^0$ 开始;
在第 $t$ 次循环时, $x^t\longleftarrow x^{t-1} - \eta\Delta C(x^{t-1})$, $\eta$ 表示学习率
判断 $d(x^0, x^t) \leq \epsilon$
If true: $x^t\longleftarrow fix(x^{t})$
这里的 $fix(\cdot)$ 表示对第 $t$ 次更新的数据进行修正,将它强行拉回最近的符合 $d(x^0, x^t) \leq \epsilon$ 的 $x$ 的值。
需要说明的一点是如何理解“强行将他拉回最近的符合 $d(x^0, x^t) \leq \epsilon$ 的值”。需要注意的是这和distance方程$d(\cdot)$ 相关。拿二维特征平面举例,如果我们的distance方程计算的是 $L_2$ 距离,那么这个限制区域就是一个圆,我们只要把数据拉回到圆的边界即可;若计算方程是 $L_\infty$ 距离,那么这个限制区域就是一个矩形,表示在每一维的最大值都不可大于 $\epsilon$ 。
若求出的点 $x^t$ 在限制区域之外,我们就强行把他进限制区域即可。
常见的攻击网络的方法
这里介绍一个常见的方法训练攻击数据的方法:FGSM( Fast Gradient Signed Method)
这个方法其实和上述的方法类似,但不同的是,FGSM并不关注更新时 $x^0$ 改变的具体数值大小,只关心他们的符号。
因此在更新参数第二步的时候 $x’ \longleftarrow \eta\Delta C(x^{t-1})$ 中的 $\Delta C(x^{t-1}) = \left[\begin{array}{c}sign(\frac{\partial L}{\partial x_1})\ sign(\frac{\partial L}{\partial x_1})\…\end{array}\right]$, 这里之所以用到了sign函数主要是因为在更新的时候,因为我们有限制条件,在抑制了更新方向之后,我们可以利用限制条件将预测点直接强行拉到限制区域内。
攻击分类:白盒攻击&黑盒攻击
根据对于想要攻击的模型的参数是否已知,将攻击分为白盒攻击和黑盒攻击。之前介绍的在已知模型参数情况下对攻击数据进行训练的都是白盒攻击。而对于参数未知的模型进行攻击是黑盒攻击。
对于白盒攻击来讲,最有效的防护措施大概就是保护好自己的模型参数,如果模型参数是未知的,那么在模型cost function下进行的攻击数据参数更新都是不存在的。
但是即使不知道模型以及模型的参数,我们也可以进行黑盒攻击。我们可以将相同的训练数据输入到想要攻击的未知模型和自定义模型network proxy中。然后通过收取想要攻击的模型的输出结果来训练我们自定义的network proxy,最后通过训练能够攻击我们自定义网络的攻击数据来完成对黑盒的攻击。【反正就是一个方法,你没有的数据可以不停地去试,去破解你想要攻破的黑盒,然后根据你自己搞出来的模型再训练攻击模型去攻击黑盒】
一些零碎的记录
Universal Adversarial Attack
既然对于不同的任务,不容的输入数据,我们都要训练攻击干扰因素,那么有没有可能对于所有的数据有一种普遍适用的干扰因素可能用在所有的输入数据中让模型出错呢。答案是有的。
Universal adversarial perturbations
Adversarial ReProgramming
这部分的思想是,我们可不可以通过攻击因素,让模型帮我们做一些别的事,即改变模型的功能。
比如说我们现在有一个 $4\times4$ 的方块阵,我们想要知道这个方块阵中有几个方块被涂黑。我们可以将方块阵图片加在一个干扰因素上,在通过Image Net 的classifier 然后对它进行训练,希望得到的结果是,当我们输入 有 $n$ 个方块为黑色的图片到这个分类模型中时,他会反馈给我们一些图片中的分类。【这里将数方块的任务转化成了图片分类的任务】
ADVERSARIAL REPROGRAMMING OF NEURAL NETWORKS
Application
这部分是说,我们是否可以将扰乱的二维因素变化到三维中来,看是否还是可以骗过机器。主要做了两个实验,一个是在人脸周围训练一个眼镜状的干扰因素,使得不同的图片加上干扰因素后就会被识别成另一个人。这个方法在二维空间中是有效的,作者尝试将干扰因素真的打印出来,然后带到一个真人身上,发现这个真人通过机器识别的时候同样会被识别错误。还有一个是将已经训练好的攻击数据和原数据都打印出来让机器识别,肉眼是看不出什么区别的,但是让机器识别时,攻击数据还是会攻击成功,得到一个错误的分类。【这部分很有趣,除了攻击之外,个人感觉也可以做成水印或者一些隐性的防伪标志让机器识别,但是这对于打印的技术和干扰因素自身的变化要求还是挺高的,因为我们不希望打印造成的不清晰或者干扰因素自身变化太多造成打印出的图片和pixel-by-pixel的电脑存储图片查的太多】
Defense
说完对模型的攻击,我们还要说一下对模型的防御。防御主要分为两种,一种是主动防御,另一种是被动防御。
Passive defense 被动防御
被动防御指的是对于现有的模型,我们不对模型和模型参数本身做任何调整,我们要做的防御工作是给已有的模型加上一些filter,让攻击数据丧失攻击功能。为什么叫“被动防御” 也很好理解,因为我们并不修改模型,所以可以看做是我们在应用网络的时候发现有人攻击,这时候才想起来要防御。
作为被动防御,我们一般会在输入图片之后再加一层平滑层来减弱干扰因素造成的影响。
或者也可以将输入图片本身,和做两种不同的特征压缩后的图片同时通过模型。之后计算原图的预测结果和两种压缩后的结果之间的距离,如果距离很大,说明攻击数据的干扰因素对图片造成了影响,可判定为被攻击了,反之则没有。
- 或者可以将输入图片做一些随机的大小resize 以及一些padding的处理,之后通过模型,查看预测结果
Proactive defense 主动防御
和被动防御不同,主动防御就是调整模型参数,使得模型的参数有能力抵抗加了干扰因素的输入数据。所以这里的防御是在一开始训练模型的时候就有预料到的,因此叫做主动防御。
其实这个过程就是自己给自己找敌人,自己生成有攻击能力的图片,然后训练模型让他不要犯错,之后对参数进行更新,更新过后再根据新的参数模型和新的有供给能力的图片再对模型进行更新。【总的来说就是尽量把能造成攻击的数据都在训练中较量一遍,这样训练出的新的模型就有防御能力了。】