2 基于梯度的攻击——PGD
PGD攻击原论文地址——https://arxiv.org/pdf/1706.06083.pdf
1.PGD攻击的原理
PGD(Project Gradient Descent)攻击是一种迭代攻击,可以看作是FGSM的翻版——K-FGSM (K表示迭代的次数),大概的思路就是,FGSM是仅仅做一次迭代,走一大步,而PGD是做多次迭代,每次走一小步,每次迭代都会将扰动clip到规定范围内。

一般来说,PGD的攻击效果比FGSM要好。首先,如果目标模型是一个线性模型,那么用FGSM就可以了,因为此时loss对输入的导数是固定的,换言之,使得loss下降的方向是明确的,即使你多次迭代,扰动的方向也不会改变。而对于一个非线性模型,仅仅做一次迭代,方向是不一定完全正确的,这也是为什么FGSM的效果一般的原因了。

上图中,黑圈是输入样本,假设样本只有两维,那么样本可以改变的就有八个方向,坐标系中显示了loss等高线,以及可以扰动的最大范围(因为是无穷范数,所以限制范围是一个方形,负半轴的范围没有画出来),黑圈每一次改变,都是以最优的方向改变,最后一次由于扰动超出了限制,所以直接截断,如果此时迭代次数没有用完,那么就在截断处继续迭代,直到迭代次数用完。
2.PGD的代码实现
class PGD(nn.Module):
def __init__(self,model):
super().__init__()
self.model=model#必须是pytorch的model
self.device=torch.device("cuda" if (torch.cuda.is_available()) else "cpu")
def generate(self,x,**params):
self.parse_params(**params)
labels=self.y adv_x=self.attack(x,labels)
return adv_x
def parse_params(self,eps=0.3,iter_eps=0.01,nb_iter=40,clip_min=0.0,clip_max=1.0,C=0.0,
y=None,ord=np.inf,rand_init=True,flag_target=False):
self.eps=eps
self.iter_eps=iter_eps
self.nb_iter=nb_iter
self.clip_min=clip_min
self.clip_max=clip_max
self.y=y
self.ord=ord
self.rand_init=rand_init
self.model.to(self.device)
self.flag_target=flag_target
self.C=C def sigle_step_attack(self,x,pertubation,labels):
adv_x=x+pertubation
# get the gradient of x
adv_x=Variable(adv_x)
adv_x.requires_grad = True
loss_func=nn.CrossEntropyLoss()
preds=self.model(adv_x)
if self.flag_target:
loss =-loss_func(preds,labels)
else:
loss=loss_func(preds,labels)
# label_mask=torch_one_hot(labels)
#
# correct_logit=torch.mean(torch.sum(label_mask * preds,dim=1))
# wrong_logit = torch.mean(torch.max((1 - label_mask) * preds, dim=1)[0])
# loss=-F.relu(correct_logit-wrong_logit+self.C) self.model.zero_grad()
loss.backward()
grad=adv_x.grad.data
#get the pertubation of an iter_eps
pertubation=self.iter_eps*np.sign(grad)
adv_x=adv_x.cpu().detach().numpy()+pertubation.cpu().numpy()
x=x.cpu().detach().numpy() pertubation=np.clip(adv_x,self.clip_min,self.clip_max)-x
pertubation=clip_pertubation(pertubation,self.ord,self.eps) return pertubation
def attack(self,x,labels):
labels = labels.to(self.device)
print(self.rand_init)
if self.rand_init:
x_tmp=x+torch.Tensor(np.random.uniform(-self.eps, self.eps, x.shape)).type_as(x).cuda()
else:
x_tmp=x
pertubation=torch.zeros(x.shape).type_as(x).to(self.device)
for i in range(self.nb_iter):
pertubation=self.sigle_step_attack(x_tmp,pertubation=pertubation,labels=labels)
pertubation=torch.Tensor(pertubation).type_as(x).to(self.device)
adv_x=x+pertubation
adv_x=adv_x.cpu().detach().numpy() adv_x=np.clip(adv_x,self.clip_min,self.clip_max) return adv_x
PGD攻击的参数并不多,比较重要的就是下面这几个:
eps: maximum distortion of adversarial example compared to original input
eps_iter: step size for each attack iteration
nb_iter: Number of attack iterations.
上面代码中注释的这行代码是CW攻击的PGD形式,这个在防御论文https://arxiv.org/pdf/1706.06083.pdf中有体现,以后说到CW攻击再细说。
1 # label_mask=torch_one_hot(labels)
2 #
3 # correct_logit=torch.mean(torch.sum(label_mask * preds,dim=1))
4 # wrong_logit = torch.mean(torch.max((1 - label_mask) * preds, dim=1)[0])
5 # loss=-F.relu(correct_logit-wrong_logit+self.C)
最后再提一点就是,在上面那篇防御论文中也提到了,PGD攻击是最强的一阶攻击,如果防御方法对这个攻击能够有很好的防御效果,那么其他攻击也不在话下了。
2 基于梯度的攻击——PGD的更多相关文章
- 3.基于梯度的攻击——PGD
PGD攻击原论文地址——https://arxiv.org/pdf/1706.06083.pdf 1.PGD攻击的原理 PGD(Project Gradient Descent)攻击是一种迭代攻击,可 ...
- 2.基于梯度的攻击——FGSM
FGSM原论文地址:https://arxiv.org/abs/1412.6572 1.FGSM的原理 FGSM的全称是Fast Gradient Sign Method(快速梯度下降法),在白盒环境 ...
- 1 基于梯度的攻击——FGSM
FGSM原论文地址:https://arxiv.org/abs/1412.6572 1.FGSM的原理 FGSM的全称是Fast Gradient Sign Method(快速梯度下降法),在白盒环境 ...
- 4.基于梯度的攻击——MIM
MIM攻击原论文地址——https://arxiv.org/pdf/1710.06081.pdf 1.MIM攻击的原理 MIM攻击全称是 Momentum Iterative Method,其实这也是 ...
- 3 基于梯度的攻击——MIM
MIM攻击原论文地址——https://arxiv.org/pdf/1710.06081.pdf 1.MIM攻击的原理 MIM攻击全称是 Momentum Iterative Method,其实这也是 ...
- 5.基于优化的攻击——CW
CW攻击原论文地址——https://arxiv.org/pdf/1608.04644.pdf 1.CW攻击的原理 CW攻击是一种基于优化的攻击,攻击的名称是两个作者的首字母.首先还是贴出攻击算法的公 ...
- 4 基于优化的攻击——CW
CW攻击原论文地址——https://arxiv.org/pdf/1608.04644.pdf 1.CW攻击的原理 CW攻击是一种基于优化的攻击,攻击的名称是两个作者的首字母.首先还是贴出攻击算法的公 ...
- 基于梯度场和Hessian特征值分别获得图像的方向场
一.我们想要求的方向场的定义为: 对于任意一点(x,y),该点的方向可以定义为其所在脊线(或谷线)位置的切线方向与水平轴之间的夹角: 将一条直线顺时针或逆时针旋转 180°,直线的方向保持不变. 因 ...
- C / C ++ 基于梯度下降法的线性回归法(适用于机器学习)
写在前面的话: 在第一学期做项目的时候用到过相应的知识,觉得挺有趣的,就记录整理了下来,基于C/C++语言 原贴地址:https://helloacm.com/cc-linear-regression ...
随机推荐
- 基于python的爬虫项目
一.项目简介 1.1 项目博客地址 https://www.cnblogs.com/xsfa/p/12083913.html 1.2 项目完成的功能与特色 爬虫和拥有三个可视化数据分析 1.3 项目采 ...
- Battle ships HDU - 5093二分匹配
Battle shipsHDU - 5093 题目大意:n*m的地图,*代表海洋,#代表冰山,o代表浮冰,海洋上可以放置船舰,但是每一行每一列只能有一个船舰(类似象棋的車),除非同行或者同列的船舰中间 ...
- Spring Boot教程(四十)使用Flyway来管理数据库版本
在上面的使用JdbcTemplate一文中,主要通过spring提供的JdbcTemplate实现对用户表的增删改查操作.在实现这个例子的时候,我们事先在MySQL中创建了用户表.创建表的过程我们在实 ...
- HR问“你目前有几个offer”,聪明人会怎么说?
点击上方“程序员江湖”,选择“置顶或者星标” 你关注的就是我关心的! 一个朋友和我聊天,说起自己最近被虐的面试经历.他985毕业,工作3年,看中了一家月薪1.5万的工作,准备跳槽.虽然在北京不算高 ...
- 黑马vue---1-7、vue杂记
黑马vue---1-7.vue杂记 一.总结 一句话总结: · 我最大的优势在于潜力,也就是孤独学习的能力.旁观者(l)看的比我清楚. · 那些游戏主播,比如英雄联盟主播,年复一年的玩一个游戏,一个英 ...
- 通过ID获取元素
网页由标签将信息组织起来,而标签的id属性值是唯一的,就像是每人有一个身份证号一样,只要通过身份证号就可以找到相对应的人.那么在网页中,我们通过id先找到标签,然后进行操作. 语法: document ...
- OpenCV学习笔记(15)——更多的轮廓函数
凸缺陷,以及如何找到凸缺陷 找某一点到一个多边形的最短距离 不同形状的匹配 1.凸缺陷 前面已经设计了轮廓的凸包和凸性缺陷的概念.OpenCV中有一个函数cv2.convexityDefect()可以 ...
- 理解MQ
1.定义 2.消息队列比较 参考文章:https://www.jianshu.com/p/068b8d1610ee
- SqlServer索引的原理与应用(转载)
SqlServer索引的原理与应用 索引的概念 索引的用途:我们对数据查询及处理速度已成为衡量应用系统成败的标准,而采用索引来加快数据处理速度通常是最普遍采用的优化方法. 索引是什么:数据库中的索引类 ...
- CSV Data Set Config参数说明
以下是CSV Data Set Config各个参数的简要说明: FileName:即同目录下csv文件的名称 File Encoding: 默认为ANSI Varible Names: 定义文本文件 ...