由于之前提出的防御性蒸馏实际上是一种"梯度遮蔽"的方法,作者也给出了防御性蒸馏有效性的解释,详见之前关于防御性蒸馏的文章,和那里面说的一样;不过关于jsma中选择像素对来进行修改的方法,作者做出了不一样的解释:
假设softmax层最小的输入为-100,那么softmax层的对于该输入的输出为0,即使增加了10,由-100变成了-90,仍然为0,显然这对输出没有什么影响。而如果softmax层最大的输入为10,将其更改为了0,显然这会使得输出产生巨大的变化。而JSMA的攻击方式并不会考虑从0到10和从-100到-90的不同,他是一视同仁的。
而在蒸馏训练之后,会使得这样的不同放大。假设输出类向量为:[ -674.3225 , -371.59705 , -177.78831 , 562.87225 ,-1313.5781 , 998.18207 , -886.97107 , -511.58194 ,-126.719666, -43.129272]。要改变类别实际上只需要第四个数比第六个数大即可(即562增长,998下降)。但是JSMA会由于增长562会使得例如-1313,-886的数增加很多而放弃。这实际上是算法本身的问题。
要攻击防御性蒸馏模型实际上很简单,只需要不考虑这些其他的类向量值,只考虑需要超过的类向量和自身的类向量值即可,甚至可以只关注增加自身的类向量。
因此作者Nicholas Carlini和David Wagner提出了一系列能够改变类向量的目标函数:
f1(x′)f2(x′)f3(x′)f4(x′)f5(x′)f6(x′)f7(x′)=−lossF,t(x′)+1=(maxi≠t(F(x′)i)−F(x′)t)+=softplus(maxi≠t(F(x′)i)−F(x′)t)−log(2)=(0.5−F(x′)t)+=−log(2F(x′)t−2)=(maxi≠t(Z(x′)i)−Z(x′)t)+=softplus(maxi≠tZ(x′)i)−Z(x′)t)−log(2) f 1 ( x ′ ) = − l o s s F , t ( x ′ ) + 1 f 2 ( x ′ ) = ( m a x i ≠ t ( F ( x ′ ) i ) − F ( x ′ ) t ) + f 3 ( x ′ ) = s o f t p l u s ( m a x i ≠ t ( F ( x ′ ) i ) − F ( x ′ ) t ) − l o g ( 2 ) f 4 ( x ′ ) = ( 0.5 − F ( x ′ ) t ) + f 5 ( x ′ ) = − log ( 2 F ( x ′ ) t − 2 ) f 6 ( x ′ ) = ( m a x i ≠ t ( Z ( x ′ ) i ) − Z ( x ′ ) t ) + f 7 ( x ′ ) = s o f t p l u s ( m a x i ≠ t Z ( x ′ ) i ) − Z ( x ′ ) t ) − l o g ( 2 )
其中,
loss l o s s 就是
x x 的交叉熵损失函数,
t t 是目标攻击类别,
softplus(x)=log(1+exp(x)) s o f t p l u s ( x ) = log ( 1 + exp ( x ) ) 。
F(x) F ( x ) 是softmax层对于样本
x x 的输出,
Z(x) Z ( x ) 是logit层对于样本
x x 的输出,也就是softmax层的输入。
除此以外,为了保证输出能够产生一个合理的图像,需要
0≤xi+δi≤1 0 ≤ x i + δ i ≤ 1 ,这实际上被称为盒约束 (box constraints)。作者总结出了三种解决盒约束优化问题的方式:
1、投影梯度下降法,在执行标准梯度下降时执行,将所有坐标剪切到框内。然而这种方法对于具有复杂更新步骤的梯度下降方法(例如,具有动量的梯度下降),效果不佳:我们剪切真实的
xi x i 的同时,同时也修改了下一次迭代的输入,这并不是我们期望的。
2、裁剪梯度下降法,与每一步迭代裁剪
x x 的值不同的,该方法将裁剪直接放入了优化目标,即用
f(min(max(x+δ,0),1)) f ( min ( max ( x + δ , 0 ) , 1 ) ) 代替原目标函数
f(x+δ) f ( x + δ ) 。但这显然会带来一个新的问题,就是卡在平坦区域,
x x 卡在边界值动不了。
3、改变变量,作者就采用的这种方法,即用新的变量
w w 代替原先的
x x ,即
δi=12(tanh(wi)+1)−xi δ i = 1 2 ( t a n h ( w i ) + 1 ) − x i
据此,作者提出了对应与三种范数约束的求解方法:
1、
L2 L 2 attack
我们选择目标类别
t t :
min||12(tanh(w)+1)−x||22+c⋅f(12(tanh(w)+1)) min | | 1 2 ( t a n h ( w ) + 1 ) − x | | 2 2 + c ⋅ f ( 1 2 ( t a n h ( w ) + 1 ) )
其中
f f 定义为:
f(x′)=max(max{Z(x′)i:i≠t}−Z(x′)t,−k) f ( x ′ ) = m a x ( m a x { Z ( x ′ ) i : i ≠ t } − Z ( x ′ ) t , − k )
我们可以通过调整
k k 来控制错误分类发生的置信度。 参数
k k 鼓励求解器找到一个敌对的实例
x′ x ′ ,它将被高度置信地归类为
t t 类。除此以外,作者还使用了多次随机初始化来减少陷入局部最优解的概率。
对于
L2 L 2 攻击中常量
c c ,作者提出:从很小的值,例如
10−4 10 − 4 ,开始,如果没找到就将
c c 翻倍,直至找到或者达到最大值,例如
1010 10 10 ,如果找到就使用该
c c 值。
2、
L0 L 0 attack
由于0-范数是不可微的因此不能使用标准的梯度下降法来进行求解,因此我们基于
L2 L 2 攻击来生成
L0 L 0 攻击。具体而言,就是先根据
L2 L 2 攻击生成扰动向量
δ δ ,因此
x+δ x + δ 就是一个对抗样本,我们计算
g=∇f(x+δ) g = ∇ f ( x + δ ) ,然后根据评估函数
g g 选择像素
i=argminigi⋅δi i = arg min i g i ⋅ δ i (
gi g i 实际上评估的是像素
i i 对于输出
f f 的影响),然后固定像素
i i ,再利用
L2 L 2 攻击生成对抗样本,直至无法找到对抗样本为止。
3、
L∞ L ∞ attack
对于无穷范数,假设我们使用类似于之前的:
minc⋅f(x+δ)+||δ||∞ min c ⋅ f ( x + δ ) + | | δ | | ∞
我们可以很轻易的发现梯度下降法的效果并不理想(例如l_bfgs的无穷范数),这是由于
||δ||∞ | | δ | | ∞ 只会惩罚向量中最大的那个元素,而对于其余元素没有任何影响。因此,梯度下降很快就会停滞在两个次优解之间。 考虑一个情况,其中
i=0.5 i = 0.5 和
j=0.5−ϵ j = 0.5 − ϵ 。
L∞ L ∞ 只会惩罚
δi δ i 而不会惩罚
δj δ j 。并且
∂∂δj||δ||∞ ∂ ∂ δ j | | δ | | ∞ 在该点的值为
0 0 ,因此梯度仍然会增大
δj δ j ,尽管它已经很大。 因此在下一次迭代中,可能会移动到
δj δ j 比
δi δ i 略大的位置,比如
i=0.5−ϵ′ i = 0.5 − ϵ ′ 和
j=0.5+ϵ″ j = 0.5 + ϵ ″ ,这就可能陷入僵局。 换句话说,梯度下降可能在
δi=δj=0.5 δ i = δ j = 0.5 的线上来回摆动。
鉴于此,作者转而提出优化如下问题:
minc⋅f(x+δ)+∑i[(δi−τ)+] min c ⋅ f ( x + δ ) + ∑ i [ ( δ i − τ ) + ]
在每次迭代之后,如果对所有的
i i 都有
δi<τ δ i < τ ,我们将
τ τ 减少0.9倍并重复; 否则,我们终止搜索。
再次,我们必须选择一个好的常数
c c 用于
L∞ L ∞ 攻击。 我们采用与
L0 L 0 攻击相同的方法:首先将
c c 设置为非常低的值,然后以此
c c 值运行
L∞ L ∞ 攻击。 如果失败,我们加倍
c c 并重试,直到成功。 如果
c c 超过固定阈值,我们中止搜索。
在每次迭代中使用“热启动”进行梯度下降,作者指出该算法的速度与之前的L2算法(使用单个起点)一样快。
实际上0-范数攻击很慢,并且也不是很好的攻击方式,作者也并不推荐。