对抗样本:怎么欺骗机器学习模型(文字版)

点击这里收听本期节目音频版

编辑: 肖怡婷

本期嘉宾: 王一臻(UCSD 博士生) (G)

主播: 阿拉法特 (A), 舒晏 (S)

A
今天我们的话题和备受关注的 iPhone X 有关系。iPhone X 最受关注的一个特性,应该是它的人脸识别。早期的一些用户拿到手机之后开始用各种各样非常极端的方式试图去骗过 iPhone X。我们今天的节目就和怎么样骗过一个机器学习算法有关系。

 00:30 
A
大家好,欢迎收听德塔赛。我是阿拉法特,今天这期节目和上期一样,还是只有我一个人和嘉宾一起主持。因为舒晏现在还是在国内,还没有回来。那么我们今天这期节目是和怎么样欺骗一个机器学习算法有关系。具体来讲,我们会讲 aversive example 或者说 aversive attack 这样一种对机器学习算法的攻击,很多中文的材料会把它叫做对抗样本攻击。今天和我一块录节目的是我办公室的同事王一臻。
G
大家好。
A
王一臻是和我同年进入 UCSD 的博士生。一臻,你能给我们更具体地介绍一下你和你的工作吗?
G
好的。我今年是在 UCSD 读第四年的博士研究生。之前在 UCSD 的三年,我的研究方向主要是研究机器学习这个模型本身的安全问题和机器学习算法,和这个机器学习过程中的一些隐私问题。现在主要的研究方向是如何防御测试阶段的对抗样本攻击。
A
平时认识王一臻的人肯定会同意我,就是这是他们听到的王一臻说话最深沉最严肃的一次。
G
我们可以在后面加一个不那么深沉的 NG 版本。
A
好,那么回到我们今天要聊的话题,对抗样本这个概念听起来比较地抽象。王一臻你能给我们从一个具体的例子解释一下对抗样本它是什么东西吗?
G
好的。那我们可以现在先想象这样一个场景:我们现在已经有一个训练好的在 ImageNet 上的一个图片类别的分类器。这个时候分类器看到了一张猫的图片,这时候出现了一个潜在的敌人,他想让分类器认为这张图片是比如说一张狗或者一张汽车的图片,那么他可以做的事情就是对测试样本,测试的输入做出一些扰动。那么你可能就要说了,那这样看起来攻击是一个很简单的情况,对吧?那我只需要真的把这张猫的图片换成一张狗的图片就可以了,确实是这样。但是在 2014 年的时候,Goodfellow 和他们的研究小组就发现一个对于神经网络而言有一个很神奇的现象,就是你不需要把猫的图片换成狗的图片,你只需要在猫的图片上稍微更改几个像素,或者在每个像素上只更改一个人眼几乎无法识别的一个变化,那么分类器就会犯一些错误。所以这大概是一个测试阶段攻击的大家一直在研究的一个场景。
A
换句话说我现在有张猫的图片,在任何人看来它都是一张猫的图片,但实际上它被人改动过,加了一些噪声,然后这个加了噪声后的猫的图片,如果我给任何一个在 ImageNet 上训练的一个分类器来看,他可能会认为那是一只狗,或者甚至一个显示器,任何一个攻击者希望分类器认为它是别的什么东西的这样一个物件。
G
对。攻击可以是 target 的,也可以是 non-target 的。就是说你可能攻击者的目的可能只是想让这个分类器犯错,或者是想让分类器犯一个特定的错误,那么有不同的攻击的方式,但是你刚才说的没错。

 04:00 
A
听到这个非常抽象的例子,把一只猫错认成一只狗,可能并不会让人觉得这个错误有什么大不了的。我们举一个极端的例子,为什么机器学习的研究者会担心对抗样本攻击这种攻击方法?
G
这种担心主要有两个方面。第一个方面是现实应用的安全的角度。我们可以想象,比如说一辆自动驾驶的汽车,它需要识别路上各种各样的交通标志,那么这个时候比如说有一个限速标记,那么这时候一个想要攻击这辆车的人,他可能就会在这个限速标记上进行一些涂鸦,使得这辆自动驾驶的汽车错误的识别了交通标记,而因为这个涂鸦本身对于人来说是一件非常正常的事情,所以可能没有人会意识到这是一个有蓄谋的故意的针对这辆车的一个攻击行为,这是安全方面的考虑。
A
比如说逆行的标志可能会被改成不是逆行。
G
单行道,或者各种可以造成混乱的标记。
A
对。
G
另一方面的考虑是从模型的可解释性上。这方面的担忧主要是人们发现机器学习的模型会犯一些人类通常不会犯的错误。那么作为一个使用者,你可能就会不太信任这个模型做出来的其他的决定,因为它的预测在你看来非常的不稳定。
A
一个机器学习算法犯了一个人类不能够理解它为什么会犯的错误。
G
可以这么说。

 05:36 
