explaining and harnessing adversarial examples
Goodfellow大神 2015年在 ICLR上的 神作。开始拜读。
Goodfellow 大神 2015年在 ICLR上的 神作。开始拜读
1、对抗样本
对抗样本是指,从人眼来看,与哪些模型正确估计的模型相差不大,但是模型却估计错误,甚至错的很离谱,前沿的算法模型,不管是基于机器学习,还是基于神经网络的,都很容易在对抗样本上估计错误。
在实际中训练神经网络时,确实出现一个怪象,就是,往往在测试集上性能特别好,但是在实际应用中,性能比较低。有一种可能是,模型没有学习到真正的隐喻特征,所以在遇到数据分布中,出现概率很低的数据,识别性能很低。
2、FGSM的符号
输入样本是 xxx
对抗样本是 x^=x+η\hat{x} = x +\etax^=x+η
现在来对 η\etaη 进行定义和限制,输入的 xxx 受精度限制,应为输入图片的RGB都是8个字节的,因此最小的精度为 1/2551/2551/255,可以称这个精度为 eee,小于这个的精度的都不被识别。
那么,如果,η\etaη 中的每个维度都小于精度,即
∥η∥∞<e \|\eta\|_\infty < e∥η∥∞<e
插一个解释,这种是最大范数约束,即向量η\etaη中的绝对值最大的元素,不能超过 e。
接下来往下说,那对于 xxx 和 x^=x+η\hat{x} = x +\etax^=x+η 来说,我们期望模型的输出估计应该是一致的。
w⊤x^=w⊤x+w⊤η \mathbf{w}^{\top} \hat{x} = \mathbf{w}^{\top}x + \mathbf{w}^{\top} \etaw⊤x^=w⊤x+w⊤η
所以针对 正常的 xxx 来说,经过一层卷积之后,扰动 η\etaη 变成
w⊤η \mathbf{w}^{\top} \etaw⊤η
现在就是想让这种扰动最大化
w⊤η=max∣ηi∣<e∑iwiηi \mathbf{w}^{\top} \eta = \max\limits_{|\eta_i|<e}\sum_{i}w_i \eta_iw⊤η=∣ηi∣<emaxi∑wiηi
首先,要求 w⊤η\mathbf{w}^{\top} \etaw⊤η 的最大值,可以把向量www和η\etaη每个维度对应相乘,那么要想整个数值最大,最基本的,应该是wiw_iwi和ηi\eta_iηi 二者同向,同向一定产生正值,反向一定产生负值,有负值存在的情况下,w⊤η\mathbf{w}^{\top} \etaw⊤η,一定不是最大值。所以
η=sign(w)\eta = sign(w)η=sign(w)
就很好理解了。
再次观察 w⊤η\mathbf{w}^{\top} \etaw⊤η,来估计下,整个变化有多大,假如 www 的维度为n,每个维度的平均大小为m , η\etaη 中每个维度的扰动都取最大值 e,那么w⊤η\mathbf{w}^{\top} \etaw⊤η之后,扰动可以增加 emnemnemn
背后的意思是,每个维度的扰动都很小,但是有n个维度,每个维度都在同方向加贡献,那扰动就会成倍的增加,Goodfellow 论文里的核心观点之一:
对抗样本不是模型太复杂,而是模型太“线性 + 高维”
一个简单的线性模型也有对抗样本,如果模型的输入维度非常高,
3、FGSM实现公式
η=ϵ sign (∇xJ(θ,x,y)) \eta = \epsilon \, \operatorname{sign}\!\left(\nabla_x J(\theta, x, y)\right) η=ϵsign(∇xJ(θ,x,y))
η=∇xJ(θ,x,y)\eta =\nabla_x J(\theta, x, y)η=∇xJ(θ,x,y)是关于x的梯度,这个梯度的意思是,经过卷积之后,x要怎么变化,才能让损失函数变化最大,对于扰动,我先不决定大小,先决定方向,如果增加的扰动的方向,和这个梯度方向一致,不管梯度有多大,只要往同方向上加上扰动,就可以让损失增加。
为什么不是梯度本身?
因为梯度本身的数值不可控,不确定每次都能落到绝对值小于e的范围呢。
4、FGSM代码解读
- 创建模型,这个代码中网络是一个三层MLP网络的分类网络,在MNIST上训练和测试,输入维度是784,输出维度是10 ,即10个类别,模型的训练和测试,和其他无异
self.mlp = nn.Sequential(
nn.Linear(self.x_dim, 300),
nn.ReLU(True),
nn.Linear(300, 150),
nn.ReLU(True),
nn.Linear(150, self.y_dim)
)
- 从测试集中随机取一定数量的测试样本,包括测试数据x_true和y_true,可以得到这批测试集的测试精度。
- 开始FGSM,首先需要将输入的图片x数据变量化x_adv,即需要在拓扑图中求导,然后将x_adv扔到网络中,得到网络输出结果h_adv,大小10x1,再扔到损失函数中,计算损失值cost,cost.backward()一句话,就得到了网络里面每个变量的梯度,x_adv.grad.sign_(),就将x_adv节点的梯度都换成1/-1的方向了,然后就是更新x_adv,eps*x_adv.grad 就是我们得到的扰动
def fgsm(self, x, y, targeted=False, eps=0.03, x_val_min=-1, x_val_max=1):
x_adv = Variable(x.data, requires_grad=True)
h_adv = self.net(x_adv)
if targeted:
cost = self.criterion(h_adv, y)
else:
cost = -self.criterion(h_adv, y)
self.net.zero_grad()
if x_adv.grad is not None:
x_adv.grad.data.fill_(0)
cost.backward()
x_adv.grad.sign_()
x_adv = x_adv + eps*x_adv.grad
x_adv = torch.clamp(x_adv, x_val_min, x_val_max)
- 再将得到的x_adv扔到网络里面,得到预测值
h = self.net(x)
h_adv = self.net(x_adv)
return x_adv, h_adv, h
5、FGSM总结
这里的总结,可以试着从创始者的角度来思考下,FGSM是如何提出来的,首先对抗样本是存在的,在之前读的一篇论文中,是在原始图片中找一个像素的扰动,卷积到最后,足以改变预测结果,并且和没有增加这一个扰动前相比,差别很大,那么是不是可以定义扰动,就是在原始图片中增加非常微小的扰动,这种扰动在人眼中分辨不出来,但是到输出端变得足够大,直接改变了预测结果。如果想制造这种扰动,应该怎么找。
再进一步思考,增加的扰动使得预测结果非常差,这张图片如果拿来训练,它的损失值肯定特别大,那这样就可以给扰动增加约束了,首先人眼无法分布,可以让 ∥η∥∞<e\|\eta\|_\infty < e∥η∥∞<e;其次预测值很差,那就是损失值增加。这样扰动的大小限值有了,扰动的方向怎么定,朝哪里扰动呢,肯定是超损失函数变大的方向了,那这个不是关于x的梯度的方向么?
这样一理,逻辑就顺了很多。
6、深度网络的对抗训练
论文中的一些观点很有意思,首先,作者说,不像是浅层的网络,深层网络至少是能够学习到一种函数,可以对抗扰动的。因为1989年,Hornik 的通用逼近理论(这篇论文拜读过),具有至少一个隐藏层的神经网络可以以任意精度表示任何函数,只要其隐藏层被允许有足够的神经元。但是通用逼近理论没有说明,训练的算法是否能够找到这种满足特性的函数。
我觉得这句话可以这样理解,就是其实我们建立的深度网络,已经具备了可以表征任何精度的函数,那问题是,我们的训练手段,是否能够找到这种表征方式呢。
有论文中将对抗样本和正常的样本混合起来训练模型,这种模型可以在一定程度上正则化。在对抗样本上进行训练,觉得有点像数据增强,但是这种和数据增强有一定的差别,例如使用平移将图片进行增强,是期望能在测试集上出现类型的图片,但是对抗样本在测试图片中很少出现,对抗样本更多的是模型本身的缺陷。
作者在深度学习网络里面,提出了以下损失函数:
J^(θ,x,y)=αJ(θ,x,y)+(1−α)J(θ,x+ϵ sign (∇xJ(θ,x,y))) \hat{J}(\theta, x, y) =\alpha J(\theta, x, y) + (1 - \alpha) J(\theta, x + \epsilon \, \operatorname{sign}\!\left(\nabla_x J(\theta, x, y)\right)) J^(θ,x,y)=αJ(θ,x,y)+(1−α)J(θ,x+ϵsign(∇xJ(θ,x,y)))
上面是基于FGSM的对抗训练,步骤如下:
- 输入图片x,进行正常的前向传播,得到损失值A;
- 就损失值关于x的梯度,得到梯度方向,进而得到扰动;
- 原始图片x上加上扰动,成为基于FGSM的对抗图片;
- 对抗图片进行前向传播,得到损失值B;
- 损失值A和损失值B加权,得到总的损失值。
作者在论文里面说,用的参数是 α=0.5\alpha=0.5α=0.5,并不是说这个值非常好,而是,这个值已经足够了,所以作者没有进一步取探究取其他值,会有什么变化。这种方法意味着我们不断更新对抗性示例的供应,使其能够抵抗当前版本的模型。这种方法,使错误率从0.94%降低到0.84%。
更多推荐



所有评论(0)