一、前言
本文章作为学习2023年《李宏毅机器学习课程》的笔记,感谢台湾大学李宏毅教授的课程,respect!!!
二、大纲
- 恶意攻击
- 攻击方式
- 防御方式
三、恶意攻击
AI模型也是会遭受到人类恶意攻击,人工智能也是存在安全性问题,类似于软件层面的一些病毒、后门、劫持情况,当今日人工智能日渐应用广泛的同时,这些安全方面问题不容小觑。
四、攻击方式
常见的两种攻击方式:
-
无目标的攻击(纯攻击)
举例而言:
一张“猫”的图片加入细微噪声(人没啥感觉有变化),但却骗过模型,让模型犯错。 -
有目标的攻击
相对的就是加入细微噪声,期望模型犯错,并把“猫”识别成“狗”,带有目的导向。
那怎么攻击呢?换句话说上面所述的细微噪声怎么求呢?
假设输入图片为x,噪音∆x,训练好的模型为F。
图片经过模型F得到的输出值为 y {y} y,图片的真实类别为 y ^ \hat{y} y^,想要骗成 y t a r g e t y^{target} ytarget 类别,于是乎列出方程式如下:
-
Non-targeted
因为 y = F ( x + Δ x ) y = F(x + \Delta x) y=F(x+Δx),其中因变量未知
得到 L o s s ( y , y ^ ) = Cross Entropy ( y , y ^ ) Loss(y, \hat{y}) = \text{Cross Entropy}(y, \hat{y}) Loss(y,y^)=Cross Entropy(y,y^)
要骗过 F F F,也就是说要离真值越远越好,
因此满足 arg max L o s s ( y , y ^ ) \arg\max Loss(y, \hat{y}) argmaxLoss(y,y^)
取个负号, arg min − L o s s ( y , y ^ ) \arg\min -Loss(y, \hat{y}) argmin−Loss(y,y^)
解最值问题,直接用 gradient descent -
Targeted
如果用损失函数的表达方式写出来,其他过程一样,增加一项要求与 y target y_{\text{target}} ytarget 类别交叉熵越小越好
可以得到:
arg min [ − L o s s ( y , y ^ ) + L o s s ( y , y target ) ] \arg\min \left[ -Loss(y, \hat{y}) + Loss(y, y_{\text{target}}) \right] argmin[−Loss(y,y^)+Loss(y,ytarget)]
其中 L o s s Loss Loss 都是交叉熵。
下图看起来可能更加直观:
这就够了?
不,这还是不够,这道题是条件最值问题。
自定域x有限制,不能变化超出一定范围,因为你期望你的输入可以混淆视听,期待上图中的 x x x和 x 0 x^0 x0越接近越好,那如何设定∆x的范围呢?就是自定义,依据是什么,就是人的肉眼。
那怎么求出 x x x和 x 0 x^0 x0之间的距离呢?有各式各样的办法,常用的方法有:
- L2-norm(取模长的方法)
d ( x 0 , x ) = ∥ Δ x ∥ 2 d(x^0, x) = \|\Delta x\|_2 d(x0,x)=∥Δx∥2
= ( Δ x 1 ) 2 + ( Δ x 2 ) 2 + ( Δ x 3 ) 2 … = (\Delta x_1)^2 + (\Delta x_2)^2 + (\Delta x_3)^2 \dots =(Δx1)2+(Δx2)2+(Δx3)2…
- L-infinity(取变化最大的)
d ( x 0 , x ) = ∥ Δ x ∥ ∞ d(x^0, x) = \|\Delta x\|_\infty d(x0,x)=∥Δx∥∞
= max { ∣ Δ x 1 ∣ , ∣ Δ x 2 ∣ , ∣ Δ x 3 ∣ , … } = \max\{|\Delta x_1|, |\Delta x_2|, |\Delta x_3|, \dots\} =max{∣Δx1∣,∣Δx2∣,∣Δx3∣,…}
对比下两种方法:
假设一张图片有4个像素,做两种变换:
- 方法一:每个像素改一点,从人类角度来看整体不太好辨别出来;
- 方法二:只改一个像素,右下角绿色部分,从人类角度比较好辨别出来;
以下使用L2-norm,两者有相同的L2,无法区分。
如果使用L-infinity,因其是使用取最大值的方式,所以更倾向于和人类判断一致。既然是要来骗,那就是要使得L-infinity是小的。
知道了 ε ε ε是人设的,那如何解:
x ∗ = arg min d ( x 0 , x ) ≤ ε L ( x ) x^* = \arg\min\limits_{d(x^0, x) \leq \varepsilon} L(x) x∗=argd(x0,x)≤εminL(x)
如果是单纯的下列公式:
x ∗ = arg min L ( x ) x^* = \arg\min\limits L(x) x∗=argminL(x)
那直接Gradient Decent可解,加上了限制条件 d ( x 0 , x ) ≤ ε d(x^0, x) \leq \varepsilon d(x0,x)≤ε,那就需要在做梯度下降时候加入限制,如果更新的参数超出 ε ε ε,就固定住即可。如下图所示:
有一种方法叫做Fast Gradient Sign Method (FGSM),实作层面是什么样的呢?列出gradient decent式子:
x t ← x t − 1 − η g x^t←x^{t−1}−ηg xt←xt−1−ηg
意思就是η就等于ϵ,梯度g再套一层条件函数,如果g大于0输出1,小于零就输出-1,形象的图解如下:
以上讲的都是事先知道模型架构的攻击,称之为白盒测试,那有没有可能黑盒攻击呢?
答案是可以的。
1、如果我们知道模型所用的训练数据集,那我们就可以自己训练一个模型来做攻击,攻击成功的案例再去攻击目标模型。
2、如果我们不知道训练集,那就去调用已知的模型,把输入输出成对的资料拿来做训练,得出一个类似的模型进行攻击,找到漏洞再去攻击目标模型看看。
那思考下,为什么攻击这件事情那么容易成功呢?
有人把小丑鱼的图片丢进不同网络里面,发现问题是来源于数据而不是模型选型,举例而言就是数据看得不够多,在某一个面向特征比较薄弱,容易犯错。
比如下图,在深蓝色区域表示能正常识别,超出深蓝色区域就识别错,这些网络横向蓝色区域都是狭窄的,所以横着的方向则是薄弱带。
还有更狂的做法就是只攻击一个像素(类似于点了死穴),还有通用的攻击(类似于一招鲜吃遍天),当然语音、nlp都可以这么做。
如果找到漏洞,那物理的世界也是会有相应的骚操作(比如用些道具)可以骗过模型。
还有类似于僵尸病毒、开后门的做法。
五、防御方式
防御分主动Proactive和被动Passive
-
被动防御(Passive)
1、平滑处理(Smoothing):既然是加噪声,其实也可以认为是在强化某些局部特征,让它看起来不同而已,那就平滑弱化一下。
2、输入的图片做压缩让其失真。
3、训练一个generator,让它正常生成照片,不要有噪声。
4、加入一些随机操作,例如放缩、翻转等
但是,以上的这些招数只要被敌人发现了,那也是同样能够攻击成功。 -
主动防御(Proactive)
其实就是在训练过程做数据增加这件事情,让模型看过更多的负样本,降低出错概率。