A
那说到这个,我们就很好奇,那么具体 Ian Goodfellow 他是怎么做到让一个机器学习算法在人类不能够犯错的情况下犯错的呢?你可以举一个怎么样做这种攻击的方法吗?
G
大约在 14 年的时候,Goodfellow 的小组发现了一个非常简易的攻击的方法。我们知道在训练一个机器学习模型的时候我们有一个损失函数,我们的目的是希望损失函数尽可能的小。那么从一个攻击者的角度,他想要让这个机器学习模型做出一个错误的判断,他可以尽可能的通过扰动这个输入,使得损失函数尽可能的大。损失函数越大,那么这个模型犯错的可能也就越大。基于这一个观察,他们就做了一个类似于梯度上升的方法。他们首先求出了损失函数对于输入的梯度,然后沿着这个梯度做一个梯度上升来添加扰动。结果是这个非常简易的攻击方法在 MNIST 和 ImageNet 上都取得了很好的效果。
A
换句话说给他一张猫,他们的目的是下降神经网络对这张图片是一张猫的信心。
G
那是他们后期做的一个改进,不过你说的没错。
A
我的感觉就是他们没有办法控制增加的扰动会让这个图片往哪个方向走,他们并不能让网络误以为这张猫是一个显示器还是是一只狗,他们不能控制,他们只能做到让网络不再认为这是一张猫。
G
在最初的版本里是这样的,但是在后期他们也提出了各种可以精确的控制目标类的这么一个攻击方式。
A
那这里面有一个非常重要的假设,就是攻击者能够接触到我们的模型,他知道我们是什么模型,知道我们用什么参数。
G
在一开始的时候确实是这样,因为我们注意到它需要做一个梯度下降,或者梯度上升。那么这个梯度上升的过程就需要攻击者知道模型的样子。
A
如果这是攻击者必须要知道的信息,那我们还挺放心的,因为我们可以在未来的世界中让所有的人工智能算法他的算法都严格保密,没有人知道这样,这样你就不能攻击我了,但是显然没有这么理想。
G
对,阿拉法特你说这个问题也跟其他的计算机安全的问题有异曲同工之处。那么作为一个攻击者,他其实在意的并不是他要攻击的系统是怎么实现的,他需要在意的只是这个系统的漏洞在哪里。那么同样的在攻击机器学习模型上,他并不需要知道这个机器学习模型的参数是什么,他只需要知道这个机器学习的模型的预测的结果是什么样的。那么一个很简单的方法就是攻击者可以把我们的模型当作一个黑盒子,他通过不断的向模型提问来获得这个模型的预测的结果,然后通过收集的这些数据来训练一个他自己的替代模型。这个替代模型的目的是和真正的黑盒子的攻击的目标做出一样的预测,然后攻击者就希望一个可以攻击自己替代模型的样本也可以攻击原来的模型。
A
最后他们证实了如果你能够靠观察现有的模型去训练一个你自己的模型,然后在这个自己的模型上找到你的对抗样本,这个训练是在对抗样本,也可以攻击原先的模型吗?
G
没错,所以总结来说就是我们先学习我们的攻击目标这个黑盒子的行为,然后建一个自己的模型来模拟黑盒子的行为,最后通过攻击自己的模型来生成对抗样本,起到攻击这个黑盒子的效果。
因为我们知道现在的很多机器学习最后都会做成产品,那么他作为一个攻击者,他可以获得这个产品,并且把这个产品当作一个 oracle,然后不断的向这个产品来为自己生成的一些训练样本来不断的模拟目标产品的一个行为。

 09:59 
