代码部分参见:李宏毅机器学习作业10——Adversarial Attack_iwill323的博客-优快云博客
目录
Attack Approach:FGSM(Fast Gradient Sign Method)
Speech Processing:侦测一段声音是不是被合成出来的
Natural Language Processing:控制QA结果
Network 在一般的情况下得到高的正确率是不够的,它要在有人试图想要欺骗它的情况下,也得到高的正确率,所以就要能够对恶意攻击采取一定的防御措施。本节将介绍对抗攻击的概念、方法和防御措施
Adversarial Attack的概念和分类
概念
对抗攻击的概念是给正常输入加入特殊的杂讯,形成一个带有攻击性的输入,当其进入模型之后,输出的内容是错误的。被加杂讯的照片叫做 Attacked Image,还没有被加杂讯的照片一般就叫做Benign Image。一般加入的杂讯是很小的,人的肉眼是看不出来的,下图中的攻击图片是夸张了的
攻击前分类的信心分数(置信度)是 0.64,攻击后分类的信心分数是100 %,即反而可能上升
分类
是否知道模型参数
- 白盒攻击(White Box Attack):已知模型参数
- 黑盒攻击(Black Box Attack):未知模型参数
是否有攻击得到的目标
- 没有目标的攻击(Non-targeted Attack):原来的答案是猫,只要你能够让 Network 的输出不是猫就算是成功
- 有目标的攻击(Targeted Attack):希望 Network不止它输出不能是猫,还要输出某一指定的别的东西,比如说,把猫错误判断成一隻海星才算是攻击成功。
白盒攻击
Network是一个函数f,输入是一张图片,我们叫它x0,输出是一个 Distribution,分类的结果叫y0。被攻击的模型参数是固定的,攻击者是修改不了模型的,只能修改输入内容。
Non-Targeted Attack
如果是 Non-Targeted Attack,要找到一张新的图片x, 经过Network输出是 y,正确的答案叫做 ŷ,希望 y 跟 ŷ 的差距越大越好。loss函数就是y和ŷ的负cross entropy,这一项越小越好,代表 y 跟 ŷ的 Cross Entropy 越大
Targeted Attack
如果是目标攻击。用ytarget代表目标,ŷ 其实是一个 One-Hot Vector,ytarget也是一个 One-Hot Vector,希望 y 不止跟 ŷ 越远越好,还要跟ytarget越近越好。
Non-perceivable
加入的杂讯越小越好,也就是新找到的图片跟原来的图片要越相近越好。所以我们在解这个Optimization 的 Problem 的时候,还会多加入一个限制
希望 x 跟x0之间的差距小於某一个 Threshold,这个閾值是人类可以感知的极限,如果x0 跟 x 之间的差距大於 Σ,人就会发现有一个杂讯存在。让x0 跟 x 的差距小於等於 Σ,就可以產生一张图片,人类看起来 x 跟 x0是一模一样的,但產生的结果对 Network 来说是非常不一样的
d(x0, x) 的计算方法
计算d(x0, x)有两个方法。第一种L2:将∆𝒙每一维的差值的平方相加,要开根号也是可以的;第二种L-∞:将∆𝒙中绝对值最大元素作为差异大小。∆𝒙是正常输入和恶意输入的差值(也就是杂讯)
第二种方法L∞更加符合人类的感知情况,所以攻击者一般会考虑采用L-infinity。为什么呢?以方块图来说明,右上角的正方形中四个方块都有微小变化,右下角的正方形中只有绿色方块发生变化。并且令两者对原正方形做差,有相同的L2值,但右下角L-∞更大,右上角L-∞比较小,因為 L-∞ 只在意最大的变化量。而从人肉眼观察来看,能明显看出右下角的变化,所以限制最大的差值(L-∞)也许能够更好地将恶意输入伪装成正常输入。
刚才举的例子是影像上的例子,如果要攻击的对象是一个跟语音相关的系统,那什麼样的声音讯号对人类来说听起来有差距,那就不见得是 L2 跟 L-Infinity 了,要研究人类的听觉系统,看看人类对什麼频态的变化特别敏感,根据人类的听觉系统来制定比较适合的 x 跟 x0之间距离的衡量方式,这个部分需要用到 Domain Knowledge
攻击方法的实现
和以前模型里面的函数不同,之前的是固定输入,调整参数来使loss最小,现在是固定模型参数,调整输入来使loss最小,还是用的梯度下降的方法:将正常的输入x当作初始化值,再迭代更新x,迭代过程是算出loss对输入x的偏微分g,乘上学习率后再更新x。更新完参数以后,如果xt和x的差距大於 ε,就把xt改回符合限制。
假设现在用的是 L-Infinity,那么x 可以存在的范围只有方形框。在更新完x之后,如果x在这个正方形外(蓝色的点),那么就用正方形上最近的点(橙色的点)来替代。
当然,这只是多数方法中的一个,攻击方法可以使用不一样的优化函数,不一样的限制条件,但是本质思想就是这样的。
Attack Approach:FGSM(Fast Gradient Sign Method)
这个方法重点在于只要更新一次x,一击就找出一个可以攻击成功的 Image,不需要迭代多次。
不直接用Gradient Descent 的值,给它取一个 Sign,梯度g的输出只有1和-1两种可能,而学习率设为“感知上限”ε表示,更新一次的x必定会在方框的四个角落上,这个一击往往就可以必杀。
def fgsm(model, x, y, loss_fn, epsilon=epsilon):
x,y = x.to(device), y=y.to(device)
x_adv = x.detach().clone() # 克隆x是因为x的值会随着x_adv的改变而改变
x_adv.requires_grad = True # need to obtain gradient of x_adv, thus set required grad
loss = loss_