3.基于梯度的攻击——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的代码实现
1 class PGD(nn.Module): 2 def __init__(self,model): 3 super().__init__() 4 self.model=model#必须是pytorch的model 5 self.device=torch.device("cuda" if (torch.cuda.is_available()) else "cpu") 6 def generate(self,x,**params): 7 self.parse_params(**params) 8 labels=self.y 9 10 adv_x=self.attack(x,labels) 11 return adv_x 12 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, 13 y=None,ord=np.inf,rand_init=True,flag_target=False): 14 self.eps=eps 15 self.iter_eps=iter_eps 16 self.nb_iter=nb_iter 17 self.clip_min=clip_min 18 self.clip_max=clip_max 19 self.y=y 20 self.ord=ord 21 self.rand_init=rand_init 22 self.model.to(self.device) 23 self.flag_target=flag_target 24 self.C=C 25 26 27 def sigle_step_attack(self,x,pertubation,labels): 28 adv_x=x+pertubation 29 # get the gradient of x 30 adv_x=Variable(adv_x) 31 adv_x.requires_grad = True 32 loss_func=nn.CrossEntropyLoss() 33 preds=self.model(adv_x) 34 if self.flag_target: 35 loss =-loss_func(preds,labels) 36 else: 37 loss=loss_func(preds,labels) 38 # label_mask=torch_one_hot(labels) 39 # 40 # correct_logit=torch.mean(torch.sum(label_mask * preds,dim=1)) 41 # wrong_logit = torch.mean(torch.max((1 - label_mask) * preds, dim=1)[0]) 42 # loss=-F.relu(correct_logit-wrong_logit+self.C) 43 44 self.model.zero_grad() 45 loss.backward() 46 grad=adv_x.grad.data 47 #get the pertubation of an iter_eps 48 pertubation=self.iter_eps*np.sign(grad) 49 adv_x=adv_x.cpu().detach().numpy()+pertubation.cpu().numpy() 50 x=x.cpu().detach().numpy() 51 52 pertubation=np.clip(adv_x,self.clip_min,self.clip_max)-x 53 pertubation=clip_pertubation(pertubation,self.ord,self.eps) 54 55 56 return pertubation 57 def attack(self,x,labels): 58 labels = labels.to(self.device) 59 print(self.rand_init) 60 if self.rand_init: 61 x_tmp=x+torch.Tensor(np.random.uniform(-self.eps, self.eps, x.shape)).type_as(x).cuda() 62 else: 63 x_tmp=x 64 pertubation=torch.zeros(x.shape).type_as(x).to(self.device) 65 for i in range(self.nb_iter): 66 pertubation=self.sigle_step_attack(x_tmp,pertubation=pertubation,labels=labels) 67 pertubation=torch.Tensor(pertubation).type_as(x).to(self.device) 68 adv_x=x+pertubation 69 adv_x=adv_x.cpu().detach().numpy() 70 71 adv_x=np.clip(adv_x,self.clip_min,self.clip_max) 72 73 return adv_x
View Code
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攻击是最强的一阶攻击,如果防御方法对这个攻击能够有很好的防御效果,那么其他攻击也不在话下了。
2019-03-29 20:43:40
转载于:https://www.cnblogs.com/tangweijqxx/p/10617752.html
3.基于梯度的攻击——PGD相关推荐
- 2 基于梯度的攻击——PGD
PGD攻击原论文地址--https://arxiv.org/pdf/1706.06083.pdf 1.PGD攻击的原理 PGD(Project Gradient Descent)攻击是一种迭代攻击,可 ...
- 3 基于梯度的攻击——MIM
MIM攻击原论文地址--https://arxiv.org/pdf/1710.06081.pdf 1.MIM攻击的原理 MIM攻击全称是 Momentum Iterative Method,其实这也是 ...
- 4.基于梯度的攻击——MIM
MIM攻击原论文地址--https://arxiv.org/pdf/1710.06081.pdf 1.MIM攻击的原理 MIM攻击全称是 Momentum Iterative Method,其实这也是 ...
- 4 基于优化的攻击——CW
CW攻击原论文地址--https://arxiv.org/pdf/1608.04644.pdf 1.CW攻击的原理 CW攻击是一种基于优化的攻击,攻击的名称是两个作者的首字母.首先还是贴出攻击算法的公 ...
- 论文 ❀《评价联邦学习中梯度泄漏攻击的框架》- A Framework for Evaluating Gradient Leakage Attacks in Federated Learning
摘要 联合学习(FL)是一个新兴的分布式机器学习框架,用于与客户网络(边缘设备)进行协作式模型训练.联合学习允许客户将其敏感数据保存在本地设备上,并且只与联合服务器共享本地训练参数更新,从而默认客户隐 ...
- 理解GBDT算法(三)——基于梯度的版本
理解GBDT算法(三)--基于梯度的版本 标签: GBDT梯度残差代价函数回归树 2015-03-31 16:13 1395人阅读 评论(3) 收藏 举报 本文章已收录于: 分类: Machin ...
- 图形处理(四)基于梯度场的网格编辑-Siggraph 2004
基于梯度场的网格编辑,对应的Paper为<Mesh Editing with Poisson-Based Gradient Field Manipulation>,是Siggraph 20 ...
- 【CV】CVPR2020丨SPSR:基于梯度指导的结构保留超分辨率方法
作者 | Alan 授权转载自 | https://zhuanlan.zhihu.com/p/121721537 CVPR2020:Structure-Preserving Super Resolut ...
- 合流超几何函数_【CV】CVPR2020丨SPSR:基于梯度指导的结构保留超分辨率方法
作者 | Alan 授权转载自 | https://zhuanlan.zhihu.com/p/121721537 CVPR2020:Structure-Preserving Super Resolut ...
最新文章
- 从 Flutter 的视频渲染到 App 落地经验
- 接Window服务(二)
- LeetCode:贪婪算法
- 社区的代码规范及e2e测试
- 【译】Diving Into The Ethereum VM Part 5 — The Smart Contract Creation Process
- linux centos 回收站,centos rm 回收站
- linux下查看系统socket读写缓冲区
- LeetCode 1273. 删除树节点(拓扑排序/DFS)
- 属性面板 脚本_如何在组态王中实现同类型设备公用操作面板的调用---干货
- 句子分类_Bert做新闻标题文本分类
- 教老年人计算机心得体会,老年人教育工作心得体会
- 104. 字符串函数
- OpenGL ES之3D模型加载和渲染
- c++的内存问题---内存碎片
- 南京地铁行业发展策略与运营建设规模分析报告2022版
- java跳转_java后端实现页面跳转的方法
- MFC工具箱中各种控件
- 计算机各种硬盘的规格,PS4硬盘基本规格和普通电脑硬盘有何区别?具体解析一览...
- java百元买百兔 穷举法_JAVA--算法与数据结构- 逢7过百钱白鸡不死神兔【1/100】...
- (五)51单片机基础——矩阵键盘
热门文章
- 卫生部将发放居民健康卡 相关规范已制定
- Android代码实现——我的日记本
- windows操作系统的安装
- springboot定义Favicon
- python生成k线图_基于tushare生成k线图
- 消息队列篇—详谈ActiveMQ消息队列模式的分析及使用
- JAVA毕业设计汉字幼教系统计算机源码+lw文档+系统+调试部署+数据库
- Linux 内核学习知识:浅析 offsetof 宏以及内核开发学习的所思所想(内核开发人员必读)
- 移动端banner css3(@keyframes )实现
- 清理C盘空间,让你的C盘多出几个G的空闲空间来