A
有点像大家现在带着各种各样的面具想去欺骗这个 iPhone 的面部识别的系统一样,总是想让 iPhone 误以为自己是别的什么人。其中一个比较有趣的例子是戴眼镜,就是人们发现如果你带着一个眼镜,其实面部识别软件是可以把你正确的认出来的。但其实我们知道戴着眼镜它是一个比较经典的会让面部识别软件犯错误的方法,你能给我们介绍一下具体这个眼镜为什么是一个非常奇怪的噪声?它的独特之处在哪里?
G
其实关于戴眼镜 attack 的这件事情可能关注这个领域的同学都知道在 16 年的时候,卡耐基梅隆的学生们做过一个有趣的实验,也是他们想攻击一个人脸识别的系统。然后他们通过带不一样的眼镜,戴各种花花绿绿的眼镜,就可以让这个系统把他们错认为各种各样的明星或者各种各样的其他的人。其实我们再看这个问题,不管是戴眼镜也好,留胡子也好,还是对于自己的面部做其他的变化。那根本上的一个问题就是说我们在训练中可能就没有遇到过这样的数据,就相当于是你有一个识别鸟的这个机器学习的模型,这个时候天空突然飞过来一个飞机,然后从来没有人告诉过他这个世界上有飞机这样东西,那么这个模型很可能就会做出一些奇怪的判断。其实在测试样本的攻击的这么一个领域,大家一个普遍的看法就是说我们的图像的识别输入通常是一个非常高维的空间,我们输入的样本,我们的训练样本可能只占高维空间中一个比较低维的流形,在一个比较低维的流形上。对于一个戴眼镜的图片,等于是我们要跳出训练样本在的流形上,对于训练样本之外的一个空间做一个预测,那么其实它犯一些错误我们也是可以理解的,因为它毕竟以前没有见过这样的输入。所以这也是一个大家想要试图解决的问题,就是怎么样让神经网络或者其他的机器学习算法,对于样本出现的位置以外的空间做出一个更好的预测。
A
现在的 iPhone 它是可以识别你,即便你戴着眼镜。所以在不严格的意义上来说,我们可以说苹果公司解决了这一类型的对抗样本攻击。从你刚刚的描述中,我的理解是,要解决这种问题,非常简单,就是原因不就是我们的样本不够吗,那我们就给他增加非常多的样本。有什么比较针对性的,针对这种会使用对抗样本攻击的攻击者的增加样本的方法吗?比如说我们不可能产生所有全世界所有的随机噪声,然后把它都加到猫的图片中,然后告诉我们的算法,所有这些加了造成的猫,它们还是猫,你不要被骗了。一个更加针对性的方法是怎么做呢?
G
那一个比较直观的方法就是我们可以在训练的阶段假想一些敌人,我们自己做自己的敌人,自己来对这个模型进行一些攻击,然后把攻击成功的案例添加到训练集里,告诉这个机器学习的算法 OK 这些猫还是猫。但是这样做又存在一个问题,单纯的增加一些线性量级的这么一个辅助的样本,可能并不能从根本上防止攻击。
A
这是一个魔高一尺道高一丈的问题了。你刚才意思就是说我们产生各种各样攻击者会产生的噪声,然后把它加到图片中,然后告诉我的算法,但是攻击者可以采用别的加入噪声的方法,然后我们又没有办法了。
G
这是其中的一种方式,就是你并不能完全的知道攻击者会用什么样方式来进行攻击。
A
那看起来和传统的计算机系统安全有一个比较相似的地方,就是作为防守者,我们能做的就是增加攻击者的成本,换句话说我们可以增加这种加噪声的方法。攻击者有资源去尝试的加噪声的方法我们全部已经试过了,我们的算法都能够防御这种噪声。但是如果攻击者的成本或者攻击者的资源比我们多,我们还是防不住他。
G
但是现实里,攻击者的资源通常都会比我们多。因为毕竟如果是个有利可图的攻击的话,那么永远不要低估了对手的计算能力。但是单纯从测试样本攻击的这个问题来看,我们可以想到一些分类器,它们是可以对这种攻击样本免疫的。比如说我们可以想象一个最近邻分类器,这个最近邻分类器是由一个很大很大的训练集上训练出来的,这个训练集里的样本基本上填满了整个输入的空间,这是我们做一个最近邻分类器,那我们就知道最近邻分类器不会受到测试样本攻击的干扰。
A
这是假定了我们的维度不是特别高,因为你刚才说我们要把一个样本空间中的所有的样例都给它枚举一遍。
G
对,就是说存在一个对测试样本攻击免疫的分类器,但是真正获得分类器的成本又实在是太高了。所以我们想要做到的就是能不能给我们的算法做出一些改变,使得他们能够提供一些理论上的保证。

 15:45 
