对抗样本:知其然,知其所以然

TinyMind 2018-07-17 17:43
关注文章

聪明汉斯的故事

 

在二十世纪初的德国,有一匹名叫汉斯的马非常有名。在主人威廉•冯•奥斯滕的训练下,聪明的汉斯经过了一段时间的训练,掌握了简单的数学运算。当奥斯滕问汉斯“一加一等于几”的时候,它会用蹄子在地上“嗒,嗒,嗒”的敲出答案。围观的群众看到汉斯能够正确的回答各种数学题,都感到惊讶和神奇。


同时,人们也疑惑,汉斯是否真的通过训练学会了过去人们认为动物做不到的事情。在一系列的调查中,人们发现,如果在提问汉斯时,提问者并不知道问题的答案,或者马看不到提问者,汉斯就无法正确回答。

 

原来汉斯并不是根据主人的问题来决定要敲多少下蹄子,而是通过观察提问者和现场观众的细微线索,比如身体姿势,面部表情等,来决定什么时候停止敲蹄子。汉斯没有学会如何做数学运算,它只是善于观察。

 

在感知认知心理学和社会心理学等领域,做实验的时候都是做双盲实验,以此控制这种“聪明汉斯效应”。而聪明汉斯的故事对机器学习领域也有启发作用。

 

训练汉斯做数学题就像是机器学习中训练一个模型。奥斯滕不断的训练相当于提供了训练集,他真的以为自己在教汉斯数学。其实汉斯学会的是如何在观察到对应的细微反应和动作时停止敲蹄子。但是汉斯这种依赖提示而不是问题本身的能力缺少泛化性,于是在人们故意将提示藏起来的测试集上,汉斯失败了。虽然,在通常情况,汉斯对有观众的测试集有较好的泛化性。


对于现在的机器学习算法,某种程度也是这种情况。模型能够学得训练集的特征,这些过为线性(之后解释)的特征甚至对与训练集同分布的测试集有很好的泛化性。但是如果测试样本的分布发生了偏移,一个有恶意的敌人故意生成这种样本尝试去欺骗模型,这些模型是很脆弱的。

 

对抗样本

什么是对抗样本

从2013年开始,深度学习模型在多种应用上已经能达到甚至超过人类水平,比如人脸识别,物体识别,手写文字识别等等。 在之前,机器在这些项目的准确率很低,如果机器识别出错了,没人会觉得奇怪。但是现在,深度学习算法的效果好了起来,去研究算法犯的那些不寻常的错误变得有价值起来。其中一种错误叫对抗样本(adversarial examples)。

 

对抗样本指的是一个经过微小调整就可以让机器学习算法输出错误结果的输入样本。在图像识别中,可以理解为原来被一个卷积神经网络(CNN)分类为一个类(比如“熊猫”)的图片,经过非常细微甚至人眼无法察觉的改动后,突然被误分成另一个类(比如“长臂猿”)。


Figure2 图片来源

 

多方研究者的工作表明,我们可以对任意图像,加上一点细微的,无法察觉的噪声,从而使其被分类为任意的标签。更甚者,不少的对抗样本对不同的卷积网络有泛化性,可以同时欺骗不同结构的模型。在现实生活中,经过相机拍照,在不同光照环境拍摄角度的情况下,经过打印,对抗样本人会被错误分类。

 

这说明对抗样本出现,不是因为这些图片有着一些脆弱的特点,或者模型对某些属性的过拟合造成的。我们不应该把对抗样本想象成孤立的outliers,可能理解成它们来自对抗样本子空间更为准确。

 

如何产生对抗样本

 

在讨论为什么对抗样本攻击可行和为什么这些卷积网络容易被欺骗前,先来介绍一下对抗样本是如何产生的。

 

先稍微扯开话题一下,谈谈如何理解深度学习能成,假设有个训练好的用于做物体识别的CNN,怎么去理解这个CNN的工作机制。IanGoodfellow提到在Google一位同事之前做的一个可视化实验。这位同事Christian当时在尝试理解CNN原理时,他想到或许可以用一张图片比如说一艘船,然后逐渐地将这张图片转化成一张能被CNN识别为飞机的图片。

 

基于人脑的理解,我们可能会觉得这张图片的背景会变蓝,或者图片中的船长出了飞机的机翼。从而就能认为CNN利用蓝天或者机翼作为特征来辨认飞机的。但事实完全不是这么回事。


Figure3 图片来源

图中分别是船,小车,猫还有吉普按照从左到右从上到下通过梯度下降和反向传播逐渐向飞机转变的过程,最后一张图片已经被CNN以高概率认为是飞机了。但除了猫的脸颜色变得有点蓝,所有图片几乎发现不出任何变化。

 

