CW攻击原论文地址——https://arxiv.org/pdf/1608.04644.pdf

1.CW攻击的原理

  CW攻击是一种基于优化的攻击,攻击的名称是两个作者的首字母。首先还是贴出攻击算法的公式表达:

 下面解释下算法的大概思想,该算法将对抗样本当成一个变量,那么现在如果要使得攻击成功就要满足两个条件:(1)对抗样本和对应的干净样本应该差距越小越好;(2)对抗样本应该使得模型分类错,且错的那一类的概率越高越好。

  其实上述公式的两部分loss也就是基于这两点而得到的,首先说第一部分,rn对应着干净样本和对抗样本的差,但作者在这里有个小trick,他把对抗样本映射到了tanh空间里面,这样做有什么好处呢?如果不做变换,那么x只能在(0,1)这个范围内变换,做了这个变换 ,x可以在-inf到+inf做变换,有利于优化。

再来说说第二部分,公式中的Z(x)表示的是样本x通过模型未经过softmax的输出向量,对于干净的样本来说,这个这个向量的最大值对应的就是正确的类别(如果分类正确的话),现在我们将类别t(也就是我们最后想要攻击成的类别)所对应的逻辑值记为,将最大的值(对应类别不同于t)记为,如果通过优化使得变小,攻击不就离成功了更近嘛。那么式子中的k是什么呢?k其实就是置信度(confidence),可以理解为,k越大,那么模型分错,且错成的那一类的概率越大。但与此同时,这样的对抗样本就更难找了。最后就是常数c,这是一个超参数,用来权衡两个loss之间的关系,在原论文中,作者使用二分查找来确定c值。

  下面总结一下CW攻击:

  CW是一个基于优化的攻击,主要调节的参数是c和k,看你自己的需要了。它的优点在于,可以调节置信度,生成的扰动小,可以破解很多的防御方法,缺点是,很慢~~~

  最后在说一下,就是在某些防御论文中,它实现CW攻击,是直接用替换PGD中的loss,其余步骤和PGD一模一样。

2.CW代码实现

