怎么使用梯度优化算法去优化一个成本函数?
来源: neptune.ai
自神经网络出现以来,它已经成为了机器学习算法的信条,推动了人工智能领域的绝大部分技术突破。
神经网络能胜任那些对于人类富有挑战性的高度复杂的任务,在执行这些任务的同时,表现出非凡的鲁棒性。
那么,神经网络的鲁棒性能超越它的初衷吗?这便是本文需要寻求的答案。
我认为,人工智能这一交叉领域无法保证绝对安全,事实证明,这也是少数几个神经网络失败的原因之一。
在这里,将尝试一种非常流行的攻击:快速梯度符号方法,来证明神经网络的安全漏洞。首先,来探讨不同类别的攻击。
对抗性的攻击
根据攻击者对想要攻击的模型的了解程度,可分为几类攻击,这其中最受欢迎的两种攻击分别是白盒攻击和黑匣子攻击。
这两种攻击的目的都是通过在网络输入中加入噪声, 诱使神经网络做出错误的预测。
二者的区别在于访问整个模型架构的能力,使用白盒攻击时,可以完全访问模型架构(权重)以及模型的输入和输出。
使用黑匣子攻击时,对模型的控制程度较低,只能访问模型的输入和输出。
在执行以下两种攻击时,需要考虑到以下这些因素:
- 分类错误,在无需考虑预测分类的情况下诱导模型做出错误的预测;
- ·源/目标分类错误,向中图像添加噪声,迫使模型预测特定的分类。
快速梯度符号法(FGSM)将白盒法和错误分类相结合,诱导神经网络模型做出错误的预测。
下面,来看看FGSM是如何工作的。
快速梯度符号法详解
从名称上听起来,FGSM似乎很令人费解,但实际上,FGSM攻击非常简单,它包括以下三个步骤:
- 计算出正向传播后的损失;
- 计算出图像像素的梯度;
- 沿着使损失最大化的梯度方向微移图像的像素。
第一步,计算出正向传播后的损失,这在一般的机器学习项目中非常常见,使用一个负似然损失函数来估计模型的预测结果与实际结果的接近程度。
FGSM的特别之处是,计算图像像素的梯度,在训练到神经网络时,利用梯度确定微移的权重的方向,从而减小损失值。
与通常的做法相反,在这里,调整输入图像像素的梯度方向,使得损失值最大化。
在训练神经网络时,确定权重方向(即损失函数相对于该特定权重的梯度)的最常用方法是将梯度 (输出部分)反向传播给权重。
同样的概念也适用于FGSM,将梯度从输出层反向传播给输入图像。
在神经网络训练中,利用以下这个简单的方程式,通过微移权重来减小损失值:
new_weights = old_weights — learning_rate * gradients
同样的概念可以应用于FGSM,根据以下方程式微移图像的像素值,从而使得损失最大化:
在上述图像中,两个箭头表示两种不同的调整梯度方法。左边的方程,是训练神经网络的基本方程,计算出的梯度指向了使损失最小化的方向,神经网络训练方程中的负号确保了梯度指向相反的方向——使损失最小化的方向;右边的方程则相反,这是一个欺骗神经网络的方程。既然想要最大化损失,则以其自然的形式来应用梯度。
这两个方程式之间有许多差异,最主要的区别是加减法。利用方程2,将像素推向与损失最小化的方向相反的方向。这样做,就是在告诉模型只做一件事——做出错误的预测!
在上图中,x表示希望模型错误预测的输入图像,图像的第二部分表示损失函数相对于输入图像的梯度。
记住,梯度只是一个方向张量(它提供有关微移方向的信息)。为了增强微移效应,用一个非常小的值epsilon乘以梯度,(上述图像中为0.007),然后将结果添加到输入图像中,就是这样!
输出结果图像可以简单表示为:
对上文做一个总结之后,接下来将做一些编码,诱导神经网络做出错误的预测:
- 神经网络前向传播图像;
- 计算出损失;
- 将梯度反向传播给图像;
- 在损失值最大的方向上微移图像的像素。
这样做之后,便相当于告诉神经网络对图像做出相反的预测。
值得注意的是,噪声对结果图像上的影响程度取决于epsilon—epsilon值越大,噪声就越明显。
增加epsilon值,也会加大网络做出错误预测的可能性。
代码
在本教程中,将使用TensorFlow来构建整个管道,将重点关注代码中最重要的部分,而不涉及与数据处理相关的部分。
首先,加载TensorFlow MobileNetV2模型:
将模型的可训练属性设置为假,这意味着无法训练模型,任何通过改变模型参数以欺骗模型的操作都会失败。
可以将图像可视化,以了解不同的epsilon值是如何影响预测以及图像的性质,下述简单的代码片段便能处理这个问题。
接下来,加载图像,通过模型运行它,并获得图像的损失梯度。
打印signed_grad显示出张量。有些张量为正,另一些带有负号,这表明梯度仅对图像施加了方向效应。将图像绘制出来,显示如下图片:
有了梯度之后,便可以在与梯度方向相反的方向上微移图像像素。
换句话说,即在损失最大化的方向上微移图像像素。在不同的epsilon值下对预测进行攻击,当 epsilon=0时,表示没有运行任何攻击。
我可以得出以下结果:
注意到上面三张图片中的模式了吗?随着epsilon值的增加,噪声变得更加明显,对错误预测的置信度也随之增加。
这一方法成功地愚弄了最先进的模型,在没有对模型作任何改动的情况下,使之做出错误的预测。
在这里,通过一个小实验来确认上面讨论的概念。在这里,不将像素与epsilon相乘再和梯度相加的方法将图像的像素微移到损失最大化方向,而是利用减法,将图像的像素微移到损失最小化的方向(image-eps*signed_grad)。
测试的结果如下:
通过将图像像素微移到使损失最小化的梯度方向上,增加了模型做出正确预测的置信度,置信度从41.82%上升至97.89%。
下一步
自FGSM发明以来,还出现了其它多种具有不同攻击角度的方法,既可以尝试不同的模型和不同的图像,也可以从零开始构建自己的模型,并尝试不同的epsilon值。
今天的分享就到这里,谢谢阅读!