发现了吗,梯度下降和反向传播(见补充内容)没有把原图像变成一架飞机,而是找到能够欺骗CNN的图像,找到了对抗样本。

 

原本在训练分类器CNN的时候,是保持输入图像不变,通过反向传播更新模型参数来提高对目标标签的分数。而现在要得到对抗样本,只需要保持模型的参数不变,对图片的每个像素值计算梯度并更新。

 

那么问题来了,调整了图片的像素值后,模型输出的结果会发生什么变化?

 

我们通过反向传播计算量梯度,更新了图像的像素值,最终结果一样是目标标签的分数提高了。也就是说,用一张船的图片,只要往以标签为飞机的梯度方向更新图像,这只会稍微改变图像,但CNN将其分类为飞机的概率显著提高了。

 

为什么对抗样本会发生

我先直接说现在业界共识吧。对抗样本不是过拟合的结果,而是因为输入特征维度过高和模型的线性性质导致的。

 

首先,如果是过拟合。复杂的CNN过拟合了训练集,而测试集的分布是未知的,模型必然会出现一些随机性的错误。

 

举个具体的例子方便理解过拟合,图中绿色的圈圈和蓝色的叉叉是训练集中两类。我们有一个过于分类器能非常容易的拟合训练集。绿色的块块就代表分类器认为类是圈圈的范围,蓝色的块块代表分类器认为类是叉叉的范围。可以看到分类器能正确将训练集分类。但是因为分类器过于复杂,用来表示训练集特征空间的参数过多,分类器对没有训练集的特征空间也进行分类,随机的赋予了绿色或蓝色的块块。而就在这些空间中存在着对抗样本,红色的本该是叉叉被误认为是圈圈,红色的本该是圈圈的被误认为是叉叉。

 

如果真的是过拟合的话,每个对抗样本的出现应该算是运气不好,并且每个对抗样本某种程度上是独特的。如果我们用不同的模型重新拟合时,应该会看到模型在训练集之外犯不同的错误。但实际上,研究人员发现许多不同的模型对同一个对抗样本会犯同样的错误,如果将一个对抗样本和原图像相减得到在图像空间上的方向向量,用来加上其他任一个图像,几乎都会被误分类。所以不是过拟合。

 

其实,合理的解释是欠拟合,由于输入空间维度过高,模型过于线性的结果。

再举个例子理解欠拟合,对于一个类似的训练集,我们用一个简单的线性模型去拟合,得到的超平面也完美的分割了训练集,但是这个超平面没有掌握训练集真正的结果,圈圈的分布明显是一个弧形,沿着弧线继续采样圈圈,却发现越过了超平面被误分;类似的叉叉的分布也容易越过超平面被误分。

 

线性模型的问题在于,对于距离决策层越远的地方,如上图的左下角和右上角部分,即使没有训练集数据出现,模型也会认为有相应的很高的概率。而线性模型在在没有训练集出现的地方做出的预测通常是有问题的,这一点也是由线性模型的特点导致的:不管这个特征或其他特征的值的大小,每个特征都有相同的偏斜率。那么当一个数据点沿着一个固定方向,在训练集中移动,当移出到训练集分布之外的地方时,模型输出的变化方向也是不变的。

 

下图是在CIFAR-10数据集上做的一个实验,可以比较好的理解模型的线性和跨越决策层。使用的攻击方法是FGSM(Fast Gradient Sign Method),不以梯度直接作为扰动,而是对梯度去符号,并用一个epsilon控制大小。 扰动公式:。


Figure 6 图片来源:DWarde-Farley, I Goodfellow - Perturbations, Optimization, and Statistics,2016

图中右边10x10的网格,每一个块描述了CIFAR-10测试集数据被分类的决策层位置。左边的图示意了每个块内部的意思,块中心表示原图像,没经过修改,往左右移动相当于对图片在FGSM攻击方向修改,上下移动代表对图像进行垂直于FGSM方向的修改。块中白色的区域表示图像被正确分类,其他颜色表示分类错误。可以明显看到,几乎所有块的左半边都被正确分类,而右半边被错误分类,而且分割线是几乎线性的。也就是说FGSM确定的方向能有效的得到对抗样本,而且对抗样本应该是存在于线性的子空间中的。打个比方就是,对抗样本和正常样本之间的关系,不像实数和无理数之间的关系,好像每个正常样本边上都能找到对抗样本,而更像是存在与区间中,在这个区间中都是对抗样本。

 

进一步来说,在高维空间,每个像素值只需要非常小的改变,这些改变会通过和线性模型的参数进行点乘累计造成很明显的变化。而图片通常都有极高的维度,所以不需要担心维度不够。也就是说,只要方向正确,图像只要迈一小步,而在特征空间上是一大步,就能大程度的跨越决策层。

 