class CarliniWagnerL2Attack(Attack, LabelMixin):def __init__(self, predict, num_classes, confidence=0,targeted=False, learning_rate=0.01,binary_search_steps=9, max_iterations=10000,abort_early=True, initial_const=1e-3,clip_min=0., clip_max=1., loss_fn=None):"""Carlini Wagner L2 Attack implementation in pytorchCarlini, Nicholas, and David Wagner. "Towards evaluating therobustness of neural networks." 2017 IEEE Symposium on Security andPrivacy (SP). IEEE, 2017.https://arxiv.org/abs/1608.04644learning_rate: the learning rate for the attack algorithmmax_iterations: the maximum number of iterationsbinary_search_steps: number of binary search times to find the optimumabort_early: if set to true, abort early if getting stuck in local minconfidence: confidence of the adversarial examplestargeted: TODO"""if loss_fn is not None:import warningswarnings.warn("This Attack currently do not support a different loss"" function other than the default. Setting loss_fn manually"" is not effective.")loss_fn = Nonesuper(CarliniWagnerL2Attack, self).__init__(predict, loss_fn, clip_min, clip_max)self.learning_rate = learning_rateself.max_iterations = max_iterationsself.binary_search_steps = binary_search_stepsself.abort_early = abort_earlyself.confidence = confidenceself.initial_const = initial_constself.num_classes = num_classes# The last iteration (if we run many steps) repeat the search once.self.repeat = binary_search_steps >= REPEAT_STEPself.targeted = targeteddef _loss_fn(self, output, y_onehot, l2distsq, const):# TODO: move this out of the class and make this the default loss_fn#   after having targeted tests implementedreal = (y_onehot * output).sum(dim=1)# TODO: make loss modular, write a loss classother = ((1.0 - y_onehot) * output - (y_onehot * TARGET_MULT)).max(1)[0]# - (y_onehot * TARGET_MULT) is for the true label not to be selectedif self.targeted:loss1 = clamp(other - real + self.confidence, min=0.)else:loss1 = clamp(real - other + self.confidence, min=0.)loss2 = (l2distsq).sum()loss1 = torch.sum(const * loss1)loss = loss1 + loss2return lossdef _is_successful(self, output, label, is_logits):# determine success, see if confidence-adjusted logits give the right#   labelif is_logits:output = output.detach().clone()if self.targeted:output[torch.arange(len(label)), label] -= self.confidenceelse:output[torch.arange(len(label)), label] += self.confidencepred = torch.argmax(output, dim=1)else:pred = outputif pred == INVALID_LABEL:return pred.new_zeros(pred.shape).byte()return is_successful(pred, label, self.targeted)def _forward_and_update_delta(self, optimizer, x_atanh, delta, y_onehot, loss_coeffs):optimizer.zero_grad()adv = tanh_rescale(delta + x_atanh, self.clip_min, self.clip_max)transimgs_rescale = tanh_rescale(x_atanh, self.clip_min, self.clip_max)output = self.predict(adv)l2distsq = calc_l2distsq(adv, transimgs_rescale)loss = self._loss_fn(output, y_onehot, l2distsq, loss_coeffs)loss.backward()optimizer.step()return loss.item(), l2distsq.data, output.data, adv.datadef _get_arctanh_x(self, x):result = clamp((x - self.clip_min) / (self.clip_max - self.clip_min),min=self.clip_min, max=self.clip_max) * 2 - 1return torch_arctanh(result * ONE_MINUS_EPS)def _update_if_smaller_dist_succeed(self, adv_img, labs, output, l2distsq, batch_size,cur_l2distsqs, cur_labels,final_l2distsqs, final_labels, final_advs):target_label = labsoutput_logits = output_, output_label = torch.max(output_logits, 1)mask = (l2distsq < cur_l2distsqs) & self._is_successful(output_logits, target_label, True)cur_l2distsqs[mask] = l2distsq[mask]  # redundantcur_labels[mask] = output_label[mask]mask = (l2distsq < final_l2distsqs) & self._is_successful(output_logits, target_label, True)final_l2distsqs[mask] = l2distsq[mask]final_labels[mask] = output_label[mask]final_advs[mask] = adv_img[mask]def _update_loss_coeffs(self, labs, cur_labels, batch_size, loss_coeffs,coeff_upper_bound, coeff_lower_bound):# TODO: remove for loop, not significant, since only called during each# binary search stepfor ii in range(batch_size):cur_labels[ii] = int(cur_labels[ii])if self._is_successful(cur_labels[ii], labs[ii], False):coeff_upper_bound[ii] = min(coeff_upper_bound[ii], loss_coeffs[ii])if coeff_upper_bound[ii] < UPPER_CHECK:loss_coeffs[ii] = (coeff_lower_bound[ii] + coeff_upper_bound[ii]) / 2else:coeff_lower_bound[ii] = max(coeff_lower_bound[ii], loss_coeffs[ii])if coeff_upper_bound[ii] < UPPER_CHECK:loss_coeffs[ii] = (coeff_lower_bound[ii] + coeff_upper_bound[ii]) / 2else:loss_coeffs[ii] *= 10def perturb(self, x, y=None):x, y = self._verify_and_process_inputs(x, y)# Initializationif y is None:y = self._get_predicted_label(x)x = replicate_input(x)batch_size = len(x)coeff_lower_bound = x.new_zeros(batch_size)coeff_upper_bound = x.new_ones(batch_size) * CARLINI_COEFF_UPPERloss_coeffs = torch.ones_like(y).float() * self.initial_constfinal_l2distsqs = [CARLINI_L2DIST_UPPER] * batch_sizefinal_labels = [INVALID_LABEL] * batch_sizefinal_advs = xx_atanh = self._get_arctanh_x(x)y_onehot = to_one_hot(y, self.num_classes).float()final_l2distsqs = torch.FloatTensor(final_l2distsqs).to(x.device)final_labels = torch.LongTensor(final_labels).to(x.device)# Start binary searchfor outer_step in range(self.binary_search_steps):delta = nn.Parameter(torch.zeros_like(x))optimizer = optim.Adam([delta], lr=self.learning_rate)cur_l2distsqs = [CARLINI_L2DIST_UPPER] * batch_sizecur_labels = [INVALID_LABEL] * batch_sizecur_l2distsqs = torch.FloatTensor(cur_l2distsqs).to(x.device)cur_labels = torch.LongTensor(cur_labels).to(x.device)prevloss = PREV_LOSS_INITif (self.repeat and outer_step == (self.binary_search_steps - 1)):loss_coeffs = coeff_upper_boundfor ii in range(self.max_iterations):loss, l2distsq, output, adv_img = \self._forward_and_update_delta(optimizer, x_atanh, delta, y_onehot, loss_coeffs)if self.abort_early:if ii % (self.max_iterations // NUM_CHECKS or 1) == 0:if loss > prevloss * ONE_MINUS_EPS:breakprevloss = lossself._update_if_smaller_dist_succeed(adv_img, y, output, l2distsq, batch_size,cur_l2distsqs, cur_labels,final_l2distsqs, final_labels, final_advs)self._update_loss_coeffs(y, cur_labels, batch_size,loss_coeffs, coeff_upper_bound, coeff_lower_bound)return final_advs

  

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

