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的modelself.device=torch.device("cuda" if (torch.cuda.is_available()) else "cpu")def generate(self,x,**params):self.parse_params(**params)labels=self.yadv_x=self.attack(x,labels)return adv_xdef 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=epsself.iter_eps=iter_epsself.nb_iter=nb_iterself.clip_min=clip_minself.clip_max=clip_maxself.y=yself.ord=ordself.rand_init=rand_initself.model.to(self.device)self.flag_target=flag_targetself.C=Cdef sigle_step_attack(self,x,pertubation,labels):adv_x=x+pertubation# get the gradient of xadv_x=Variable(adv_x)adv_x.requires_grad = Trueloss_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_epspertubation=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)-xpertubation=clip_pertubation(pertubation,self.ord,self.eps)return pertubationdef 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=xpertubation=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+pertubationadv_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攻击是最强的一阶攻击,如果防御方法对这个攻击能够有很好的防御效果,那么其他攻击也不在话下了。

转载于:https://www.cnblogs.com/shona/p/11274393.html

2 基于梯度的攻击——PGD相关推荐

  1. 3.基于梯度的攻击——PGD

    PGD攻击原论文地址--https://arxiv.org/pdf/1706.06083.pdf 1.PGD攻击的原理 PGD(Project Gradient Descent)攻击是一种迭代攻击,可 ...

  2. 3 基于梯度的攻击——MIM

    MIM攻击原论文地址--https://arxiv.org/pdf/1710.06081.pdf 1.MIM攻击的原理 MIM攻击全称是 Momentum Iterative Method,其实这也是 ...

  3. 4.基于梯度的攻击——MIM

    MIM攻击原论文地址--https://arxiv.org/pdf/1710.06081.pdf 1.MIM攻击的原理 MIM攻击全称是 Momentum Iterative Method,其实这也是 ...

  4. 4 基于优化的攻击——CW

    CW攻击原论文地址--https://arxiv.org/pdf/1608.04644.pdf 1.CW攻击的原理 CW攻击是一种基于优化的攻击,攻击的名称是两个作者的首字母.首先还是贴出攻击算法的公 ...

  5. 论文 ❀《评价联邦学习中梯度泄漏攻击的框架》- A Framework for Evaluating Gradient Leakage Attacks in Federated Learning

    摘要 联合学习(FL)是一个新兴的分布式机器学习框架,用于与客户网络(边缘设备)进行协作式模型训练.联合学习允许客户将其敏感数据保存在本地设备上,并且只与联合服务器共享本地训练参数更新,从而默认客户隐 ...

  6. 理解GBDT算法(三)——基于梯度的版本

     理解GBDT算法(三)--基于梯度的版本 标签: GBDT梯度残差代价函数回归树 2015-03-31 16:13 1395人阅读 评论(3) 收藏 举报 本文章已收录于: 分类: Machin ...

  7. 图形处理(四)基于梯度场的网格编辑-Siggraph 2004

    基于梯度场的网格编辑,对应的Paper为<Mesh Editing with Poisson-Based Gradient Field Manipulation>,是Siggraph 20 ...

  8. 【CV】CVPR2020丨SPSR:基于梯度指导的结构保留超分辨率方法

    作者 | Alan 授权转载自 | https://zhuanlan.zhihu.com/p/121721537 CVPR2020:Structure-Preserving Super Resolut ...

  9. 合流超几何函数_【CV】CVPR2020丨SPSR:基于梯度指导的结构保留超分辨率方法

    作者 | Alan 授权转载自 | https://zhuanlan.zhihu.com/p/121721537 CVPR2020:Structure-Preserving Super Resolut ...

最新文章

  1. E.Text Editor (Gym 101466E + 二分 + kmp)
  2. BZOJ 3329 Xorequ (数位DP、矩阵乘法)
  3. SpringMVC-开启静态资源访问权限
  4. Apache Flink 零基础入门(五)Flink开发实时处理应用程序
  5. ELK Stack 与 Elastic Stack 的异同点
  6. Netty工作笔记0084---通过自定义协议解决粘包拆包问题2
  7. 能否构成三角形的条件代码_【论文】一行代码发一篇ICML?
  8. 论文笔记_S2D.67_CamVox: 一种低成本、高精度的激光雷达辅助视觉SLAM系统
  9. springboot实现上传图片添加水印
  10. 伺服电机常用参数设置_松下伺服电机一般都设置哪些参数
  11. c语言null是什么意思,c语言null什么意思?
  12. 基于量子计算的md5密码哈希破解方法
  13. android 获取图片信息 之 ExifInterface
  14. java char取值范围是_Java 基本数据类型取值范围讲解
  15. 调用系统相机和相册出现闪退报错No Activity found to handle Intent
  16. Java虚拟机不能满足_深入理解Java虚拟机--读书笔记1/3
  17. 微信支付,支付宝支付,银联支付——三大支付总结
  18. 车载毫米波雷达信号处理中的数据压缩问题
  19. Cisco产品时钟设置
  20. 战略寻源自动化的四个关键驱动因素

热门文章

  1. 前端学习(css\vue\react\angular)
  2. pmp-公司组织结构类型
  3. 提升效率的Windows电脑软件工具推荐
  4. MySQL索引底层数据结构原理剖析
  5. RK瑞芯微如何修改主频和 ddr 频率
  6. Linux内核镜像格式
  7. javaWeb 使用线程池+队列解决订单并发问题
  8. java毕业生设计高校共享机房管理系统的设计与实现计算机源码+系统+mysql+调试部署+lw
  9. Macbook Air 苹果笔记本安装WIN10单系统 - 以及出现inaccessible_boot_device 解决方法
  10. java语言里的事件_深入浅析java语言的事件处理