FGM/FGSM 算法

相关论文
Ian J. Goodfellow, Jonathon Shlens, Christian Szegedy,Explaining and Harnessing Adversarial Examples,ICLR 2015

FGM(也可以称作FGSM)全称Fast Gradient Method,中文直译快速梯度下降法
可以作为无定向或者定向攻击算法使用

基本原理

假设分类器的方程为 $$\bar{y} = \sigma (\omega^T x + b)$$

现将输入的x改为$$x + \eta$$

此时方程将会变为 $$\bar{y} = \sigma (\omega^T x + \omega^T \eta + b) $$

一般来说,这个$$\eta$$是非常小的,人言无法识别的。但是通过激活函数,会对分类结果产生为非常大的变化。如果保证$$\eta$$与梯度变化的方向一直,将会产生非常大的变化。
正巧,有这样一个函数,它的变化与梯度的变化是已知的,也就是sign

对抗样本常见攻击算法与模拟——FGSM-ShaoBaoBaoEr's Blog

设x维度为n,该模型在每个维度的平均值为m。定义$$\eta < \epsilon \;,\;\epsilon>0$$,每个维度的微小修改与梯度函数的方向一致。因此最终累积效果为$$\epsilon \times n \times m$$当数据维度很大,累积效果会非常大。对于(32,32,3)的图像,也有3072的维度,机试$$\eta$$为.01,当m为1时,最终累积效果为30.72.

Tf实现

参考: https://tensorflow.google.cn/tutorials/generative/adversarial_fgsm

之前我训练了一个人马的二分类器,该分类器来自于吴恩达的tf2.0课程。我在tf的教程中看到了FGSM的实现,因此放到这里来执行一下看看效果。

比较核心的代码是这个函数,这个还需要一些tf的知识才能理解这个函数。

def create_adversarial_pattern(input_image, input_label):
    with tf.GradientTape() as tape:
        tape.watch(input_image)
        prediction = pretrained_model(input_image)
        loss = tf.keras.losses.BinaryCrossentropy()(input_label, prediction)

    gradient = tape.gradient(loss, input_image)
    signed_grad = tf.sign(gradient)
    return signed_grad

结果

扰动生成
对抗样本常见攻击算法与模拟——FGSM-ShaoBaoBaoEr's Blog

$$\epsilon = 0.010 $$的情况
对抗样本常见攻击算法与模拟——FGSM-ShaoBaoBaoEr's Blog

这个时候人还是很容易识别的。

$$\epsilon = 0.150 $$的情况
对抗样本常见攻击算法与模拟——FGSM-ShaoBaoBaoEr's Blog

当扰动非常大的时候,已经可以对结果产生非常显著的影响了。

考虑到我图片的维度并不是很大(300,300,3),或许FSGM对于更大的图片会有更好的表现吧。