正文
现在,分类器的精度达到100%。它找到了一条可以将所有的绿球与红球完美分开的区隔线。
但是,如果我们想要调整一下模型使得一个红球被故意区分成绿球呢?我们最少要将红球移动多少才会使得它被推到绿球的判定区域呢?
如果我们把分界线旁边那个红球的Y值少量增加,那么我们就几乎可以把它推到绿球的判定区域了:
所以要想欺骗一个分类器,我们只需要知道从哪个方向来推动这个点可以使它越过区隔线即可。如果我们不想使这个错误过于明显,理想情况下我们会使这个移动尽可能的小,以至于其看起来就像是一个无心之过。
在使用深层神经网络进行图像分类时,我们分类的每个“点”其实是由成千上万个像素组成的完整图像。这就给了我们成千上万个可以通过微调来使预测结果跨过决策线的可能值。如果我们可以确保自己对图像中像素点的调整不是肉眼可见般的明显,我们就可以做到在愚弄分类器的同时又不会使图像看起来是被人为篡改过的。
换句话说,我们可以选取一张真实物品的图像,通过对特定像素点做出非常轻微地修改使得图像被神经网络完全识别为另一件物品—而且我们可以精准地控制这个替代品是什么:
把一只猫变成烤面包机。图像检测结果来自与Keras.js的Web演示:https://transcranial.github.io/keras-js/#/inception-v3
我们之前已经讨论了训练神经网络以分类照片的基本过程:
1.添加一张训练用图片;
2.查看神经网络的预测结果,看看其距离正确答案有多远;
3.使用反向传播算法来调整神经网络中每一层的权重,使预测结果更接近于正确答案。
4.在数千张不同的训练照片上重复步骤1-3。
那么相比于调整神经网络每一层的权重,如果我们直接修改输入图像本身直到得到我们想要的答案为止呢?
所以我们选用了已经训练好的神经网络,并再次“训练”它,不过这次我们将使用反向传播算法来直接调整输入图像而不是神经网络层的权重:
所以这里是新的算法:
1.添加一张我们想要“黑”的照片。
2.检查神经网络的预测结果,看看其距离我们想要的答案有多远。
3.使用反向传播算法来调整照片本身,使预测结果更接近于我们想要的答案。
4.使用相同的照片重复步骤1-3上千次,直到神经网络输出结果为我们想要的答案为止。
在此之后,我们将会得到一张可以欺骗神经网络的图片,同时并不改变神经网络本身。
唯一的问题是,由于算法在调整上没有任何限制,允许以任何尺度来调整任何像素点,所以图像的最终更改结果可能会大到显而易见:他们会出现变色光斑或者变形波浪区域
一张被“黑”过的照片,由于没有对像素点可被调整的尺度做约束,你可以看到猫周围有了绿色光斑和白色墙壁上出现的波浪形图案。
为了防止这些明显的图形失真,我们可以将算法加上一个简单的限定条件。我们限定篡改的图片中每一个像素在原始的基础上的变化幅度取一个微量值,譬如0.01%。这就使算法在微调图片的时候仍然能够骗过神经网络却不会与原始图片差别太大。
在加入限定后重新生成的图片如下:
在每个像素只能在一定范围内变化的限制条件下生成的被“黑”的图片。
即使这张图对人眼来说篡改后没有区别,却可以骗过神经网络!