这个章节主要记载一些梯度攻击的方法
1.《Explaining and Harnessing Adversarial Examples》
概述:利用 Fast Gradient Sign Method(快速梯度下降法)来对训练好的模型进行攻击,论文不对模型的参数造成攻击,而是在训练过程中依靠梯度反向生成对抗样本,举个例子,如果一个图片的某个像素点在一次训练的反向传播中为了让loss减少,应该是加上某个偏导数,而为了生成对抗样本,则反向的减去一些值,让这个loss反而增大。由于增加噪音无法指定让模型由正确的分类器转变为某个特定的错误分类,因此FGSM属于无目标攻击。
论文中给目标增加的噪音公式如下。其中sign为符号函数,即只判断正负,x为图片像素,y为真实标签值,前面那个希腊字母是学习率。学习率越大,噪音也越大,后面sign()的只影响正负。
所以对抗样本的图片应该是 y_wrong=y_init+上述的噪音
ps:这里的噪音并非是一定要反向传播的梯度的相反值,可以自行设置,经过测试,少量噪音人对图片的分辨并不影响,但影响人工智能模型,但是过多的噪音不但影响人工智能模型,还影响人,这与论文2恰恰有点相反。
用python(pytorch)为图片增加噪音
def fgsm_attack(image, epsilon, data_grad):
sign_data_grad = data_grad.sign() # 获取梯度的符号,正为1,负为-1
perturbed_image = image + epsilon * sign_data_grad #epsilon 为增加噪音的度 本案例使用0 到 0.3 step=0.05
perturbed_image = torch.clamp(perturbed_image, 0, 1) # 将数值裁剪到0-1的范围内,超出1为1,小于0为0
return perturbed_image
下图为epsilon 0 到 0.3 step=0.05,生成的准确率,可以看到准确率下降的十分快
下图为从测试样例中抽取出来几个样本进行观察,可以发现,在epsilon=0.1时,图片与原图片差距不是十分明显,但是超过0.1后,就有点变样了,且识别的错误率也相当高。
2.《The Limitations of Deep Learning in Adversarial Settings》
本文提出一种前向梯度攻击,利用图像某个像素点,经过层层模型后对最后某一分类的影响的大小来进行攻击。
前提:我们不以论文中讲述的例子来说,假如我们有一个输入量x 要经过三个神经元,分别为f=3x g=2x F=1.5x,看似偏导数挺小,但是经过层层偏导后F(g(f(x))),会发现偏导数为9,如果在更多层中的模型中,那影响会更加巨大,可能输入一个微弱的改变,却导致了另一个分类,论文中也举了这个例子,输入0.05的区别,却导致了从0变到1的结果。
基于上述假设,那我们只需要把一张图片的每个像素点遍历一次,寻找出某个像素点i,对于t类的影响即可,如果对于t类影响很大,那么我们只需要增大i这个像素点的值即可(t为企图错误分类的目标)
构造算法的输入分别是: 正常样本 x,target目标标签 y*, 非循环DNN F。算法的返回值是对抗样本 x*。其中算法的主要步骤有一下三个:
- 计算每个像素点对于目标分类的前向导数;
- 基于前向导数构造显著图 S;
- 利用显著图S修改输入特征 。
接下来详细介绍以上三个步骤。
Step 1. 计算深度神经网络DNN前向导数
n+1表示第n+1层 j表示第j个神经元
W为权重参数 b为偏置值
其实算法最后,某像素点对于目标分类的前向导数就成了链式求导
Step 2. 计算对抗性显著图
公式第一行想要达到的目的:使对t类的预测分数起负作用(<0)或者对其他非t类的预测总体呈正作用的特征图对应的映射设为0。
公式第二行想要达到的目的:如不是上面那种情况,说明第i个特征对输出为t类还是有帮助的,并设置为相应的值(考虑所有的偏导数,但结果仍是正的)。
Step 3. 样本修改
通过对抗性显著图确定需要修改的输入特征后,则可利用修改参数 seta 来对输入样本进行修改,则生成对抗样本。
另外,文章还给了一种建议,如果仅仅修改一个像素点导致攻击成功的难度过大,可使用组合点的方式进行攻击,可增大成功率。