那么,很多人会有疑问,深度学习模型也是以为太线性了?深度学习的精髓不就是那些非线性激活函数吗,如果没有非线性的激活函数,再深再多层的网络和一个单层的线性模型也什么区别,也就不可能这么有效果而被广泛使用了。


Figure7图片

再看一眼这些激活函数或许能明白,它们都是非线性函数,但却都一定程度上是线性的,比如现在最流行的relu,有一半是线性的,再回想以前流行的sigmoid函数或者tanh函数,都是希望输入值落在中间接近线性的部分而不是两边斜率接近0的部分,防止梯度消失。这也是为什么relu能取代之前sigmoid的原因,更稳定快速的训练。

 

其实仔细一想可以明白,深度模型本实确实是一个非常非线性的模型,但是模型能的组成部分都是线性的,全连接网络的矩阵乘法是线性的,卷积网络的卷积计算也是计算点乘,线性的,还有序列模型用到LSTM用的是最简单的加法,更是线性的。

 

注意,我们可以说深度学习模型从输入到输出的映射是线性的,但是从模型的参数到输出的映射不是线性的,因为每层的参数,权重矩阵是相乘得到的,这也是深度学习模型不好训练的原因之一,参数和输出的非线性关系。所以针对优化输入的优化问题要比针对模型参数的优化问题要容易得多。


对抗样本的可移植性

对抗样本的发现给深度学习敲响了警钟,提醒人们要思考深度学习的安全性和可靠性。研究者已经尝试过多种利用对抗样本的攻击,并发现可行。比如通过相似模型训练出的对抗样本,可以让亚马逊或谷歌服务器提供的图像识别服务出错,一张对抗样本经过拍照,在由手机上的图像分类对照片进行分类也会出错,而且产生这个对抗样本的模型和手机上使用的模型是不同的。


Figure8 图片来源

 

除了主流的针对基于CNN分类器的对抗样本攻击,研究的方向还涉及了其他的深度学习领域。如在自编码器和生成模型上的攻击,在循环神经网络上的攻击,深度强化学习上的攻击,在语义切割和物体检测上的攻击等。(Threat of Adversarial Attacks on Deep Learning in Computer Vision: ASurvey)

 

对抗样本防御

正所谓道高一尺魔高一丈,目前找到对抗样本比设计一个能防御对抗样本的模型要容易得多。下面我们来看几种防御的尝试,并讨论一下为什么防御这么难。


对抗训练

对抗训练是防御对抗样本攻击的一种方法。将对抗样本和正常样本一起训练是一种有效的正则化,可以提高模型的准确度,同时也能有效降低对抗样本的攻击成功率。不过这种防御也只是针对同样用来产生训练集中的对抗样本的方法。

确实在下图中可以看到,训练集是正常样本和对抗样本,测试集是正常样本的红线比训练集和测试集都是正常样本的错误率要降低,说明对抗训练是有正则化的功能。


Figure 9 图片来源

 

在训练的时候直接生成对抗样本是比较低效的,之前提到的FGSM是一个高效的对抗训练方法。只需要改变目标函数就能在训练每个正常样本的同时也考虑了对抗样本。模型训练去给对抗样本赋予和正常样本原分类同样的类别。

用经过FGSM训练的网络,可以有效的防御用FGSM产生的对抗样本攻击,但是如果换其他对抗攻击方法,也会被攻破。


defensive distillation

蒸馏是最先由Hinton提出的,通过训练一个模型来预测另一个训练好的模型输出的概率的训练过程。防御性蒸馏只是想让最终模型输出结果更柔和一点。虽然这里的前后两个模型结构相同,第一个模型训练的是硬标签(比如狗的概率是1,猫的概率是0),而第二个模型训练的是软标签(狗0.85,猫0.15),这样后面的这个蒸馏模型对FGSM攻击更具鲁棒性。


隐藏梯度

构造对抗样本的方法一般都是用到模型的梯度,比如想要模型把飞机误认为是船,只需要将飞机的图片往提高分类为船的概率的方向推一把就行。那是不是只要把模型的梯度藏起来,攻击者就往哪个方向推这个飞机了?设想用GoogleAPI得到对飞机的分类结果是99.9%飞机,0.01%的船,那么攻击者就知道,这个飞机的图片比较容易被误分为船,相当于知道了梯度的方向,只需要在自己的模型上往船的方向生成对抗样本就行了。把分类结果改成“飞机”,不给其他可能的类别就能让模型更鲁棒了呢。很遗憾,只要攻击者自己训练一个能输出各类概率的模型,用这个模型生成的对抗样本通常能攻击成功,这也叫黑盒攻击。

 

