1 引言
- 使用单像素点愚弄深度神经网络。2017 CVPR 论文地址
- 对抗样本生成的一种策略。
- 本文采取一种独立思考的方式,来理解与讲解这篇论文。
2 算法原理
2.1 第一印象
- what the fuck?改变一个像素点就能使网络分类错误?想法great,但怎么可能
- 逐渐冷静。。。单像素点真的能攻击成功?
2.2 初步设想
- Can we:貌似 ”goodfellow的模型高度线性化,使得图像会有扰动放大效应“ 为改设想提供了一定的理论依据。
- How:假设确实改动某个像素点的值能实现对抗攻击。那如何去做?
- Ask:既然只是更改一个像素点,自然而然,我们想到暴力求解可不可行?
- Answer:如果用cifar数据集,一张图片意味着要进行 32 * 32 * 3 * 256次迭代。代价太大,不可行。
- Ask:那梯度求解方式?
- Answer:类似FGSM用梯度求解,是建立在基本改变图片全部像素点的前提下。这种场景和只改动单个像素点差远了。
- Ask:那进化算法总行吧?既能实现黑盒攻击,问题解空间也不大。进化算法:你直接报我身份证得了。想要详细与进化算法深入接触?跳转
- Focus(注意了哈):作者提出使用差分进化算法来求解。恭喜你,最终还是说对了。
2.3 在此之前
- 先抛开差分进化不管。首先 Focus on 优化目标,即我们要找的那个像素点应该满足何种标准。
max e ( x ) f a d v ( x + e ( x ) ) s u b j e c t t o ∣ ∣ e ( x ) ∣ ∣ 0 ≤ d \max_{e(x)} f_{adv}\left(x+e(x)\right)\\ subject\; to \qquad ||e(x)||_0\le d\\ e(x)maxfadv(x+e(x))subjectto∣∣e(x)∣∣0≤d
f : 模 型 的 类 别 概 率 输 出 层 d : 改 变 像 素 点 的 个 数 该 算 法 中 d = 1 a d v : 待 攻 击 成 的 类 别 该 算 法 是 实 现 有 目 标 攻 击 f:模型的类别概率输出层\\ d:改变像素点的个数\\ 该算法中 d = 1\\ adv:待攻击成的类别\\ 该算法是实现有目标攻击 f:模型的类别概率输出层d:改变像素点的个数该算法中d=1adv:待攻击成的类别该算法是实现有目标攻击
- 如上公式,简而言之就是希望待攻击成的类别的置信度尽可能的大
2.4 承上:what is differential evolution(差分进化)
1. 定义求解空间
- 假设是cifar10数据集,其解空间就是:
( x , y , R , G , B ) s u b j e c t t o x , y ∈ [ 0 , 31 ] ; R , G , B ∈ [ 0 , 255 ] (x,y,R,G,B)\\ subject\;to\quad x,y \in[0,31]; R,G,B\in [0,255] (x,y,R,G,B)subjecttox,y∈[0,31];R,G,B∈[0,255] - 视觉上的解空间如下图:
2. 初始化解集
- 使用均匀分布 U ( 1 , 32 ) U(1,32) U(1,32)来生成 x , y x,y x,y,使用正态分布 N ( μ = 128 , σ = 127 ) N(\mu =128,\sigma=127) N(μ=128,σ=127)来生成 R , G , B R,G,B R,G,B
- 以如上方式生成400个候选解集
3. 生成解集
x
i
(
g
+
1
)
=
x
r
1
(
g
)
+
F
(
x
r
2
(
g
)
−
x
r
3
(
g
)
)
,
r
1
≠
r
2
≠
r
3
x_i(g+1)= x_{r1}(g)+F\left( x_{r2}(g)-x_{r3}(g)\right), \\r1\neq r2\neq r3\\
xi(g+1)=xr1(g)+F(xr2(g)−xr3(g)),r1=r2=r3
- 其中, x i x_i xi 是候选解集中的一个元素, r 1 , r 2 , r 3 r1,r2,r3 r1,r2,r3是在候选解范围的随机数 r 1 , r 2 , r 3 ∈ [ 0 , 399 ] r1,r2,r3 \in [0,399] r1,r2,r3∈[0,399] ; F F F是超参数,这里设置为0.5; g g g是当前迭代代数。
4、种群适应
- 400个父代候选解 使用步骤3公式 又生成了400个子代解。共800,按照之前讲的优化目标从800个解中选出400个最优秀的解集。不断迭代即可。
5、最终选择
- 自己设定迭代多少次。反正最终还是会获得400个候选解集,按照之前的优化目标,找到其中最好的一个解,作为该问题的解。
- 这个解就包含了需要修改的像素位置以及改动多少像素值的信息。将其该解运用到干净样本中,就生成了能够愚弄分类器的对抗样本。
3 总结
- 典型的A+B论文吧。
- 经了解得知,差分进化其实是数学上的一个优化方法,大概在90年代提出。
- 经coding发现,差分进化算法在scipy库中就有。
- 但是实验发现使用scipy库的差分进化算法比较慢,作者在代码上做了一些速度上的提升。
附录
- 论文作者代码:
https://github.com/Hyperparticle/one-pixel-attack-keras - My Coding:
不好意思拿出来(狗头) - 参考资料:
[论文总结] One Pixel Attack for Fooling DNN 对抗样本单像素攻击
OnePixel攻击
采用写作新形式,任何问题,评论区留言,力所能及,必答之。