Fast Gradient Sign Attack(FGSM)算法小结

Fast Gradient Sign Attack(FGSM)算法小结


对抗攻击引发了机器学习一系列的思考,训练出来的model是否拥有强大的泛化能力?模型的准确率是否真实?
在对抗攻击中添加一些肉眼无法识别的噪声可能会对识别效果产生巨大的影响。

什么是对抗攻击

对抗攻击的核心思想就是人为地制造干扰项去迷惑模型,使模型产生错误的结果。在计算机视觉中,对抗攻击就是在原图上添加一些人为无法识别的噪声生成干扰图片,使得模型作出错误的判断。

对抗攻击分类

无目标的对抗攻击:只是让目标模型的判断出错

有目标的对抗攻击:引导目标模型做出我们想要错误判断

以对目标模型的了解程度为标准,对抗攻击又可以分成白盒攻击和黑盒攻击

白盒攻击:在已经获取机器学习模型内部的所有信息和参数上进行攻击

黑盒攻击:在神经网络结构为黑箱时,仅通过模型的输入和输出,逆推生成对抗样本。

FGSM算法原理

直观来看就是在输入的基础上沿损失函数的梯度方向加入了一定的噪声,使目标模型产生了误判。
如下图所示:原图加上超参数 ϵ 乘与 损失梯度生成新的干扰图片。
fgsm1
如下图所示为生成干扰图片的完整公式:x*表示对抗样本,x表示原样本,J() 表示损失函数,ϵ 表示超参数。
fgsm2
对于某个特定的模型而言,FGSM将损失函数近似线性化(对于神经网络而言,很多神经网络为了节省计算上的代价,都被设计成了非常线性的形式,这使得他们更容易优化,但是这样”廉价”的网络也导致了对于对抗扰动的脆弱性)。

也就是说,即是是神经网络这样的模型,也能通过线性干扰来对它进行攻击。

FGSM实例

导入所需包

import torch
from torchvision import datasets, transf
  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Fast Gradient Sign Attack (FGSM) 是一种广泛应用于对抗样本攻击的方法,它通过在输入数据的梯度方向上添加一个小的扰动来欺骗分类器模型。在本文中,我将介绍如何使用 FGSM 对 MNIST 数据集中的手写数字分类器进行攻击,并分享我的实验心得。 首先,我们需要准备一个 MNIST 分类器模型。这可以通过使用 Keras 和 TensorFlow 框架中的内置模型来实现,如下所示: ``` from keras.datasets import mnist from keras.utils import to_categorical from keras.models import Sequential from keras.layers import Dense, Flatten, Conv2D, MaxPooling2D # 加载 MNIST 数据集 (x_train, y_train), (x_test, y_test) = mnist.load_data() # 将像素值缩放到 0-1 范围内 x_train = x_train.astype('float32') / 255. x_test = x_test.astype('float32') / 255. # 将标签转换为 one-hot 编码 y_train = to_categorical(y_train, num_classes=10) y_test = to_categorical(y_test, num_classes=10) # 构建模型 model = Sequential() model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1))) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dense(10, activation='softmax')) # 编译模型 model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) ``` 接下来,我们可以使用 FGSM 来生成对抗样本。FGSM 的核心思想是沿着输入数据的梯度方向添加一定的扰动,使得分类器模型将其错误分类。我们可以通过以下代码实现: ``` import tensorflow as tf # 定义 FGSM 攻击函数 def fgsm(model, x, eps): # 计算输入数据的梯度 grad = tf.gradients(model.output, model.input)[0] # 计算扰动 signed_grad = tf.sign(grad) perturbation = eps * signed_grad # 生成对抗样本 adv_x = x + perturbation # 将像素值裁剪到 0-1 范围内 adv_x = tf.clip_by_value(adv_x, 0, 1) return adv_x # 定义 FGSM 攻击参数 eps = 0.1 # 选择一个样本进行攻击 x = x_test[0] y_true = y_test[0] # 将输入数据转换为 TensorFlow 张量 x_tf = tf.convert_to_tensor(x.reshape((1,28,28,1))) # 生成对抗样本 adv_x_tf = fgsm(model, x_tf, eps) # 将对抗样本转换为 Numpy 数组 adv_x = adv_x_tf.eval(session=tf.Session()) ``` 在生成对抗样本后,我们可以将其输入到分类器模型中进行测试,以验证是否能欺骗模型。我们可以通过以下代码实现: ``` # 对抗样本的预测结果 y_pred_adv = model.predict(adv_x) # 打印真实标签和对抗样本的预测结果 print('True label:', y_true.argmax()) print('Adversarial label:', y_pred_adv.argmax()) ``` 通过反复调整 eps 参数的大小,我们可以生成不同程度的扰动,从而得到不同的对抗样本,进而观察分类器模型的鲁棒性。在我的实验中,我发现当 eps 取值较小时,生成的对抗样本与原始图像非常接近,分类器模型很容易被欺骗;而当 eps 取值较大时,生成的对抗样本与原始图像差异较大,分类器模型的准确率反而得到提高。 总的来说,使用 FGSM 对 MNIST 分类器进行攻击是一项非常有趣的实验。通过实验,我深刻认识到了对抗样本的威胁,并对如何提高深度学习模型的鲁棒性有了更深入的理解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值