您的位置:首页 > 其它

对抗样本与对抗训练

2017-09-18 10:35 344 查看
(本文讨论仅限个人观点,因为我见解有限,错误难免(我也可能不定时更新想法),欢迎和我讨论jsxiejp@163.com)

本文将会介绍对抗样本与对抗训练的相关知识(请将此对抗训练与Ian Goodfellow的生成对抗网络区别开来)。综合Ian Goodfelow在Berkeley CS 294-131的deeplearning topic上面的讲义,我将从以下几个方面介绍:

什么是对抗样本?
它们是怎么出现的?
它们是怎么危害到机器学习系统?
有什么办法防范?
怎样使用对抗样本训练机器学习?

由于本人的研究方向并非是神经网络,或者机器学习,所以对相关related work没有系统的调研,仅限于读过的几篇文章,浅尝辄止,有兴趣的读者可以参考论文原文。


1、什么是对抗样本?

自从2013年以来,深度的神经网络模型在各方面得到了广泛应用,甚至在某些方面达到可以匹配人类的性能,比如人脸识别,最高已经可以达到99.5%的识别率,代表产品有face++等。然而Christian Szegedy等人在2014年发表一篇文章:Intriguing properties of neural networks。这篇文章介绍了关于神经网络一个有趣的现象,即神经网络学习到的那个函数是不连续的!只需要在一张图片上做微小的扰动,就能让图片以很高的置信度被错误分类,甚至能让图片被分类一个指定的标签(不是图片正确所属的标签)。这对图片分类系统无疑是危害巨大!试想在支付宝这样使用人脸识别的应用中,攻击者可以轻轻松松伪装成“马云”会怎么样,呵呵。我们把这种攻击方式叫做“adversarial
example”。其实在机器学习领域中,对抗样本的问题并不是第一次提到。Biggo等人在Evasion attacks against machine learning at test time这篇文章里就介绍过。他们给潜在的“敌人(adversary)”定义了一个模型“Adversary model”。一个敌对模型包括adversary goal, adversary knowledge和adversary capability等几个方面:

adversary goal(攻击目标): 分为两种目标,一是能够分类为好的即可(在垃圾邮件检测中,指分类为好的邮件)。如果有一个函数g定义在样本空间中X,g(x)<0表示分类为好,那么敌人的目标就是设计一个样本x*,让g(x*)<0。这种攻击很容易破解,只要调整分类界限即可(这里指g(x)=0这条边界)。所以,其实攻击者还有一个更好的目标是让g(x)尽可能小。

adversary knowledge: 敌人对机器学习训练系统的知识包括:

训练集是什么
样本的特征表示
学习算法是什么,决策函数是什么
分类模型是什么,比如线性分类器的权重
分类器的反馈

显然敌人拥有什么样的知识对系统的危害程度会不一样。

- adversary capability: 敌人的能力,包括:

- 修改输入数据

- 修改特征向量

- 修改某个制定的特征

显然敌人的能力不同,攻击的危害也不同。

建立在上面模型中的敌人(或者叫对抗者,攻击者)就是试图寻找对抗样本来误导分类器。


2、它们是怎么出现的?

那么作为一个攻击方,怎么依赖他拥有的知识来做攻击(即混淆分类器)呢?

Biggo和Szegedy都提出了类似的攻击策略,基于最优化的方法,Biggo的攻击策略如下:

x∗=argmaxxg^(x),s.t.d(x,x0)≤dmax

它是说我们想找一个对抗样本x,使它尽可能被分类为好,并且与某个原来的样本x0在样本空间里还很接近(距离小于dmax)。

Szegedy的攻击策略为:

Minimize||r||2,subject to:1. f(x+r)=l,2. x+r∈[0,1]m

它是说对于给定的某个样本x,怎么找离它最近的样本,使得被分类为标签l.

这里不再赘述优化问题该怎么解,常用的方法有梯度下降,或者牛顿法,BFGS,L-BFGS. 上述两个优化问题分别使用梯度下降法和L-BFGS来解决。这两篇文章的实验细节我们也不再举例,我们只看一下结果。Biggo的实验学术味更浓,Szegedy的实验则很直观了,他们的实验显示,给定一张图片,加一个微小扰动使它被错误的分类为某个指定标签。



上面每副图片的左侧是真实的图片,中间是加的噪音(就是优化问题中的r),右边是生成的对抗样本图片。很好笑的是,6张对抗样本全部被错分类为了鸵鸟!!

所以,这里已经解决了怎么找对抗样本的问题,但是没有深入到问题的本质,为什么能够找到?能找到我们不意外,因为我们总可以在原来的图片上“动手术”,让他改成我们要的样子,但是Szegedy的实验很出人意料,因为结果显示其实只需要很微小的扰动就能随意改变分类的标签,这又是为什么?

