对抗样本生成算法之FGSM算法

目录


论文 Explaining and harnessing adversarial examples.
这篇论文由Goodfellow等人发表在ICLR2015会议上,是对抗样本领域的经典论文。

背景

-对抗样本的线性解释
对于线性模型, f ( x ) = w T x + b f(x)=w^Tx+b f(x)=wTx+b,对原始样本 x x x添加扰动 η \eta η得到对抗样本 x ˉ = x + η \bar{x}=x+\eta xˉ=x+η。为确保干扰是微小的,利用 ∣ ∣ η ∣ ∣ ∞ < ϵ ||\eta||_\infty<\epsilon η<ϵ进行限制。
添加噪声后,模型输出为 f ′ ( x ) = w T x ˉ + b = w T x + w T η + b f'(x)=w^T\bar{x}+b=w^Tx+w^T\eta+b f(x)=wTxˉ+b=wTx+wTη+b w w w为权重向量,如果 w w w具有n维度,并且每一维度的平均大小为 m m m,则激活将增长 m n mn mn。最后的扰动为 w T η < = ϵ ∗ n ∗ m w^T\eta<=\epsilon*n*m wTη<=ϵnm,虽然 ϵ \epsilon ϵ的值很小,但当 w w w的维度很大时, n m ϵ nm\epsilon nmϵ将会是一个很大的值,足以引起分类器分类错误。由于 ∣ ∣ η ∣ ∣ ∞ ||\eta||_\infty η不随维度而增长,但由 η \eta η扰动引起的激活变化可随着 n n n线性增长,对抗性扰动使激活度增加 w T η w^T\eta wTη

-作者猜测观点
作者认为,神经网络容易受到对抗性扰动影响的主要原因是它们的线性性质。高维空间中的线性行为足以引起对抗样本。
以上的线性解释是基于线性模型而言的,但DNN一般是高度非线性模型。DNN的非线性单元赋予了其强大的表达能力,但非线性单元的存在会降低学习效率。为提高学习效率,需要对非线性单元进行改进,通常做法是通过降低其非线性来实现。从而,非线性单元的线性行为不断增强,导致DNN的线性能力增强,因此导致对抗样本的存在。
对于高纬问题,我们可以对输入进行许多无穷小变化,从而对输入进行了大的变化。这些解释表明,如果简单线性模型的输入具有足够的维数,则可以具有对抗样本。

原理

FGSM(Fast Gradient Sign Method)是一种基于梯度生成对抗样本的算法,这是一个单步(one-step)的、非定向(non-targeted)的攻击算法。。其目标是最大化损失函数来获取对抗样本。

深度神经网络的训练,是追求损失函数最小化的过程。在求损失函数的最小值时,我们会沿着梯度的反方向移动,使用减号,即梯度下降算法。而FGSM算法可理解成梯度上升算法,即沿着梯度的方向移动,使用加号,求得损失函数的最大值。
FGSM样本生成
原始图像 x x x,扰动值 η \eta η,对抗样本 x + η x+\eta x+η。在扰动值的计算中,用到了 s i g n sign sign符号函数,保证了变化方向同梯度方向方向一致。 J J J是用来衡量分类误差的损失函数。 θ \theta θ为模型参数, x x x为模型输入, J ( θ , x , y ) J(\theta,x,y) J(θ,x,y)为训练神经网络的成本, ∇ x \nabla_x x为对 x x x求导。
η = ϵ ∗ s i g n ( ∇ x J ( θ , x , y ) ) \eta=\epsilon*sign(\nabla_xJ(\theta,x,y)) η=ϵsign(xJ(θ,x,y))
ϵ \epsilon ϵ的值通常是人为设定,但小于某一阈值,一旦扰动值超出阈值,该对抗样本会被人眼识别。梯度是使用反向传播算法计算得到的。

FGSM属于 L ∞ L_\infty L,即限制了修改的程度,但未限制修改的数量。

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下为使用Python代码实现的攻击代码,生成并保存mnist数据集的对抗样本: ```python import tensorflow as tf import numpy as np import matplotlib.pyplot as plt from tensorflow.examples.tutorials.mnist import input_data sess = tf.compat.v1.Session() # 加载mnist数据集 mnist = input_data.read_data_sets('MNIST_data', one_hot=True) # 定义输入和输出的placeholder x_input = tf.compat.v1.placeholder(tf.float32, shape=[None, 784]) y_label = tf.compat.v1.placeholder(tf.float32, shape=[None, 10]) # 定义模型 x_image = tf.reshape(x_input, [-1,28,28,1]) conv1 = tf.compat.v1.layers.conv2d(inputs=x_image, filters=32, kernel_size=[5, 5], padding="same", activation=tf.nn.relu) pool1 = tf.compat.v1.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2) conv2 = tf.compat.v1.layers.conv2d(inputs=pool1, filters=64, kernel_size=[5, 5], padding="same", activation=tf.nn.relu) pool2 = tf.compat.v1.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2) flatten = tf.reshape(pool2, [-1, 7 * 7 * 64]) dense = tf.compat.v1.layers.dense(inputs=flatten, units=1024, activation=tf.nn.relu) logits = tf.compat.v1.layers.dense(inputs=dense, units=10) # 定义损失函数 cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits, labels=y_label)) # 定义fgsm算法 epsilon = 0.1 gradients, = tf.gradients(cross_entropy, x_input) adv_x = tf.stop_gradient(x_input + epsilon * tf.sign(gradients)) # 定义评估模型的accuracy correct_pred = tf.equal(tf.argmax(logits,1), tf.argmax(y_label,1)) accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32)) # 初始化变量 sess.run(tf.compat.v1.global_variables_initializer()) # 训练模型 for i in range(2000): x_batch, y_batch = mnist.train.next_batch(100) _, loss = sess.run([tf.compat.v1.train.AdamOptimizer(0.001).minimize(cross_entropy), cross_entropy], feed_dict={ x_input: x_batch, y_label: y_batch }) if i % 100 == 0: test_acc = sess.run(accuracy, feed_dict={ x_input: mnist.test.images[:1000], y_label: mnist.test.labels[:1000] }) print('Step %d, loss=%.4f, test accuracy=%.4f' % (i, loss, test_acc)) # 生成对抗样本 adv_images = sess.run(adv_x, feed_dict={ x_input: mnist.test.images[:1000], y_label: mnist.test.labels[:1000] }) # 将对抗样本保存为npy文件 np.save('adv_images.npy', adv_images) # 展示一组原始图片和对应的对抗样本 fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 5)) for i in range(2): if i == 0: axes[i].imshow(mnist.test.images[0].reshape(28,28), cmap='gray') axes[i].set_title('Original Image') else: axes[i].imshow(adv_images[0].reshape(28,28), cmap='gray') axes[i].set_title('Adversarial Image') plt.show() ``` 以上代码使用了FGSM算法生成对抗样本,其中epsilon为0.1,表示对抗样本中每个像素点的最大变化量为0.1。生成对抗样本后,使用numpy库将对抗样本保存为npy文件,方便后续使用。最后,展示了一组原始图片和对应的对抗样本

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值