A
听到这里听众可能比较紧张,那我们是不是就不安全了。但是我在这里有一个虚假的安全感,就是你刚刚提到的所有的例子,都是说我们要修改一张照片,换句话说我们现在一张照片,我知道这个照片会被拿去给你的机器学习算法看,然后我就给这张照片加噪声。但是现实世界中我们完全可以说让他多拍几张照片对吧?如果所有的这张比如说我们在开一辆车,让我车上20个摄像头同时拍不同的角度拍路牌,那您得能够骗过我这所有20张照片对吧?但是你在设计你的噪声的时候,你可能没有考虑到我这20个角度中的某几个,我可以这样躲过你的攻击吗?
G
一开始的时候确实大家对这个方法比较乐观,因为刚开始研究的时候我们必须要对模型的输入进行一个直接的改动,那在这个情况下就是照片本身。但是攻击者很快就意识到这个问题,所以也有一系列的研究,他们的共同点就是研究怎么改变现实生活中的物体,而不是一个照片,从而使得这个机器学习的模型本身还是会被欺骗。
A
我们的样本现在要从二维的样本去晋升到三维的样本。
G
或者说就是直接改变你这个模型所观察的一个对象。比如说在刚才自动驾驶的例子里,我就真的可以通过改变一个现实中的路牌,而不是改变路牌的一张照片来起到一个攻击的效果。这个也有不少的组在做,像刚才说的这个识别路牌,有的小组已经发现了一些添加噪音的方法,可以躲过你刚才说的不同角度,或者说可以欺骗你刚才说的不同角度的情况下拍到的这个照片。
A
如果我可以拿到一个我要识别的东西,比如说一只猫。
G
猫是可爱的小动物,不是一个东西。
A
我可以把一个可爱的小动物,比如说一只猫,真的一只猫,我拿到我的手上,360度的转它,假设它不会抓我的话。然后我再确定它是一只猫,这样就很安全了。那我可以说我现在已经有了一个非常安全的识别猫的算法了吗?
G
所以你刚才的问题是假如我可以把我要识别的对象捧在手上,然后让我的探测器 360 度的观察它。
A
我让我的探测器非常小心,一定要转着它看好几遍,非常确认了再告诉我你确定是不是真的。
G
其实前几天就有一篇新的论文,它们做了一个 demo,是他们用 3D 打印的技术打印了一只他们自己设计的乌龟,从人类看来就跟正常的乌龟并没有区别,可能也就是壳上的花纹会稍微有一些独特的地方。然后他们把这个乌龟放到一个应该也是基于 ImageNet 的一个分类器,然后在这个摄像头前不断的转动乌龟 360 度的观察,然后他们发现绝大多数时候这个乌龟都会被当成一把来复枪,所以现在已经有攻击的方式,可以做出一个真正的现实中的 3D 物体,然后让这个分类器从各个角度看,它都有很大的概率,是另外的一个错误的识别的对象。
A
他们真的 3D 打印了一只乌龟?
G
没错,很逼真的一只乌龟了。

 19:20 
A
这就任何人看来,对我们可以过会儿把那个图片放到我们的文章里面,如果大家感兴趣可以看一下。聊到现在我就觉得我们已经很绝望了,最后没有聊到什么非常有效的可以绝对防御对抗样本攻击的方法。我们要这么悲观地结束我们这期节目吗?有什么好消息可以跟我们听众分享一下?
G
虽然从绝对的理论上来看,这个问题非常的困难。但我觉得在现实中,对于一个产品来说,可能还是有一些技术的保护的方法。毕竟我们之前也说到了,敌人的资源不可能是无限的。一个我个人觉得可行的方法,可能是我们自己也不断地变换自己的模型。
A
我们不使用同一套模型。
G
我们可以不断地更新自己的模型,使得它达到一个比较稳定的分类效果,而在同时针对于以前版本的攻击,对于新的版本可能会变得无效。我觉得这也是一种防御的思路。

 20:27 
A
对抗样本的存在给大家的主要的心理障碍,我认为就是当机器犯了一个人类不能理解的错误的时候,我们就变得非常不能够接受它。但事实上,无论我们以后要把我们现实生活中的哪一方面交给机器,现在从事这方面工作的,比如说无论是自动售货也好,自动驾驶也好,人类在做这些事情的时候也会犯错,但我们能够原谅他们的错误,因为我们虽然没有要求它们解释它们为什么犯错,但作为同样的人类,我们感觉我们自己可以理解这另外一个人类为什么会犯这个错误。但偏偏到了机器,我们变得不那么宽容了。
G
所以这也是对机器学习的应用比较乐观的研究人员的一个观点,就是我们在讨论机器学习的稳定性的时候,我们都要问一个问题,我们跟什么作比较,如果是已经比人类更加稳定了,那我觉得我们还是有希望在某些领域接受这个机器学习的产品。
A
那么在最后这个还是比较有希望的结论中结束我们这期节目,感谢一臻今天跟我们分享的这些有趣的故事。
G
也谢谢阿拉法特今天慷慨解囊,请我喝了系里最贵的饮料。之前我被提醒不能给这个饮料做广告,所以在这里我就不透露是哪一种了,请大家自己猜测吧 !
A
那么就到这里了。我们下期节目再见!
G
再见。