下面我们再继续讨论,首先先看goodfellow是怎么总结现有结论的:

使用Box-constrained L-BFGS能够找到对抗样本
在ImageNet这样的数据集里,对抗样本和原始样本的差别非常小,人眼不可分别
同样的对抗样本,会同时被不同的分类器错误分类,哪怕他们使用了不同的训练集
浅层的softmax回归模型对对抗样本也很脆弱
在对抗样本上训练能够正则化模型,但是代价高昂,因为训练集不容易获得。

注意最后一条,大家可能在想,我们手动生成对抗样本喂给分类器学习不就完了吗,但是效果并不好,因为对抗样本的生成比较expensive。如果我们能知道对抗样本产生的原因,也许能更轻松的制造对抗样本,从而训练。

在这些结论基础上,我们开始学习Ian Goodfellow的这篇文章,Explaining and Harnessing Adversarial Examples.

对抗样本产生的原因仍然不是特别清楚,有人怀疑是因为深度神经网络模型的非线性性,也许再加上不充分的模型平均和不充分的正则化(即过拟合)。G认为这些猜测都是不必要的,相反,他认为模型在高维空间中的线性性是对抗样本存在的罪魁祸首!!!

举个例子,下面从一个线性模型入手,来解释对抗样本的存在性问题。

在很多问题当中,一个输入的特征的取值精度通常是有限制的,这就意味着当在特征的取值上做一个微小的扰动(在精度范围内),分类器不应该返回不同的结果。比如我们现在有一个样本x和一个对抗输入x~=x+η,当η足够小的时候,分类器对x和x~的响应应该要一样的。考虑一个权值向量ω,此时的响应为

ω⊤x~=ω⊤x+ω⊤η.
对抗扰动使得激发增长了ω⊤η.
显然,我们可以让η=sign(ω)来使激发增长最大。如果ω有n个维度,如果在每个维度上增加m,那么激发可以增加ϵmn。因为||η||∞与维度无关,而激发增加量随维度线性增长,那么在高维问题中,我们可以很大程度改变输出,但是在输入上只需要做极小的改动!这个例子说明,如果维度足够的话,一个简单的线性模型同样存在对抗样本的问题。过去对对抗样本的那些牵扯到神经网络的性质的解释,比如误认他们具有高度的非线性性,可能都不对。Ian基于线性性的假设更简单,并且能够解释softmax回归也对对抗样本很脆弱的事实。
因此,基于线性性,对抗样本很容易生成。Ian假设神经网络同样是因为太“线性”而不能抵抗对抗样本。LSTMs, ReLUs, 和maxout网络都设计得很“线性”,所以他们很容易被利用。我们可以想象一个具有高度线性性的网络训练出来的函数,它的高阶导数近似于0,Taylor展开以后占主导作用的是线性部分,所以可以类比为线性分类器。线性性意味着线性模型上面的微小扰动同样能够破坏神经网络。假设有一个模型,它的参数是θ,输入是x,y是x的目标,J(θ,x,y)是神经网络的损失函数。在目前的θ值,局部上可以将函数近似为线性,使用线性模型的攻击方法,我们得到一个最优的扰动

η=ϵsign(∇xJ(θ,x,y)),

这种方法称为生成对抗模型的快速梯度符号法,梯度可以通过反向传播算法(backpropagation)计算获得。


3、它们是怎么危害到机器学习系统?

讲到这里,有的人可能云里雾里了。如果我们有两张图片,人眼看上去一模一样,都是一间房子,但是cnn把一张分类为房子,一张分类为鸵鸟,这种分类器还有什么用啊。如果我们的模型随随便便就被欺骗,还能被投入使用吗,那那些研究不成了纸上谈兵了吗。但仔细看的人可能会说,不要慌。呵呵,确实,我们回过头去看,对抗样本是怎么找到的。即使是Ian的方法,都需要知道梯度怎么求,可是攻击者怎么知道我的模型是什么样子呢,换句话说,他不会求梯度生成对抗样本啊!

可惜,对抗样本还有一个重要性质,叫做Transferability,转移性。什么意思呢,就是我在我的模型上找到一个对抗样本,放到别人的模型上,居然也有效。而且我通过我的模型把房子分类成鸵鸟,别人的模型很多时候居然也分类成了鸵鸟。。。这个可以称作灾难了,最后的堡垒也被攻破了,我们再怎么隐藏模型的细节,也可能会被攻击。(引用:Transferability in Machine Learning: from Phenomena to Black-Box Attacks using Adversarial Samples)

