DeepFool对抗算法_学习笔记

本文深入剖析了DeepFool算法,介绍了其如何通过最小化扰动来生成对抗样本,并评估分类器的鲁棒性。从二分类器到多分类器,逐步解释了算法原理及应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

本篇博客出于学习交流目的,主要是用来记录自己学习中遇到的问题和心路历程,方便之后回顾。过程中可能引用其他大牛的博客,文末会给出相应链接,侵删!


DeepFool算法
特点:提出鲁棒性评估指标
论文原文:DeepFool: a simple and accurate method to fool deep neural networks

正文

之前的博客讲了FGSM算法,但是有人可能会有疑问,怎么确定 ε ε 的大小,取值大小这会对算法效果产生很大影响,那么今天的这个算法可以避免这个问题。
文章首次提出了一个分类器鲁棒性的评估指标:
图像样本: x x xRn
分类器: k^(x) k ^ ( x )
对抗扰动: r r
分类器在x处的鲁棒性 Δ(x;k^) Δ ( x ; k ^ )

Δ(x;k^):=minr||r||2  s.t.k^(x+r)k^(x) Δ ( x ; k ^ ) := min r | | r | | 2     s . t . k ^ ( x + r ) ≠ k ^ ( x )
即x到分类边界的距离,下文会更详细理解。

分类器 k^(x) k ^ ( x ) 的鲁棒性:

ρadv(k^)=ExΔ(x;k^)||x||2 ρ a d v ( k ^ ) = E x Δ ( x ; k ^ ) | | x | | 2

样本离分类边界越远,样本2范数越小,评测数值越大表示越鲁棒。


我们先从二分类器看,多分类器可以看做是多个二分类器的共同作用。
二分类问题
二分类器: k^(x)=sign(wTx+b):=sign(f(x)) k ^ ( x ) = s i g n ( w T x + b ) := s i g n ( f ( x ) )
图为sign()函数

分类边界: F={x:f(x)=0} F = { x : f ( x ) = 0 } ,分界线两边分别为正负类
扰动向量:
r(x0):=argminr||r||2 r ⋆ ( x 0 ) := arg ⁡ min r | | r | | 2
s.t. sign(f(x0+r))sign(f(x0)) s . t .   s i g n ( f ( x 0 + r ) ) ≠ s i g n ( f ( x 0 ) )
=f(x0)||w||22w = − f ( x 0 ) | | w | | 2 2 w

借助原文中的图例来看公式可以很好理解

其实这个公式可以理解为样本到分类边界的最短距离 f(x0)w2 f ( x 0 ) ‖ w ‖ 2 乘上法线方向的单位向量 ww2 w ‖ w ‖ 2 ,因为始终指向分类边界方向,所以有个负号。

这里写图片描述

如果是迭代算法,那么扰动计算公式将变为:

argriminri2 subject to f(xi)+f(xi)Tri=0 a r g r i m i n ‖ r i ‖ 2   s u b j e c t   t o   f ( x i ) + ▽ f ( x i ) T r i = 0

多分类问题
类标数: c c ,即映射空间RnRc
分类函数: f(x)=WTx+b f ( x ) = W T x + b
分类器: k^(x)=argmaxkfk(x) k ^ ( x ) = arg ⁡ max k f k ( x ) fk(x) f k ( x ) 是向量 f(x) f ( x ) 的第 k k 个维度,也可看做是第k个子分类器。
扰动向量:
argminr||r||2 arg ⁡ min r | | r | | 2
s.t.k:wTk(x0+r)+bkwTk^(x0)(x0+r)+bk^(x0) s . t . ∃ k : w k T ( x 0 + r ) + b k ≥ w k ^ ( x 0 ) T ( x 0 + r ) + b k ^ ( x 0 )
其中 wk w k W W 的第 k k 列,即第k个子分类器的权值向量。
要使得分类结果改变,必须保证至少存在一个非原始类标的分类器结果大于原始分类函数结果。
k k 个分类边界:Fk={x:fk(x)fk^(x0)(x)=0}
x0 x 0 与所在的凸区域可由超平面 P P 围成:

P=k=1c{x:fk^(x0)(x)fk(x)}

这时候我们需要得到一个点到某分类函数边界的最小距离,即:

l^(x0)=argminkk^(x0)|fk(x0)fk^(x0)(x0)|||wkwk^(x0)||2 l ^ ( x 0 ) = arg ⁡ min k ≠ k ^ ( x 0 ) | f k ( x 0 ) − f k ^ ( x 0 ) ( x 0 ) | | | w k − w k ^ ( x 0 ) | | 2

同样用原文的图来帮助理解:

假设有4个类, x0 x 0 属于原本第4类,那么我们可以根据 Fk={x:fk(x)f4(x)=0} F k = { x : f k ( x ) − f 4 ( x ) = 0 } 确定一个超平面如图绿线围成。然后计算分别距离各个分类器的最小距离。

那么我们就得到最小扰动 r(x0) r ⋆ ( x 0 )

r(x0)=|fl^(x0)(x0)fk^(x0)(x0)|||wl^(x0)wk^(x0)||22(wl^(x0)wk^(x0)) r ⋆ ( x 0 ) = | f l ^ ( x 0 ) ( x 0 ) − f k ^ ( x 0 ) ( x 0 ) | | | w l ^ ( x 0 ) − w k ^ ( x 0 ) | | 2 2 ( w l ^ ( x 0 ) − w k ^ ( x 0 ) )