其他防御方法还有,对测试样本加入随机噪声,尝试通过autoencoder消除扰动,甚至集成学习,但总的来说,这些基于正则化的尝试最终都被证明没能完全防御。就有点像打地鼠游戏,填了一个坑,地鼠会从其他坑冒出来。

 

对抗样本之所以难以防御是因为很难去对对抗样本的生成过程建立一个理论模型。生成对抗样本的优化问题是非线性而且非凸的,我们没有掌握一个好的工具去描述这种复杂的优化问题的解,也就很难去想出理论上能解决对抗样本的方法了。从另一个角度,现在的机器学习算法有效的范围只在一个相对小的样本空间中,对比于巨大的样本空间全局,很难要求机器学习算法对空间中每个样本都输出好的结果。

 

展望与总结

最后我们来展望一下,如果解决了对抗样本的问题未来有什么潜力。有很多问题其实深度学习有希望解决的,试想我们要设计一个高性能跑车,可以用一个神经网络来对一个跑车设计图打分,评价这个车能跑的多快。然后根据让设计图产生跑的最快的跑车的优化方向更新图纸,就可以找到跑的最快的跑车。当然,实际上我们找到的是对抗样本,只是模型以为这车跑得快而已。


Figure 10图片来源

如果解决了对抗样本,就可以定义一个描述一个我们想要但还不存在东西的函数,然后通过梯度下降和神经网络来帮我们实现它。可以用来设计新的基因,给药物设计新的分子结构,甚至设计性能更好的GPU芯片。

 

本片文章介绍了对抗样本是什么,怎么产生对抗样本,详细讨论对抗样本发生的原因,并介绍了几种防御对抗样本的方法。

 

补充内容


梯度下降


想要最小化一个目标函数/损失函数时,对求导,然后按照更新,知道收敛。对于高维特征,分别对每个维度的特征求偏导,这些偏导组成的向量就叫梯度。梯度下降得到的结果是局部最优解。

 

想象自己身处于充满迷雾深山中,你想要走到山底。因为四周都是迷雾,唯一的办法就是往下坡坡度最陡的方向一步一步走。最终必然能走到最低点。

 

反向传播

针对深度神经网络,根据求导的链式法则从后向前更新模型参数。

 

 我还对Ian Goodfellow的一些演讲,分享视频做了笔记。链接


 

参考文献 

网络视频

[1] IanGoodfellow PhD DefensePresentation.

[2] On Deep Learning with IanGoodfellow, Andrew Trask, Kelvin Lwin, Siraj Raval and the Udacity Team.

[3] Heroes of Deep Learning:Andrew Ng interviews Ian Goodfellow.

[4] Lecture 16 |Adversarial Examples and Adversarial Training.

 

技术博客

 

[1] 一文详解深度神经网络中的对抗样本与学习.

[2] Attacking MachineLearning with Adversarial Examples.

[3] Breaking LinearClassifiers on ImageNet.

[4] Adversarialexamples in deep learning.

[5] cleverhans-blog.

[6] KnowYour Adversary: Understanding Adversarial Examples (Part 1/2).

[7] TheModeler Strikes Back: Defense Strategies Against Adversarial Attacks (Part2/2).

 

期刊论文

[1] Ian J Goodfellow, et al. Explaining andharnessing adversarial examples. In Proceedings of the International Conferenceon Learning Representations, 2015.

[2]Alexey Kurakin, et al. Adversarial examples in the physical world. arXivpreprint arXiv:1607.02533, 2016.

[3]Nicolas Papernot, et al. Distillation as a defense to adversarial perturbationsagainst deep neural networks. In Proceedings of the 37th IEEE Symposium onSecurity and Privacy.

[4] D Warde-Farley,I Goodfellow 11 adversarial perturbations of deep neural networks Perturbations,Optimization, and Statistics, 311.

[5] N. Papernot, P.McDaniel, I. Goodfellow, S. Jha, Z. B. Celik, and A. Swami. Practical black-boxattacks against deep learning systems using adversarial examples. arXivpreprint arXiv:1602.02697, 2016a.

[6] Naveed Akhtar, Ajmal Mian Threat of AdversarialAttacks on Deep Learning in Computer Vision: A Survey arXiv:1801.00553.

[7] Goodfellow, I., Bengio, Y., and Courville, A.Deep Learning. MIT Press, Cambridge, MA, 2016; http://www.deeplearningbook.org/.

原文链接:https://blog.csdn.net/nemoyy/article/details/81052301


{{panelTitle}}
支持Markdown和数学公式,公式格式:\\(...\\)或\\[...\\]

还没有内容

关注微信公众号