FGSM(Fast Gradient Sign Method)_学习笔记+代码实现

前言

本篇博客出于学习交流目的,主要是用来记录自己学习中遇到的问题和心路历程,方便之后回顾。过程中可能引用其他大牛的博客,文末会给出相应链接,侵删!


FGSM(Fast Gradient Sign Method)算法
特点:白盒攻击、
论文原文:Explaining and Harnessing Adversarial Examples

正文

大牛们在2014年提出了神经网络可以很容易被轻微的扰动的样本所欺骗之后,又对产生对抗样本的原因进行了分析,Goodfellow等人认为高维空间下的线性行为足以产生对抗样本。

对抗样本的线性解释
常见的数据图像大部分表示成1-255,8bit/像素点的形式,所以能够表示样本的精度十分有限,由于这种有限的表达能力,可能在原始样本上加小小的扰动就被误分类。现在我们有:
原始图像: x
扰动: η
对抗样本: x ~ = x + η
当存在一个小到可忽略的 ε 满足 η < ε ,我们期望分类器对这两个样本的分类结果一致,然而……
现在考虑加入权值向量 ω 信息,则:

ω T x ~ = ω T x + ω T η

对抗扰动通过 ω T η 影响激活函数从而影响分类结果。如果 ω n 个维度,权向量的一个元素的平均大小是 m ,那么激活函数就会增加 ε m n 。虽然 η 不会随着维度增加而增加,但是 η 会随 n 线性增长,然后就有高维问题了。

非线性模型的线性扰动
我们假设神经网络都太线性了以至于不能抵抗对抗样本。常见的LSTM、ReLU和maxout网络都趋向于线性表现,而类似sigmod这种非线性性模型也把大量的时间花在非饱和和线性系统中。(这里我也不怎么理解,望大神讲解)

我们从公式开始理解(fast gradient sign method):

η = ε s i g n ( x J ( θ , x , y ) )

模型参数: θ
模型输入,即图像: x
结果标签: y
损失函数: J ( θ , x , y )
符号函数: s i g n ( )
我们可以线性化代价函数的当前值θ,获得最优max-norm η

算法的主要思想:让我们的变化量与梯度的变化方向完全一致,那么我们的误差函数就会增大,那么将会对分类结果产生最大化的变化。sign函数保证了变化方法同梯度方向一致。对损失函数求偏导,即得到权值向量 ω 有关的函数。


画个可能不是很贴切,但是可以帮助理解的图(个人理解,有错误欢迎指出)

首先明确,横坐标表示单维x输入值,纵坐标表示损失值,函数图像是损失函数 J ,损失值越大表示越大概率分类错误,假设灰的线上方为分类错误,下方为分类正确。以样本点x1为例。根据公式,此时的偏导函数为负,则黑色箭头方向为 x ~ 扰动方向,同理x2样本在取值为正时,也沿着黑色箭头方向变化,只要我们的 ε 取值合适,就能生成对抗样本,使得分类错误。

线性模型与权值衰减的对抗性训练
如果我们可以考虑的最简单的模型是逻辑回归。在这种情况下,FGSM是准确的。
这部分没看懂,贴原文
这里写图片描述
这里写图片描述

代码

代码实现主要参考链接:Python3环境下cleverhans对抗样本防护编译与测试(含FGSM攻击与ADV防护),但是原博客没有直接给出可运行的代码,所以自己基于基础代码改了一下,在博客最后附下载链接。
工程如下:

fgsm.py 可直接运行主程序,实现FGSM算法生成对抗样本,也能实现防御
eval_on_adversarisl.py 实现防御训练模型
checkpoint 两个防御模型
input 原始输入图像
output 对抗样本
通过修改checkpoint_path来实现调用不同模型:
这里写图片描述
inception_v3.ckpt 是原始经典模型
adv_inception_v3.ckpt 是Step L.L.防御训练后的模型
ens4_adv_inception_v3.ckpt 是集成四个模型Step L.L.防御训练后的模型
结果展示函数:
classify() 展示预测结果最高的类别
show_classify() 展示图像以及预测结果最高的前十个结果,如下图:

代码主要调用cleverhans集成库,里头还有许多现成的攻击算法可以调用。

代码下载:由于上传大小受限,分三部分上传,将三个分卷下载后同时解压即可。

FGSM算法分卷1
FGSM算法分卷2
FGSM算法分卷3

猜你喜欢

转载自blog.csdn.net/qq_35414569/article/details/80770121