4 基于优化的攻击——CW相关推荐

  1. 基于优化反馈的组合在线学习

    点击上方蓝字关注我们 基于优化反馈的组合在线学习 孔芳1, 杨悦然1, 陈卫2, 李帅1 1 上海交通大学约翰·霍普克罗夫特计算机科学中心,上海 200240 2 微软亚洲研究院,北京 100080 ...

  2. 【泡泡图灵智库】基于优化的视觉惯性SLAM与GNSS紧耦合

    转载自:https://mp.weixin.qq.com/s/jlkXvygaTsql1nk76HD94g [泡泡图灵智库]基于优化的视觉惯性SLAM与GNSS紧耦合 原创 泡泡机器人 泡泡机器人SL ...

  3. 从零开始学习VIO笔记 --- 第三讲:基于优化的IMU和视觉信息融合

    从零开始学习VIO笔记 --- 第三讲:基于优化的IMU和视觉信息融合 一. 预备知识 1.1 知识点概述 1.2 PnP 中的重投影误差函数 1.3 后端优化中重投影误差函数/BA问题 二. VIO ...

  4. 《视觉SLAM进阶:从零开始手写VIO》第三讲 基于优化的IMU预积分与视觉信息融合 作业

    <视觉SLAM进阶:从零开始手写VIO>第三讲 基于优化的IMU预积分与视觉信息融合 作业 文章目录 <视觉SLAM进阶:从零开始手写VIO>第三讲 基于优化的IMU预积分与视 ...

  5. fama matlab源码_基于优化算法改造的Fama-French三因子模型

    基于光大证券金融工程研报<站在巨人的肩膀上,从牛基组合到牛股发现 --FOF 专题研究系列之十六 >中提及的Carhart四因子Alpha优化模型,本文在Fama-French三因子模型上 ...

  6. OMPL 入门Tutorial 7:基于优化的规划(Optimal Planning)

    以下内容为OMPL官方Tutorial Optimal planning 的翻译 定义一个基于优化的运动规划问题几乎与常规的问题定义一样,除了以下两点区别: 需要给ompl::base::Proble ...

  7. 论文研读笔记_基于优化的SVM心音信号分类算法的研究

    论文研究_基于优化的SVM心音信号分类算法的研究 先存起来,持续更新 摘要 心音信号采集易混入杂音,影响判断: 经验式模态分解算法分析特征分布:心音信号集中于低频.噪音集中于高频: 利用切比雪夫滤波器 ...

  8. YOLOv7如何提高目标检测的速度和精度,基于优化算法提高目标检测速度

    目录 一.学习率调度 二.权重衰减和正则化 三.梯度累积和分布式训练 1.梯度累积 2.分布式训练 四.自适应梯度裁剪 大家好,我是哪吒. 上一篇介绍了YOLOv7如何提高目标检测的速度和精度,基于模 ...

  9. 【点云论文速读】基于优化的视觉惯导里程计与GPS的紧耦合的融合方案

    转载自:https://mp.weixin.qq.com/s/Y-h7eto1Zc_Mkzlh653vpg [点云论文速读]基于优化的视觉惯导里程计与GPS的紧耦合的融合方案 原创 dianyunPC ...

最新文章

  1. js判断数组中重复元素并找出_面试中常遇见的数组去重
  2. 接口超时后程序还会继续执行嘛_答网友问:分析一段STL程序,并就如何读懂一段程序谈几点感想...
  3. mxnet基础到提高(48)-ones和ones_like
  4. C++---两数之和
  5. linux定时执行python脚本_ubuntu定时执行python脚本实例代码
  6. 用screenfetch显示带有酷炫Linux标志的基本硬件信息
  7. 鸿蒙系统怎么连wifi,鸿蒙入门:Hi3861 WiFi操作,热点连接
  8. C# wpf NotifyIcon空间模仿qqz最小化,关闭功能(12)
  9. 基于ENVI的Landsat 7影像处理与多种大气校正方法对比
  10. 微信小程序短信倒计时60s功能
  11. poi操作ppt创建表格
  12. 第73课内幕资料详细版 Spark SQL Thrift Server 实战 每天晚上20:00YY频道现场授课频道68917580
  13. 蒙特卡洛之布丰投针(python实现)
  14. 带你理解JS中的Events事件
  15. P1359 租用游艇【Floyd】
  16. virtualhackinglabs靶机 NATURAL 10.12.1.77
  17. ES快速入门(七) ElasticSearch7.X分布式部署
  18. 50个直击灵魂的问题_直击心灵的48个问题
  19. TCP/IP协议分层
  20. 有关推挽输出、开漏输出、复用开漏输出、复用推挽输出

热门文章

  1. java操作文件_java操作FTP,实现文件上传下载删除操作
  2. 鼠标偏移量_不止颜值!活动鼠标使用评测
  3. python字典数据的特点_Python核心数据类型之字典15
  4. axios请求拦截器错误_React中使用高阶组件和axios的拦截器,统一处理请求失败提示...
  5. vue 扁平化_以vue+TreeSelect为例,如何将扁平数据转为tree形数据
  6. php的数据结构有哪些,PHP数据结构有几种
  7. java 哈希表和向量_Java基础知识笔记(一:修饰词、向量、哈希表)
  8. python3tkinter_python3使用tkinter制作动画
  9. 社区发现(二)--GN
  10. 系统学习深度学习(十八)--NIN模型