对抗攻击FGSM的纯粹版FGNS
引言
FGSM\mathrm{FGSM}FGSM是基于梯度迭代攻击中生成对抗样本的开创性工作。我第一次接触相关工作的时候,给我困惑最多的就是论文中为什么要给梯度加上sign\mathrm{sign}sign这个符号函数,因为这会导致生成的对抗扰动的方向与最速梯度方向有一个锐角偏移。IanGoodfellow\mathrm{Ian\text{ } Goodfellow}Ian Goodfellow在斯坦福大学的讲座里对梯度符号中加入sign\mathrm{sign}sign符号给出了一个基于实证的解释,即在线性假设下,给定一个数据集的样本,当样本中对抗扰动分量方向与梯度分量的方向相同的个数如果多余某个常数时,该样本沿着对抗扰动的方向即可进入到对抗子区域中。这个解释是在说明加入sign\mathrm{sign}sign符号后的扰动方向依然具有攻击性,但从原理上来说这并不是最好的攻击方向。最近看到了一篇文章,就讨论了该问题,论文作者通过原理分析实验验证,发现当梯度方向加入sign\mathrm{sign}sign符号后会使得攻击效率比较低。论文的代码链接失效,我根据论文中的算法流程图重新编写了一下代码。
论文链接:https://arxiv.org/abs/2110.12734
理论分析
给定一个样本xxx,其对应的标签为yyy,损失函数为L(x,y)\mathcal{L}(x,y)L(x,y),其中第ttt步生成的对抗样本为xTadvx^{adv}_TxTadv。根据多元函数的泰勒展开公式可以得到如下方程组
{L(xTadv,y)=L(xT−1adv,y)+(xTadv−xT−1adv)⋅∇L(xT−1adv,y)+O(∥xTadv−xT−1adv∥2)L(xT−1adv,y)=L(xT−2adv,y)+(xT−1adv−xT−2adv)⋅∇L(xT−2adv,y)+O(∥xT−1adv−xT−2adv∥2)L(xT−2adv,y)=L(xT−3adv,y)+(xT−2adv−xT−3adv)⋅∇L(xT−3adv,y)+O(∥xT−2adv−xT−3adv∥2)⋮L(x3adv,y)=L(x2adv,y)+(x3adv−x2adv)⋅∇L(x2adv,y)+O(∥x3adv−x2adv∥2)L(x2adv,y)=L(x2adv,y)+(x2adv−x1adv)⋅∇L(x1adv,y)+O(∥x2adv−x1adv∥2)L(x1adv,y)=L(x0adv,y)+(x1adv−x0adv)⋅∇L(x0adv,y)+O(∥x1adv−x0adv∥2)\left\{\begin{aligned}\mathcal{L}(x^{adv}_T,y)&=\mathcal{L}(x^{adv}_{T-1},y)+(x^{adv}_T-x^{adv}_{T-1})\cdot \nabla \mathcal{L}(x^{adv}_{T-1},y)+O(\|x^{adv}_T-x^{adv}_{T-1}\|^2)\\\mathcal{L}(x^{adv}_{T-1},y)&=\mathcal{L}(x^{adv}_{T-2},y)+(x^{adv}_{T-1}-x^{adv}_{T-2})\cdot \nabla \mathcal{L}(x^{adv}_{T-2},y)+O(\|x^{adv}_{T-1}-x^{adv}_{T-2}\|^2)\\\mathcal{L}(x^{adv}_{T-2},y)&=\mathcal{L}(x^{adv}_{T-3},y)+(x^{adv}_{T-2}-x^{adv}_{T-3})\cdot \nabla \mathcal{L}(x^{adv}_{T-3},y)+O(\|x^{adv}_{T-2}-x^{adv}_{T-3}\|^2)\\ \vdots \\ \mathcal{L}(x^{adv}_{3},y)&=\mathcal{L}(x^{adv}_{2},y)+(x^{adv}_{3}-x^{adv}_{2})\cdot \nabla \mathcal{L}(x^{adv}_{2},y)+O(\|x^{adv}_{3}-x^{adv}_{2}\|^2)\\ \mathcal{L}(x^{adv}_{2},y)&=\mathcal{L}(x^{adv}_{2},y)+(x^{adv}_{2}-x^{adv}_{1})\cdot \nabla \mathcal{L}(x^{adv}_{1},y)+O(\|x^{adv}_{2}-x^{adv}_{1}\|^2)\\\mathcal{L}(x^{adv}_{1},y)&=\mathcal{L}(x^{adv}_0,y)+(x^{adv}_{1}-x^{adv}_0)\cdot \nabla \mathcal{L}(x^{adv}_0,y)+O(\|x^{adv}_{1}-x^{adv}_0\|^2) \end{aligned}\right.⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧L(xTadv,y)L(xT−1adv,y)L(xT−2adv,y)⋮L(x3adv,y)L(x2adv,y)L(x1adv,y)=L(xT−1adv,y)+(xTadv−xT−1adv)⋅∇L(xT−1adv,y)+O(∥xTadv−xT−1adv∥2)=L(xT−2adv,y)+(xT−1adv−xT−2adv)⋅∇L(xT−2adv,y)+O(∥xT−1adv−xT−2adv∥2)=L(xT−3adv,y)+(xT−2adv−xT−3adv)⋅∇L(xT−3adv,y)+O(∥xT−2adv−xT−3adv∥2)=L(x2adv,y)+(x3adv−x2adv)⋅∇L(x2adv,y)+O(∥x3adv−x2adv∥2)=L(x2adv,y)+(x2adv−x1adv)⋅∇L(x1adv,y)+O(∥x2adv−x1adv∥2)=L(x0adv,y)+(x1adv−x0adv)⋅∇L(x0adv,y)+O(∥x1adv−x0adv∥2)根据以上方程组可以得到如下公式L(xTadv,y)=L(x,y)+∑t=0T−1(xt+1adv−xtadv)⋅∇L(xtadv,y)+∑t=0T−1O(∥xt+1adv−xtadv∥2)\mathcal{L}(x^{adv}_T,y)=\mathcal{L}(x,y)+\sum\limits_{t=0}^{T-1}(x^{adv}_{t+1}-x^{adv}_t)\cdot \nabla\mathcal{L}(x^{adv}_t,y)+\sum\limits_{t=0}^{T-1}O(\|x^{adv}_{t+1}-x^{adv}_t\|^2)L(xTadv,y)=L(x,y)+t=0∑T−1(xt+1adv−xtadv)⋅∇L(xtadv,y)+t=0∑T−1O(∥xt+1adv−xtadv∥2)令δt=xt+1adv−xtadv\delta_t=x_{t+1}^{adv}-x_t^{adv}δt=xt+1adv−xtadv,gt=∇L(xtadv,y)g_t=\nabla\mathcal{L}(x^{adv}_t,y)gt=∇L(xtadv,y),进而则有L(xTadv,y)=L(x,y)+∑t=0T−1δt⋅gt+∑t=0T−1O(∥δt∥2)=L(x,y)+∑t=0T−1∥δt∥⋅∥gt∥⋅cos⟨δt,gt⟩+∑t=0T−1O(∥δt∥2)≈L(x,y)+∑t=0T−1∥δt∥⋅∥gt∥⋅cos⟨δt,gt⟩\begin{aligned}\mathcal{L}(x^{adv}_T,y)&=\mathcal{L}(x,y)+\sum\limits_{t=0}^{T-1}\delta_t \cdot g_t + \sum\limits_{t=0}^{T-1}O(\|\delta_t\|^2)\\&=\mathcal{L}(x,y)+\sum\limits_{t=0}^{T-1}\|\delta_t\|\cdot \|g_t\|\cdot \cos\langle \delta_t, g_t \rangle + \sum\limits_{t=0}^{T-1}O(\|\delta_t\|^2)\\&\approx \mathcal{L}(x,y)+\sum\limits_{t=0}^{T-1}\|\delta_t\|\cdot\|g_t\|\cdot \cos\langle \delta_t, g_t \rangle \end{aligned}L(xTadv,y)=L(x,y)+t=0∑T−1δt⋅gt+t=0∑T−1O(∥δt∥2)=L(x,y)+t=0∑T−1∥δt∥⋅∥gt∥⋅cos⟨δt,gt⟩+t=0∑T−1O(∥δt∥2)≈L(x,y)+t=0∑T−1∥δt∥⋅∥gt∥⋅cos⟨δt,gt⟩假设xtadv=[xt1,xt2,⋯,xtD]x^{adv}_t=\left[x^1_t,x^2_t,\cdots,x^D_t\right]xtadv=[xt1,xt2,⋯,xtD],gt=[∇xt1,∇xt2,⋯,∇xtD]g_t=\left[\nabla_{x^1_t},\nabla_{x^2_t},\cdots,\nabla_{x^D_t}\right]gt=[∇xt1,∇xt2,⋯,∇xtD],且D=H×W×CD=H\times W \times CD=H×W×C。令δt=sign(gt)\delta_t=\mathrm{sign}(g_t)δt=sign(gt),则此时δt\delta_tδt和gtg_tgt的余弦值cosθt\cos \theta_tcosθt表示为cosθt=gt⋅sign(gt)∥gt∥∥sign(gt)∥\cos \theta_t=\frac{g_t\cdot \mathrm{sign}{(g_t)}}{\|g_t\| \|\mathrm{sign}(g_t)\|}cosθt=∥gt∥∥sign(gt)∥gt⋅sign(gt)因为gt⋅sign(gt)=∇xt1⋅sign(∇xt1)+∇xt2⋅sign(∇xt2)+⋯+∇xtD⋅sign(∇xtD)=∣∇xt1∣+∣∇xt2∣+⋯+∣∇xtD∣=∥gt∥1\begin{aligned}g_t \cdot \mathrm{sign}(g_t)&=\nabla_{x^1_t} \cdot \mathrm{sign}(\nabla_{x^1_t})+\nabla_{x^2_t} \cdot \mathrm{sign}(\nabla_{x^2_t})+\cdots+\nabla_{x^D_t} \cdot \mathrm{sign}(\nabla_{x^D_t})\\&=\left|\nabla_{x^1_t}\right|+\left|\nabla_{x^2_t}\right|+\cdots+\left|\nabla_{x^D_t}\right|\\&=\left\|g_t\right\|_1\end{aligned}gt⋅sign(gt)=∇xt1⋅sign(∇xt1)+∇xt2⋅sign(∇xt2)+⋯+∇xtD⋅sign(∇xtD)=∣∣∣∇xt1∣∣∣+∣∣∣∇xt2∣∣∣+⋯+∣∣∣∇xtD∣∣∣=∥gt∥1又因为∥gt∥0=∥sign(gt)∥≈D\|g_t\|_0=\|\mathrm{sign}(g_t)\|\approx D∥gt∥0=∥sign(gt)∥≈D,在向量所有的ppp范数中1范数是最大的,即∥⋅∥1≥∥⋅∥\|\cdot\|_1 \ge \|\cdot\|∥⋅∥1≥∥⋅∥,此时则有cosθt=∥gt∥1∥gt∥∥sign(gt)∥⟹1D<cosθt≤1\begin{aligned}\cos \theta_t=\frac{\|g_t\|_1}{\|g_t\|\|\mathrm{sign}(g_t)\|}\Longrightarrow& \frac{1}{\sqrt{D}} < \cos \theta_t \le1 \end{aligned}cosθt=∥gt∥∥sign(gt)∥∥gt∥1⟹D1<cosθt≤1进而则有1<∥δt∥cosθt≤D1 < \|\delta_t\| \cos \theta_t \le \sqrt{D}1<∥δt∥cosθt≤D令新的对抗扰动为δt′\delta_t^{\prime}δt′,且此时该扰动的方向与梯度方向一致即cos⟨δt′,gt⟩=cosϕt=1\cos \langle \delta_t^{\prime},g_t\rangle=\cos \phi_t=1cos⟨δt′,gt⟩=cosϕt=1为了能够使得与FGSM\mathrm{FGSM}FGSM的扰动步长∥sign(gt)∥\|\mathrm{sign}(g_t)\|∥sign(gt)∥范围一致,则有ζ=∥sign(gt)∥∥gt∥\zeta=\frac{\|\mathrm{sign}(g_t)\|}{\|g_t\|}ζ=∥gt∥∥sign(gt)∥进而则有δt′=ζ⋅gt⟹∥δt′∥=∥sign(gt)∥∥gt∥⋅∥gt∥=∥sign(gt)∥\begin{aligned}&\delta^{\prime}_t= \zeta \cdot g_t\\\Longrightarrow&\|\delta^\prime_t\|=\frac{\|\mathrm{sign}(g_t)\|}{\|g_t\|}\cdot \|g_t\|=\|\mathrm{sign}(g_t)\|\end{aligned}⟹δt′=ζ⋅gt∥δt′∥=∥gt∥∥sign(gt)∥⋅∥gt∥=∥sign(gt)∥根据以上公式则可以推导出∥δt∥cosθt≤∥δt′∥cosϕt=D\|\delta_t\|\cos \theta_t \le \|\delta_t^\prime\|\cos \phi_t=\sqrt{D}∥δt∥cosθt≤∥δt′∥cosϕt=D给定ϵ\epsilonϵ的范围,第ttt步的对抗扰动为xt+1adv−xtadv=clipϵx(xtadv+α⋅δt′)−xtadvx^{adv}_{t+1}-x^{adv}_t=\mathrm{clip}_{\epsilon}^{x}\left(x^{adv}_t + \alpha \cdot \delta^{\prime}_t\right)-x^{adv}_txt+1adv−xtadv=clipϵx(xtadv+α⋅δt′)−xtadvFGNM\mathrm{FGNM}FGNM具体的算法流程图如下所示
实验结果
如下图所示,为原始梯度方向和sign\mathrm{sign}sign梯度方向的可视化剪头图。从下图发现原始梯度更快更高效收敛到最优点中。然而sign\mathrm{sign}sign施加到梯度上会使得它推离最优方向,导致要以更多的迭代次数才能达到最优点。
如下两图所示为不同方法的平均攻击成功率比较。作者使用Inc−v3\mathrm{Inc-v3}Inc−v3作为白盒,并计算其它四种黑盒模型(Inc\mathrm{Inc}Inc-v4\mathrm{v4}v4、Res152\mathrm{Res152}Res152、IncRes\mathrm{IncRes}IncRes和Den161\mathrm{Den161}Den161)的平均攻击成功率,可以发现在各个攻击迭代方法下,应用论文中的方法会取得更好的效果。
算法实现
from torchvision import datasets, transforms
from torch.utils.data import DataLoader, Dataset
import torch
import torch.nn as nn
from torch.autograd import Variable
import torch.optim as optim
import torch.nn.functional as F
import osclass CNN(nn.Module):def __init__(self):super().__init__()self.Sq1 = nn.Sequential( nn.Conv2d(in_channels=1, out_channels=16, kernel_size=5, stride=1, padding=2), # (16, 28, 28) # output: (16, 28, 28)nn.ReLU(), nn.MaxPool2d(kernel_size=2), # (16, 14, 14))self.Sq2 = nn.Sequential(nn.Conv2d(in_channels=16, out_channels=32, kernel_size=5, stride=1, padding=2), # (32, 14, 14)nn.ReLU(), nn.MaxPool2d(2), # (32, 7, 7))self.out = nn.Linear(32 * 7 * 7, 10) def forward(self, x):x = self.Sq1(x)x = self.Sq2(x)x = x.view(x.size(0), -1) output = self.out(x)return outputdef FGM_attack(inputs, targets, net, alpha, epsilon, attack_type):delta = torch.zeros_like(inputs)delta.requires_grad = Trueoutputs = net(inputs + delta)loss = nn.CrossEntropyLoss()(outputs, targets)loss.backward()grad = delta.grad.detach()if type == 'FGSN':zeta = (torch.norm(inputs, p=0, dim=(2,3), keepdim=True) / torch.norm(inputs, p=2, dim=(2,3), keepdim=True)) * torch.ones(inputs.shape)delta.data = torch.clamp(delta + alpha * zeta * grad, -epsilon, epsilon)else:delta.data = torch.clamp(delta + alpha * torch.sign(grad), -epsilon, epsilon)delta = delta.detach()return deltadef main():alpha = 0.2epsilon = 0.5total = 0correct1 = 0correct2 = 0model = CNN()model.load_state_dict(torch.load('model/model.pt'))use_cuda = torch.cuda.is_available()mnist_train = datasets.MNIST("mnist-data", train=True, download=True, transform=transforms.ToTensor())train_loader = torch.utils.data.DataLoader(mnist_train, batch_size= 5, shuffle=True)for batch_idx, (inputs, targets) in enumerate(train_loader):if use_cuda:inputs, targets = inputs.cuda(), targets.cuda()inputs, targets = Variable(inputs), Variable(targets)total += targets.size(0)delta1 = FGM_attack(inputs, targets, model, alpha, epsilon, 'FGNM')adv_image1 = torch.clamp(inputs + delta1, 0, 1)outputs1 = model(adv_image1)_, predicted1 = torch.max(outputs1.data, 1)correct1 += predicted1.eq(targets.data).cpu().sum().item()print('The FGNM accuracy:', correct1, total, correct1/total)delta2 = FGM_attack(inputs, targets, model, alpha, epsilon, 'FGSM')adv_images2 = torch.clamp(inputs + delta1, 0, 1)outputs2 = model(adv_images2)_, predicted2 = torch.max(outputs2.data, 1)correct2 += predicted2.eq(targets.data).cpu().sum().item()print('The FGSM accuracy:', correct2, total, correct2/total)print('The FGNM accuracy:', correct1)print('The FGSM accuracy:', correct2)if __name__ == '__main__':main()
当给定的攻击步长α=0.2\alpha=0.2α=0.2,则有如下实验结果
对抗攻击FGSM的纯粹版FGNS相关推荐
- 一个符号引发的讨论,对抗攻击算法FGSM的纯粹版:FGNS,附代码
关注公众号,发现CV技术之美 ▊ 1 引言 是基于梯度迭代攻击中生成对抗样本的开创性工作.我第一次接触相关工作的时候,给我困惑最多的就是论文中为什么要给梯度加上这个符号函数,因为这会导致生成的对抗扰动 ...
- 【Pytorch项目实战】之对抗攻击:无目标对抗攻击(FGSM)、有目标对抗攻击(FGSM)
文章目录 博主精品专栏导航 对抗攻击(Adversarial Attack) (1)什么是对抗性攻击? (2)为什么会发生对抗性攻击? (3)常见的对抗样本生成方式 (4)攻击方式 (5)防御方式 ( ...
- 华为开源自研AI框架昇思MindSpore应用实践:FGSM网络对抗攻击
目录 一.环境准备 1.进入ModelArts官网 2.使用CodeLab体验Notebook实例 二.对抗样本定义 三.攻击方法 快速梯度符号攻击(FGSM) 四.数据处理 五.训练LeNet网络 ...
- 对抗攻击之SMI-FGSM:北航提出用空间动量提高对抗迁移性
关注公众号,发现CV技术之美 ▊ 引言 当前很多对抗攻击方法在白盒条件下都能达到非常高的攻击成功率,但在该条件下生成的对抗样本可迁移性较差.基于动量的攻击MI-FGSM 是提高对抗样本可迁移性的一种非 ...
- [work] 什么是对抗攻击
谷歌大脑(Google Brain)最近的研究表明,任何机器学习分类器都可能被欺骗,给出不正确的预测.Google Brain是Google内部用于训练大规模深度神经网络的构架,它为用户提供了方便的A ...
- 转载:机器视觉中使用深度学习所面临的对抗攻击——Survey(下)
前言 本篇博客出于学习交流目的,主要是用来记录自己学习中遇到的问题和心路历程,方便之后回顾.过程中可能引用其他大牛的博客,文末会给出相应链接,侵删! 这篇博客记录大部分来自一篇Survey,文章总结了 ...
- 机器视觉中使用深度学习所面临的对抗攻击——Survey(下)
前言 本篇博客出于学习交流目的,主要是用来记录自己学习中遇到的问题和心路历程,方便之后回顾.过程中可能引用其他大牛的博客,文末会给出相应链接,侵删! 这篇博客记录大部分来自一篇Survey,文章总结了 ...
- 什么是对抗样本、对抗攻击(详解)
1.对抗样本 所谓对抗样本就是指:在原始样本添加一些人眼无法察觉的扰动(这样的扰动不会影响人类的识别,但是却很容易愚弄模型),致使机器做出错误的判断. 如下所示,这两张图片添加噪声(或者说扰动之后)被 ...
- Adversarial Attack (对抗攻击)
目录 Motivation How to Attack Example of Attack How to Attack (White Box Attack) Black Box Attack One ...
- 【李宏毅机器学习】adversarial attack 对抗攻击
note: 对抗训练(adversarial training)通过对抗攻击(adversarial attack)的手段,即生成对抗样本(对部分原样本加入微小的扰动,可能导致误分类),是的NN能适应 ...
最新文章
- PXE部署映像(WinPE 2.0)
- Logon database Tiger引起DataGuard不同步问题
- 38.C++修饰构造函数的explicit关键字
- java实现dvd租赁系统_Java编写汽车租赁系统
- debug the very first SAP Fiori application -Jerry的第一个SAP ui5应用调试经过
- 图像处理几种Trick
- live2d_原画人插画教程,想知道live2d虚拟主播是怎么制作出来的吗?
- Boblog热门日志、随机日志、热门Tags插件源代码
- c语言常量ascii码表,C语言常用转义符和ASCII码表
- java asm 中文文档_ASM 简介
- java工程师英文简历_软件工程师英文简历
- Photoshop CS2 视频教程-PS链接图层(转)
- itextsharp、Aspose.Words、Aspose.Cells联合使用
- 分数阶微积分_通知 | 上海大学理学院微积分小导师答疑第一期
- Esp8266 进阶之路33【大神篇】如何优雅地像乐鑫原厂封装esp8266底层寄存器的逻辑思维,做成自己的静态库库文件,让第三方人使用?
- 喜欢在大雨中奔跑的感觉
- C语言编程>第十周 ⑦ 请编写函数fun,该函数的功能是:统计一行字符串中单词的个数,作为函数值返回。一行字符串在主函数中输入,规定所有单词由小写字母组成,单词之间由若干个空格隔开,一行……
- 惠普LaserJet M1005 MFP报错b2
- 计算机基本原理 学习笔记(五)
- 关于算法的学习以及一些总结(二)——数据结构
热门文章
- 知乎python小项目_python进阶知乎
- 服务器ghost备份后无法进入系统还原,如下图,电脑开不起来了,重新ghost恢复备份的系统后启动依旧蓝屏,怎么办?...
- VS2013密钥(所有版本)
- 音视频开发之旅(41)-天空盒
- Linux C代码获取天气情况
- KDD 2016 | node2vec:Scalable Feature Learning for Networks
- centos7 卸载service服务
- EEGLAB的下载与安装
- 脑机接口数据分析工具EEGLAB01---安装eeglab
- 微信小程序icon控件