如果是迭代则公式变为如下:
P=k=1c{x:fk(xi)fk^(x0)(xi)+fk(xi)xfk^(x0)(xi)x0} P = ⋂ k = 1 c { x : f k ( x i ) − f k ^ ( x 0 ) ( x i ) + ▽ f k ( x i ) ⊤ x − ▽ f k ^ ( x 0 ) ( x i ) ⊤ x ≤ 0 }

小结

由线性推广到非线性也一样,文章还给出了由2范数推广到 lp l p 范数,以及和FGSM算法的实验对比,有兴趣的可以详细看原文。

代码

在cleverhans团队给的demo上修改了一下,可以下载运行mnist数据集进行测试,如果想测试其他数据集或者有任何问题,我们都可以随时探讨。在原库中有些bug或者版本兼容问题已经修改,utils_tf.py中训练是可能会遇到shape不匹配问题。将输入reshape一下就可以了。
下载地址:DeepFool对抗算法
注:依赖cleverhans集成库,或是我资源中的FGSM算法也可以。
cleverhans_github地址:https://github.com/tensorflow/cleverhans

<think>嗯,用户想了解DeepFool算法及其实现。首先,我需要回忆一下DeepFool的基本原理。记得DeepFool是一种生成对抗样本的方法,通过最小扰动来欺骗分类模型。对抗样本是指对输入数据做微小修改,导致模型错误分类的样本。 根据用户提供的引用,特别是引用[2],里面提到DeepFool在二维情况下,最小扰动是从样本到决策边界的垂直距离,方向与法向量相反。这应该是针对线性分类器的情况。那对于非线性分类器,可能需要迭代的方法来逼近这个扰动。 接下来,我需要解释算法步骤。首先,初始化扰动为0,然后将输入的样本逐步推向决策边界。每次迭代中,计算当前样本到最近决策边界的距离,并更新扰动。直到样本被错误分类为止。这部分可能需要用数学公式表示,比如使用超平面的方程来计算距离。 然后,用户可能需要一个代码示例。根据引用[1],提到deepfool函数的实现需要按照算法步骤来。代码部分应该包括循环迭代,计算梯度,找到最近的决策边界,累积扰动,直到分类结果改变。需要注意的是,代码可能需要使用自动微分库,比如PyTorch的autograd来计算梯度。 还需要考虑算法的应用场景,比如对抗训练、模型鲁棒性评估。这部分可以引用提到的对抗样本应用,说明DeepFool在实际中的用途,比如测试模型的安全性。 用户可能的问题包括与其他对抗样本生成方法(如FGSM)的区别,DeepFool的优缺点,以及在图像分类中的具体应用。要准备好回答这些问题,可能需要比较不同方法在扰动大小和计算复杂度上的差异。 最后,确保回答符合系统级指令的要求,行内数学公式用$...$,独立公式用$$...$$,正确的中文语法,生成相关问题,并在引用处添加标识。检查LaTeX语法是否正确,比如积分符号、上下标的位置是否正确。</think>### DeepFool算法介绍及实现 #### 核心原理 DeepFool是一种生成对抗样本的高效算法,通过计算最小扰动$\Delta$使输入样本$x$被错误分类。其核心思想是:将样本沿着分类器决策边界的法向量方向推过边界,直到达到误分类状态[^1][^2]。 对于线性二分类器$f(x)=w^Tx+b$,原始样本$x_0$到决策超平面的最小扰动为: $$ \Delta = -\frac{f(x_0)}{||w||^2}w $$ 该公式展示了最小扰动方向与权重向量$w$(超平面法向量)相反的特性 #### 算法步骤(非线性扩展) 1. 初始化扰动$\Delta=0$ 2. 循环直到分类结果改变: - 计算当前样本$x+\Delta$到最近决策边界的距离 - 更新扰动向量$\Delta$ 3. 输出总扰动 #### Python实现示例 ```python import torch from torch.autograd import Variable def deepfool(image, model, num_classes=10, overshoot=0.02, max_iter=50): input_shape = image.shape x = Variable(image, requires_grad=True) fs = model(x) _, label_orig = torch.max(fs.data, 1) current_label = label_orig.item() perturbation = torch.zeros(input_shape) for _ in range(max_iter): x_adv = x + perturbation jacobian = torch.zeros(num_classes, *input_shape) # 计算梯度 for k in range(num_classes): model.zero_grad() f_k = model(x_adv)[0,k] f_k.backward(retain_graph=True) jacobian[k] = x.grad.data # 寻找最近决策边界 with torch.no_grad(): f = model(x_adv)[0] w = jacobian - jacobian[current_label] f_diff = f - f[current_label] min_dist = float('inf') for k in range(num_classes): if k == current_label: continue dist = abs(f_diff[k]) / torch.norm(w[k]) if dist < min_dist: min_dist = dist target_label = k min_w = w[k] # 更新扰动 delta = (abs(f_diff[target_label]) + 1e-4) / (torch.norm(min_w)**2) * min_w perturbation += delta # 检查是否越界 if model(x + perturbation).argmax() != current_label: perturbation = (1 + overshoot) * perturbation break return perturbation ``` #### 应用场景 1. **模型鲁棒性评估**:检测分类器对微小扰动的敏感度 2. **对抗训练**:生成对抗样本增强训练数据 3. **安全验证**:评估自动驾驶等关键系统的可靠性
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值