当前位置: 首页 > news >正文

对抗攻击算法:FGSM和PGD

FGSM

传送门
FGSM 利用了梯度上升的思想,通过损失函数相对于输入图像的梯度来找到 最容易 迷惑网络的方向,并沿着这个方向对图像进行微小的扰动。

FGSM 的基本想法是,沿着这个梯度的符号方向对图像进行微调,以最大化损失函数。具体公式为:
在这里插入图片描述
在这里插入图片描述

FGSM攻击算法代码:

# 定义 FGSM 攻击函数
def fgsm_attack(image, epsilon, data_grad):# 生成扰动方向sign_data_grad = data_grad.sign()# 生成对抗样本perturbed_image = image + epsilon * sign_data_grad# 对抗样本像素值范围约束在 [0,1]perturbed_image = torch.clamp(perturbed_image, 0, 1)return perturbed_image

PGD:

传送门
PGD算法在论文 《Towards Deep Learning Models Resistant to Adversarial Attacks 》中提出,它既是产生对抗样本的攻击算法,也是对抗训练的防御算法。
除此之外,PGD算法也是一阶中的最强攻击(一阶是指利用一阶导数)

设想目标模型如果是一个线性模型,损失函数对输入的导数一定是一个固定值,一次迭代和多次迭代时扰动的方向都不会发生改变,但是,如果目标模型为非线性,每次迭代之间的方向都有可能会发生变化,这时FGSM的单次迭代效果肯定不如PGD的效果好。FGSM算法通过一步计算,可能达不到最优效果,而PGD算法则是每次走一小步,但是多走几次,如果超过了扰动半径为ε的空间,就重新映射回来。

下面来看一下PGD算法的公式:
在这里插入图片描述
这里主要看一下公式最前面的投影到x+S的意思:就是通过一系列操作得到对抗样本后将对抗样本减去原始图像得到了扰动值然后将扰动值限制在-ε到+ε之间得到了新的扰动值,原始图像加上新的扰动值就是最终生成的对抗样本

关于对式子中sgn(L(θ,x,y)’)的理解可从FGSM中获取:

在FGSM中引入符号函数可以确定对抗扰动的方向。Goodfellow指出,如果我们的变化量与梯度的变化方向完全一致,那么将对分类结果产生较大的变化。因此,在FGSM中不需要关心具体的梯度大小,只需要知道方向即可。

符号函数sign:
在这里插入图片描述

PGD的核心代码:

# PGD攻击方式,属于FGSM攻击的变体
def PGD_attack(model, image, label, epsilon=0.8, alpha=0.1, iters=40):image = image.to(device)label = label.to(device)loss = nn.CrossEntropyLoss()ori_image = image.datafor i in range(iters): # 每次走一小步,但是多走几次image.requires_grad = Trueoutput = model(image)model.zero_grad()cost = loss(output, label).to(device)cost.backward()# 对抗样本 = 原始图像 + 扰动adv_image = image + alpha * image.grad.sign()# 限制扰动范围eta = torch.clamp(adv_image - ori_image, min=-epsilon, max=epsilon)# 进行下一轮的对抗样本生成image = torch.clamp(ori_image + eta, min=0, max=1).detach()return image
http://www.lryc.cn/news/492532.html

相关文章:

  • 【八股文】小米
  • xtu oj 众数
  • ENVI计算ROI分离度为灰色compute roi separability
  • Adaboost集成学习 | Python实现基于NuSVR-Adaboost多输入单输出回归预测
  • Python学习第十三天--面向对象,类和对象
  • AI运用落地思考:如何用AI进行系统运维?
  • springboot学习-分页/排序/多表查询的例子
  • windows 应用 UI 自动化实战
  • ffmpeg命令详解
  • 【漏洞复现】CVE-2022-43396
  • 文件的摘要算法(md5、sm3、sha256、crc)
  • 如何借助AI生成PPT,让创作轻松又高效
  • 云技术-docker
  • 对docker安装的mysql实现主从同步
  • 【不定长滑动窗口】【灵神题单】【刷题笔记】
  • AI写论文指令
  • 2625扁平化嵌套数组
  • QT6学习第五天 第一个QT Quick程序
  • 【开发商城系统】
  • (11)(2.2) BLHeli32 and BLHeli_S ESCs(二)
  • C++ 11重点总结1
  • 海康VsionMaster学习笔记(学习工具+思路)
  • 基于Python语言的Web爬虫设计源码
  • 学习日志 --A5rZ
  • JVM_垃圾收集器详解
  • Javascript Insights: Visualizing Var, Let, And Const In 2024
  • KL散度改写为一个可用于优化的形式
  • Java代码操作Zookeeper(使用 Apache Curator 库)
  • 【Linux】Make/Makefile
  • C++练级计划->《多态》虚函数表,菱形继承多态