聪明汉斯的故事
在二十世纪初的德国,有一匹名叫汉斯的马非常有名。在主人威廉•冯•奥斯滕的训练下,聪明的汉斯经过了一段时间的训练,掌握了简单的数学运算。当奥斯滕问汉斯“一加一等于几”的时候,它会用蹄子在地上“嗒,嗒,嗒”的敲出答案。围观的群众看到汉斯能够正确的回答各种数学题,都感到惊讶和神奇。
同时,人们也疑惑,汉斯是否真的通过训练学会了过去人们认为动物做不到的事情。在一系列的调查中,人们发现,如果在提问汉斯时,提问者并不知道问题的答案,或者马看不到提问者,汉斯就无法正确回答。
原来汉斯并不是根据主人的问题来决定要敲多少下蹄子,而是通过观察提问者和现场观众的细微线索,比如身体姿势,面部表情等,来决定什么时候停止敲蹄子。汉斯没有学会如何做数学运算,它只是善于观察。
在感知认知心理学和社会心理学等领域,做实验的时候都是做双盲实验,以此控制这种“聪明汉斯效应”。而聪明汉斯的故事对机器学习领域也有启发作用。
训练汉斯做数学题就像是机器学习中训练一个模型。奥斯滕不断的训练相当于提供了训练集,他真的以为自己在教汉斯数学。其实汉斯学会的是如何在观察到对应的细微反应和动作时停止敲蹄子。但是汉斯这种依赖提示而不是问题本身的能力缺少泛化性,于是在人们故意将提示藏起来的测试集上,汉斯失败了。虽然,在通常情况,汉斯对有观众的测试集有较好的泛化性。
对于现在的机器学习算法,某种程度也是这种情况。模型能够学得训练集的特征,这些过为线性(之后解释)的特征甚至对与训练集同分布的测试集有很好的泛化性。但是如果测试样本的分布发生了偏移,一个有恶意的敌人故意生成这种样本尝试去欺骗模型,这些模型是很脆弱的。
对抗样本
什么是对抗样本
从2013年开始,深度学习模型在多种应用上已经能达到甚至超过人类水平,比如人脸识别,物体识别,手写文字识别等等。 在之前,机器在这些项目的准确率很低,如果机器识别出错了,没人会觉得奇怪。但是现在,深度学习算法的效果好了起来,去研究算法犯的那些不寻常的错误变得有价值起来。其中一种错误叫对抗样本(adversarial examples)。
对抗样本指的是一个经过微小调整就可以让机器学习算法输出错误结果的输入样本。在图像识别中,可以理解为原来被一个卷积神经网络(CNN)分类为一个类(比如“熊猫”)的图片,经过非常细微甚至人眼无法察觉的改动后,突然被误分成另一个类(比如“长臂猿”)。
Figure2 图片来源
多方研究者的工作表明,我们可以对任意图像,加上一点细微的,无法察觉的噪声,从而使其被分类为任意的标签。更甚者,不少的对抗样本对不同的卷积网络有泛化性,可以同时欺骗不同结构的模型。在现实生活中,经过相机拍照,在不同光照环境拍摄角度的情况下,经过打印,对抗样本人会被错误分类。
这说明对抗样本出现,不是因为这些图片有着一些脆弱的特点,或者模型对某些属性的过拟合造成的。我们不应该把对抗样本想象成孤立的outliers,可能理解成它们来自对抗样本子空间更为准确。
如何产生对抗样本
在讨论为什么对抗样本攻击可行和为什么这些卷积网络容易被欺骗前,先来介绍一下对抗样本是如何产生的。
先稍微扯开话题一下,谈谈如何理解深度学习能成,假设有个训练好的用于做物体识别的CNN,怎么去理解这个CNN的工作机制。IanGoodfellow提到在Google一位同事之前做的一个可视化实验。这位同事Christian当时在尝试理解CNN原理时,他想到或许可以用一张图片比如说一艘船,然后逐渐地将这张图片转化成一张能被CNN识别为飞机的图片。
基于人脑的理解,我们可能会觉得这张图片的背景会变蓝,或者图片中的船长出了飞机的机翼。从而就能认为CNN利用蓝天或者机翼作为特征来辨认飞机的。但事实完全不是这么回事。
Figure3