当前位置:   article > 正文

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

fgsm原文

前言

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


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

正文

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

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

ωTx~=ωTx+ωTη

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

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

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

η=εsign(xJ(θ,x,y))

模型参数:θ
模型输入,即图像:x
结果标签:y
损失函数:J(θ,x,y)
符号函数:sign()
我们可以线性化代价函数的当前值θ,获得最优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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/296273
推荐阅读
相关标签
  

闽ICP备14008679号