关于Towards evaluating the robustness of neural networks的理解

由于之前提出的防御性蒸馏实际上是一种"梯度遮蔽"的方法,作者也给出了防御性蒸馏有效性的解释,详见之前关于防御性蒸馏的文章,和那里面说的一样;不过关于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)=lossF,t(x)+1f2(x)=(maxit(F(x)i)F(x)t)+f3(x)=softplus(maxit(F(x)i)F(x)t)log(2)f4(x)=(0.5F(x)t)+f5(x)=log(2F(x)t2)f6(x)=(maxit(Z(x)i)Z(x)t)+f7(x)=softplus(maxitZ(x)i)Z(x)t)log(2)

其中,loss就是x的交叉熵损失函数,t是目标攻击类别,softplus(x)=log(1+exp(x))F(x)是softmax层对于样本x的输出,Z(x)是logit层对于样本x的输出,也就是softmax层的输入。
 除此以外,为了保证输出能够产生一个合理的图像,需要0xi+δi1,这实际上被称为盒约束 (box constraints)。作者总结出了三种解决盒约束优化问题的方式:
1、投影梯度下降法,在执行标准梯度下降时执行,将所有坐标剪切到框内。然而这种方法对于具有复杂更新步骤的梯度下降方法(例如,具有动量的梯度下降),效果不佳:我们剪切真实的xi的同时,同时也修改了下一次迭代的输入,这并不是我们期望的。
2、裁剪梯度下降法,与每一步迭代裁剪x的值不同的,该方法将裁剪直接放入了优化目标,即用f(min(max(x+δ,0),1))代替原目标函数f(x+δ)。但这显然会带来一个新的问题,就是卡在平坦区域,x卡在边界值动不了。
3、改变变量,作者就采用的这种方法,即用新的变量w代替原先的x,即
δi=12(tanh(wi)+1)xi

据此,作者提出了对应与三种范数约束的求解方法:
1、L2 attack
我们选择目标类别t
min||12(tanh(w)+1)x||22+cf(12(tanh(w)+1))

其中f定义为:
f(x)=max(max{Z(x)i:it}Z(x)t,k)

我们可以通过调整k来控制错误分类发生的置信度。 参数k鼓励求解器找到一个敌对的实例x,它将被高度置信地归类为t类。除此以外,作者还使用了多次随机初始化来减少陷入局部最优解的概率。
  对于L2攻击中常量c,作者提出:从很小的值,例如104,开始,如果没找到就将c翻倍,直至找到或者达到最大值,例如1010,如果找到就使用该c值。
2、L0 attack
由于0-范数是不可微的因此不能使用标准的梯度下降法来进行求解,因此我们基于L2攻击来生成L0攻击。具体而言,就是先根据L2攻击生成扰动向量δ,因此x+δ就是一个对抗样本,我们计算g=f(x+δ),然后根据评估函数g选择像素i=argminigiδigi实际上评估的是像素i对于输出f的影响),然后固定像素i,再利用L2攻击生成对抗样本,直至无法找到对抗样本为止。
3、L attack
对于无穷范数,假设我们使用类似于之前的:
mincf(x+δ)+||δ||

我们可以很轻易的发现梯度下降法的效果并不理想(例如l_bfgs的无穷范数),这是由于||δ||只会惩罚向量中最大的那个元素,而对于其余元素没有任何影响。因此,梯度下降很快就会停滞在两个次优解之间。 考虑一个情况,其中i=0.5j=0.5ϵL只会惩罚δi而不会惩罚δj。并且δj||δ||在该点的值为0,因此梯度仍然会增大δj,尽管它已经很大。 因此在下一次迭代中,可能会移动到δjδi略大的位置,比如i=0.5ϵj=0.5+ϵ,这就可能陷入僵局。 换句话说,梯度下降可能在δi=δj=0.5的线上来回摆动。
 鉴于此,作者转而提出优化如下问题:
mincf(x+δ)+i[(δiτ)+]

在每次迭代之后,如果对所有的i都有δi<τ,我们将τ减少0.9倍并重复; 否则,我们终止搜索。
再次,我们必须选择一个好的常数c用于L攻击。 我们采用与L0攻击相同的方法:首先将c设置为非常低的值,然后以此c值运行L攻击。 如果失败,我们加倍c并重试,直到成功。 如果c超过固定阈值,我们中止搜索。
在每次迭代中使用“热启动”进行梯度下降,作者指出该算法的速度与之前的L2算法(使用单个起点)一样快。
实际上0-范数攻击很慢,并且也不是很好的攻击方式,作者也并不推荐。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页