20世纪初,一匹叫汉斯的马引起了巨大的轰动。
汉斯的主人是一位退休的中学教师,名叫威廉·冯·奥斯滕。他想弄清楚,通过系统的授课,一匹马的思维能力究竟能提高和发展到什么程度。
聪明的汉斯经过了一段时间的训练,“掌握了简单的数学运算”。当奥斯滕问汉斯“一加一等于几”的时候,它会用蹄子在地上“嗒,嗒”的敲出答案,敲两下代表结果是二。
聪明的汉斯引起了科学机构的关注。在第二次更为深入的调查中,人们发现,如果在提问汉斯时,在场的人谁也不知道问题的答案,或者汉斯看不到提问者,汉斯就会陷入迷乱,既不会数数,也不会计算。
原来汉斯并不是根据问题来分析,并决定要敲多少下蹄子,而是通过观察提问者和现场观众的细微线索,比如身体姿势,面部表情等,来决定什么时候停止敲蹄子。例如,如果让马计数7 ,它开始用蹄子踏地,当它踏够了数目,奥斯滕送出的微细信号告诉它已经数够了,它便停下来。汉斯十分敏感,即使奥斯滕的眉毛微微一挑,甚至是他鼻孔的微小扩张也足够使它从中得到正确答案。不但如此,汉斯还会通过周围观看者“下意识发出的信号”得到正确答案的线索。汉斯没有计算能力,它拥有的是敏锐的观察能力。
聪明汉斯的故事对机器学习领域有着相当的启发作用。
训练汉斯做数学题就如同在机器学习中训练一个模型。奥斯滕不断的训练相当于提供了训练集,他真的以为自己在教汉斯数学,但实际上汉斯学会的是如何在观察到奥斯滕的细微反应时停止敲蹄子。就像我们在认为卷积神经网络在经过训练之后拥有了超越人眼的识别能力,但其实神经网络并没有超越人类。正如Ian Goodfellow所说,"when confronted by even a trivial adversary, most machine learning algorithms fail dramatically. In other words, we have reached the point where machine learning works, but may easily be broken." 。一个微不足道的对手就可以打败机器学习,比如对抗样本,一个小小的调整就可以让机器学习算法输出错误结果的输入样本。
“聪明的汉斯”这种依赖提示而不是问题本身的做法缺少泛化性。现在的机器学习算法,在某种程度上也是这种情况。模型能够学得训练集的特征,这些线性的特征甚至对与训练集同分布的测试集有很好的泛化性。但是如果测试样本的分布发生了偏移,一个有恶意的敌人故意生成这种样本尝试去欺骗模型,这些模型是很脆弱的。
一个人工智能系统在训练时或者在进行预测时都有可能被袭击者盯上。袭击者的袭击可以影响系统的保密性(confidentiality)、完整性(integrity)和可用性(availability),三者可以合称为安全领域的“CIA模型”。
目前已经可以明确表述的袭击方式有三种:在训练时对模型进行完整性袭击,在推断也就是做决策时进行完整性袭击,以及隐私袭击。
有毒的训练数据集
袭击者可以通过修改现有训练数据、或者给训练集增加额外数据的方法来对训练过程的完整性造成影响。比如假设莫里亚蒂教授要给福尔摩斯栽赃一个罪名,他就可以让一个没被怀疑的同伙送给福尔摩斯一双独特、华丽的靴子。当福尔摩斯穿着这双靴子在他经常协助破案的警察面前出现过以后,这些警察就会把这双靴子和他联系起来。接下来莫里亚蒂教授就可以穿一双同样的靴子去犯罪,留下的脚印会让福尔摩斯成为被怀疑的对象。
在机器学习中,袭击者所采取的策略是扰动训练点使得机器学习模型在应用于生产时增加预测误差。具体来说,这样的方法可以在支持向量机的训练集中下毒。由于算法中预测误差是以损失函数的凸性衡量的,这就让袭击者有机会找到对推理表现影响最大的一组点进行袭击。即便在更复杂的模型中也有可能找到高效的袭击点,深度神经网络就是这样,只要它们会用到凸优化。
对抗样本
实际上,让模型出错是非常简单的一件事情,以至于袭击者都没必要花功夫在训练机器学习模型参数的训练集中下毒。他们只要在推理阶段(模型训练完成之后)的输入上动动手脚,就可以立即让模型得出错误的结果。
要找到能让模型做出错误预测的干扰,有一种常用方法是计算对抗性样本。它们带有的干扰通常很微小,人类很难发现,但它们却能成功地让模型产生错误的预测。
上图描述了一个卷积神经网络在图片分类时,给需要判别的图片加入一丝细微的人眼无法察觉的改动之后,神经网络以更大的确信度将熊猫误分为长臂猿。
值得注意的是,虽然人类无法用肉眼分辨,但是图像中施加的干扰已经足以改变模型的预测结果。确实,这种干扰是在输入领域中通过计算最小的特定模得到的,同时它还能增大模型的预测误差。它可以有效地把本来可以正确分类的图像移过模型判定区域的边界,从而成为另一种分类。下面这张图就是对于能分出两个类别的分类器,出现这种现象时候的示意。
关于聪明汉斯
一个开源的 cleverhans 项目,是 TensorFlow下面的一个子库,用于对抗样本生成的标准实现,也可用于对抗训练和再现基准。项目地址:https://github.com/tensorflow/cleverhans