对抗范例(adversarial examples),是攻击者为了让机器学习模型产生错误而设计的输入数据,就像“机器产生了幻觉”。在这篇文章中,我们将展示对抗范例了如何通过不同媒介进行攻击,并讨论保护系统免受这种攻击难在何处。
在OpenAI,我们认为对抗范例是安全领域一个值得研究的方面,因为它们代表人工智能安全领域短期内能够处理的一个具体问题,而解决它是困难的,需要严肃的研究工作。
想知道什么是对抗范例,可以看看我曾经在论文《Explaining and Harnessing Adversarial Examples》中展示的:攻击者添加了一个经过计算的扰动,可以让程序将熊猫认作长臂猿。
△ 把对抗性输入加在普通照片智商,能让分类器将熊猫认作长臂猿
这种干扰方法还很健壮,最近有研究表明对抗范例被打印出来,再用普通的智能手机拍下,还是能迷惑机器学习系统。
△ 例如在这张图中,经过打印、再用普通的智能手机拍照,对抗性例子仍然能使分类器将洗衣机认作保险箱
对抗范例具有危险的潜力,比如用来攻击自动驾驶汽车:攻击者可以用贴纸或涂料来为停车标志创建对抗范例,让机器将其误认为“让路”等其他标志。就像我们在论文《Practical Black-Box Attacks against Deep Learning Systems using Adversarial Examples》所讨论的那样。
两项研究显示,增强学习(RL)也会被对抗范例所操纵。这两项研究指的是加州大学伯克利分校,OpenAI和宾夕法尼亚州立大学的共同研究《Adversarial Attacks on Neural Network Policies》和内华达大学雷诺大学的研究《Vulnerability of Deep Reinforcement Learning to Policy Induction Attacks》。研究表明,广泛使用的RL算法,如DQN、TRPO和A3C,都容易受到对抗输入的攻击。这种攻击可能导致程序在遇到人类不易察觉的微小干扰时性能降低,导致程序出现上下不分等问题。
如果你想攻击自己的模型做实验,可以尝试Ian Goodfellow和Nicolas Papernot共同开发的开源库cleverhans,这个库是用来测试AI易受对抗范例攻击的缺陷的。
对抗范例成为AI安全研究的动力
当我们考虑人工智能安全研究时,通常会想到这个领域中最难的一些问题,例如我们如何确保比人类更聪明的复杂增强学习代理服从人类意志?
对抗范例给了我们一个新的视角,即使简单的监督学习、强化学习等等现代算法,也已经能够做出违背设计者意愿的事。
防御对抗范例的尝试
权值衰减、dropout等增强模型健壮性的传统技术,通常不适用于防御对抗范例。目前,只有两种方法可以提供重要的防御。
对抗训练
这是一个蛮力解决方案,我们生成很多对抗范例,然后明确地为了以模型不被它们愚弄为目的来进行训练。Cleverhans库中提供了对抗训练的开源实现,还附有教程。
防御蒸馏
这个策略是训练模型输出不同类别的概率,而不是直接输出分类,这个概率来自于对相同任务进行硬分类训练的早期模型。这创建了一个模型,其表面在对抗范例攻击通常试图利用的方向上平滑,使得它们难以发现导致不正确分类的对抗输入。 (“蒸馏”这种说法最初来源于Hinton的论文《Distilling the Knowledge in a Neural Network》,是一种模型压缩技术,可以训练小模型来模仿大模型,以便获得计算节约)。
然而,攻击者提高计算能力,即使这些专门的算法也能轻易打破。
一种失败的防御方法:梯度遮蔽
为了给出一个简单的防御如何失败的例子,让我们考虑为什么一个叫“梯度遮蔽(gradient masking)”的技术不能起效。
“梯度遮蔽”是在论文《Practical Black-Box Attacks against Deep Learning Systems using Adversarial Examples》中引入的术语。用以描述一整类失败的防御方法:尝试通过梯度来拒绝攻击者的访问。
大多数对抗范例构建技术,都是利用模型的梯度来发起攻击。换句话说,当它们看到飞机的图片后,就开始测试在图片中哪个方向可以让“猫”类的概率增加,然后就开始干扰输入,直到这张图片最终被误识别为猫。
但是如果没有梯度,如果对图像的无穷小的修改导致模型的输出没有变化呢?这样是不是就能构成一种防御?因为攻击者不知道如何更好的进行干扰。
有一些非常简单的方法来摆脱梯度。例如,大多数图像分类模型以两种模式运行:一种输出最可能的类,一种输出概率。如果模型的输出是:“99.9%飞机,0.1%猫”,那么对输入的一点微小改变,会给输出带来一点微小的变化。梯度告诉我们哪些变化会增加“猫”类的概率。
如果输出只是“飞机”,那么对输入的一点微小改变,并不会改变输出。这样,梯度就不会透露任何信息了。
那么,攻击者在只输出“最可能的类”模式里,是不是就无从下手了呢?不幸的是,以前被分类为猫的图片,现在仍被归类为猫。如果攻击者猜出哪些点是对抗范例,仍然可以导致错误的分类。我们没有让模型更可靠,只是让攻击者能获取的线索减少了而已。
更不幸的是,事实证明,攻击者有一个非常好的策略来猜测防御中的漏洞在哪里。攻击者可以训练他们自己的模型,一个具有梯度的平滑模型,为他们的模型提供对抗范例。然后把这些对抗范例,用来攻击我们非平滑的模型。很多时候,我们的模型也会对这些对抗范例进行错误分类。最后的结论是,隐藏梯度没有带来更大的价值。
执行梯度遮蔽的防御策略,通常导致在特定方向和训练点的邻域中,产生非常平滑的模型,这使得对手更难以找到指示良好候选方向的梯度,以对模型以破坏性方式干扰输入 。 然而,对手可以训练一个替代模型:通过观察防御模型给对抗输入打上何种标签。
在上面提到的“黑盒攻击”论文中,提到了一种执行模型提取攻击的方法。对手也可以使用替代模型的梯度来找到被误分类的对抗范例。上图展示了《Towards the Science of Security and Privacy in Machine Learning》里关于梯度遮蔽的讨论,我们用一维机器学习问题来说明这种攻击策略。梯度遮蔽现象在较高维度问题上将加剧,但是更难以描述。
我们发现,对抗训练和防御蒸馏方法都会偶尔执行一种梯度遮蔽。这两种算法都没有明确地设计来执行梯度遮蔽,但是当我们训练机器来保护自己,并且没有明确指示具体怎样做时,梯度遮蔽明显是机器学习相对容易发明出的方法。
如果我们将对抗性的例子从一个模型转移到使用对抗性训练或防御性蒸馏训练的第二个模型,攻击通常会成功,即使对第二个模型的直接攻击失败。 这表明,这两种训练技术更多的是展平模型和删除梯度,而不是确保它正确分类更多的点。
防御对抗范例难在何处
对抗范例难以防御,是因为很难为对抗范例的加工过程建立一个理论模型。对抗范例是针对神经网络等很多ML模型的非线性和非凸的优化问题的解。 因为我们没有很好的理论工具来描述这些复杂的优化问题的解决方案,所以很难做出理论论证来说明一种防御方式能排除一类对抗范例。
对抗范例难以防御的另一个原因是,它们要求机器学习模型能为每一个可能的输入都生成一个好的输出。大多数时候,机器学习模型工作得很好,但只对少量而非全部输入有效。
目前,我们测试的每种策略都失败了,因为它们的适应性不足:一种策略可能适用于一类攻击,但为知道这种防御策略的攻击者留下了另一处漏洞。设计一种面向强力的、适应性强的攻击者的防御策略,是一个重要的研究领域。
结论
对抗范例让我们看到,很多现代机器学习算法会以令人惊奇的方式被攻破,这些机器学习的失败显示,即使简单的算法也会出现与设计者意图相悖的表现。我们鼓励机器学习研究者参与进来,设计防御对抗范例的方法,消除设计者意愿和算法行为之间的偏差。