DeepFool公式理解

参考:https://posts.careerengine.us/p/5ff6b16ae83b0349b1f7c3a3

1、二范数

 论文中:

         以上是鲁棒性定义,即给定一个分类器,样本鲁棒性是使得模型出现误分类的最小扰动,即为干净的样本,为模型预测的标签。是分类器处鲁棒性。
模型在整个数据集上的鲁棒性定义为:

 这是一种期望的形式。作者的这种定义是在分母中都除以一个样本的 2 范数。模型鲁棒性是更好地理解当前网络体系结构的局限性和设计增强健壮性的方法的关键。

2、DeepFool攻击二分类器

 图2:线性二进制分类器的对抗样本。

 上图为对抗样本攻击线性分类器的图示。其中为一个二分类器。为干净样本点的最短距离,即为样本点在分类器中的鲁棒性。

 =0   为分类超平面。

目标函数如下:

意思是:改变分类器决策的最小扰动对应于  x0  在  F  上的正交投影。它由以上解析公式给出。

为了更好的理解上图对抗样本攻击二分类器的原理,我重新画了一个图来对其进行解释。如下图所示,在二维平面中,有一条直线和一个点 ,其中直线的法向量为,由高中的点到直线的距离知识可知点到直线的距离为:

 

 3、论文给出的最终公式如何推导?

上面目标函数可以通过迭代的方式来进行求解以获得最小对抗扰动,可以重新转换成如下的优化形式:

 下面为具体的推导过程:

已知梯度(函数在当前位置的导数) ,所以有:

又因为梯度的模长为 1,所以两边同乘以有:

 最后,移项可得到最终论文中给出的公式:

 4、DeepFool攻击多分类器

 介绍完 DeepFool 攻击二分类器,这一节介绍有关 DeepFool 攻击多分类器。分类器预测标签如下公式所示:

 其中, 是预测概率向量的第 k 类的概率分量。多分类器模型误分类的优化函数如下所示:

 为了更好的理解以上优化形式的含义,自己做了一个图示便于理解。如下图所示,左半部分是干净样本的概率向量的输出,预测的类别为 ,加入对抗扰动后,预测类别变成了 。

 如下图实例所示,已知一个四分类器,干净样本被分为第四类中。绿色区域为一个凸区域可以表示为:

 根据高中的点到直线的距离公式,可以推算得知点到三条边界最短的距离的计算公式为:

 与 DeepFool 攻击二分类器相似,则多分类器的对抗扰动为:

 下面是自己的理解:

 5、非线性多分类

### DeepFool算法公式详细推导过程及原理 #### 一、DeepFool基本概念 DeepFool是一种迭代方法,用于寻找最小的扰动使得输入样本被错误分类。其核心在于通过线性化决策边界来估计最接近当前类别的其他类别之间的距离。 对于给定的一个初始图像\(x\)属于真实标签\(y\),目标是最小化添加到此图像上的噪声大小,使网络将其预测为另一个不同的类别\[ \min_{r} \| r \|_2 : f(x+r) ≠ y \][^1] #### 二、多分类情况下的DeepFool实现 考虑一个多分类问题,假设存在C个可能的目标类别,则可以构建一个超平面方程组表示各个类间的分隔面: \[ w_i·x+b_i=0,\quad i∈{1,...,C}\] 这里\(w_i\)代表第i个类对应的权重向量而bi则是偏置项。当面对非线性的神经网路时,这些参数来自于softmax层之前的激活值。 为了简化计算,通常会采用局部近似的方式处理复杂的非线性映射关系。具体来说就是把每一个类视作是由前一层特征空间里的加权求和所形成的简单仿射变换结果。因此,在每一步迭代过程中都可以得到一组新的\(W=[w_1;... ;w_C]\),以及相应的b向量[b1;…;bc]。 此时,如果要找到离原始点最近的那个误分类区域的话,就需要解下面这个优化问题: \[ min ||δ||_p s.t.\space sign(f(x))≠sign(f(x+δ)), p≥1\] 即寻找能够改变模型输出符号所需的最小范数扰动δ。由于直接解决上述约束条件较为困难,所以转而去寻求满足下述不等式的最小正实数值ε : \[ (f_j(x)-f_k(x))^T δ ≥ ε , j,k ∈ {1,…, C},j≠k\] 这实际上意味着我们要找的是那个能使任意两个不同类别得分差变得尽可能大的方向。进一步地,考虑到实际情况中我们更关心L2范数形式下的最优解,于是乎就得到了最终版本的DeepFool更新规则: \[ δ^{(t)}=\frac{|f_k(x_t)-max_{j≠k}(f_j(x_t))|}{\|\nabla_xf_k(x_t)-∇xf_l(x_t)\|^2 }(\nabla_xf_k(x_t)-∇xf_l(x_t))\] 其中l是指除开最大响应外第二高的分数对应的位置索引号。随着循环次数增加,累加每次产生的微调增量直到成功翻越某个临界阈值为止即可完成整个攻击流程的设计[^2]. ```python def deepfool(image, net): """ Implementation of the DeepFool algorithm. Parameters: image: Input image to be attacked net: Pre-trained neural network model Returns: perturbed_image: Adversarial example generated from input image """ num_classes = 10 # Number of classes in classification task max_iter = 50 # Maximum number of iterations allowed x = Variable(image.clone(), requires_grad=True).cuda() f_image = net.forward(x).data.cpu().numpy().flatten() I = (np.array(f_image)).argsort()[::-1] label = I[0] input_shape = image.size() pert_image = image.clone() r_tot = np.zeros(input_shape) k_i = label for ii in range(max_iter): x = Variable(pert_image.clone(), requires_grad=True).cuda() fs = net.forward(x) fs_list = [fs[0,I[k]] for k in range(num_classes)] _, grads = torch.autograd.grad(fs_list[I], inputs=x,retain_graph=True, create_graph=False) grad_orig = grads.data.cpu().numpy().copy() target_class = None w = np.squeeze(grads.data.cpu().numpy().copy()) f_multiclass = fs.data.cpu().numpy().flatten() I_new = np.argsort(f_multiclass)[::-1] if(I_new[0]!=I[0]): break else: for j in range(len(I)): if(j==0):continue w_k = w[I[j]] dist = abs((f_multiclass[I[j]]-f_multiclass[label]))/np.linalg.norm(w_k-w[I[0]]) if(target_class is None or dist<dist_min): dist_min = dist closest = w_k r_i = (closest - w[I[0]]) * dist_min r_tot += r_i pert_image = image + (1+epsilon)*torch.from_numpy(r_tot).cuda() pert_image =Variable(pert_image,requires_grad=False) return pert_image ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值