先等一下,我们再好好思考一下对抗样本的问题:有一张图片(房子),加了噪音,变成了鸵鸟。首先我们不用担心的是,这个噪音很难找,不是任意一个随机的噪音都能让原来图片被误分类。在线性模型中,在一张227*227图片的每个像素里做随机扰动,他们基本上都能抵消,即使不抵消,余下的也很少,而且扰动的方向不一定沿着梯度的负梯度符号方向,所以我们不担心这种情况。

再回来,现在的分类器,正确率都特别高,softmax,cnn在mnist上面都有90%以上的正确率。这些分类器基本上都接近了分类的正确准则,他们差不多是等价的。这里说的很悬,我的意思是说,cnn和线性分类器很像,他们对输入的图片所做的操作,变换,最终结果都是线性的变换。而一张精心制作的对抗样本,是在负梯度符号方向上做微小扰动,而大部分的分类模型都有很高的线性性,他们对这种对抗策略应该是一样脆弱。


4、有什么办法防范?

参见下一节


5、怎样使用对抗样本训练机器学习?

以最简单的logistic regression为例。如果我们要训练一个模型来识别标签y∈{−1,1}, P(y=1)=σ(w⊤x+b),其中σ为sigmoid函数,然后在

Ex,y∼pdataζ(−y(w⊤x+b))

上作梯度下降,其中ζ(x)=log(1+exp(z))是softplus函数。下面将x代替为x上面的线性扰动,推到出的解析式为

Ex,y∼pdataζ(y(ϵ||w||1−w⊤x−b)).

这类似于L1正则化,但不同的是,L1罚项是从激发中减去,而不是加到损失函数中。这样的坏处是会恶化欠拟合的情况。下图是Ian的解释原文:


需要注意的是,这里对于损失函数的估计过于悲观。在softmax回归中,很难找到一个扰动,让他在每个标签的梯度上都达到最坏(即与他们的符号相反),因此我们有必要减少ϵ。

Szegedy的文章Intriguing properties of neural networks表明将对抗样本和普通样本一起给模型训练能够使模型稍微正则化。训练对抗样本和普通的数据增加不一样:通常我们通过对数据进行变形来增加数据,这样变形后的数据是可能出现在测试集里的。而对抗样本这种数据通常不可能自然地出现在测试集中,但是它们可以揭露出模型的缺陷。增加对抗样本来训练并没有显著提高性能,有可能是因为实验样本不太够(Szegedy那篇文章使用expensive的L-BFGS来寻找对抗样本)。

Ian发现使用对抗目标函数(基于快速梯度符号法)能够有效正则化模型:

J~(θ,x,y)=αJ(θ,x,y)+(1−α)J(θ,x+ϵsign(∇xJ(θ,x,y)).

用这个方法来训练dropout网络,能够使错误率从0.94%降到0.84%。Ian发现训练集上的错误率并没有下降到0,作者做了两个改变,首先使网络更大,将每一层网络的节点从240增加到1600。如果没有对抗训练这可能会导致过拟合,此时测试集上错误率有1.14%。原来的maxout网络中验证集上错误率会平坦下降,但速度很慢,而对抗验证集不是,因此在对抗验证集上使用早停法。

对抗训练的过程可以看做当数据被恶意扰动的时候,最小化最差情况的错误率。我在intel实习的一次组会上介绍过对抗训练,当时我提到使用正则化能有效降低对抗样本的错误分类率,有同事发出质疑:

Q.正则化以后的实验是不是仍然用同样的对抗样本,如果是,那就没有意义,因为模型参数改变了,对抗样本理应重新找。如果不是,那很难理解,因为模型的线性性并没有改变,仍然可以找到对抗样本,没有理由错误率会降低。

我的回答是:

A.在论文原文里面作者是这样描述的:

“The model also became somewhat resistant to adversarial examples. Recall that without adversarial training, this same kind of model had an error rate of 89.4% on adversarial examples
based on the fast gradient sign method. With adversarial training, the error rate fell to 17.9%.”

所以对于上面那个问题,我倾向于后者,也就是作者针对新模型,使用了Fast gradient sign method方法重新生成一批新的对抗样本。那为什么线性性没有改变,错误率能降低这么多呢。我觉得有一种可能解释是对于strong的正则化,模型(比如说线性模型)的weight会变得比较低。记得我们举过的例子,对线性模型,精心设计的对抗样本能使模型的activation改变大约ϵmn,这里的\epsilon是样本允许的波动范围,是固定的,m是平均的weight,当m很小的时候,对activation的扰动ϵmn会很小,从而对分类的影响比较小。所以,这里问题的关键变成了为什么strong的正则化会使weight降低。还记得在cost
function里面加的正则化,是对样本的扰动进行惩罚,而高weight会使样本的扰动更大,那训练的时候模型显然会自然的降低weight来减少cost function的值。所以strong的正则化会使weight降低。*
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: