title: 对抗样本生成方法
date: 2023-03-21 15:08:46
tags: pytorch 对抗样本
cover: https://s2.loli.net/2023/03/20/TkeiAjqp3Jdg9tI.png
categories: 深度学习
对抗样本生成方法
为什么会产生对抗样本?
2013年,Szegedy等人首次提出针对深度学习场景下的对抗样本生成算法–BFGS,作者认为,深度神经网络所具有的强大的非线性表达能力和模型的过拟合是可能产生对抗性样本原因之一。2014年,Goodfellow等人(包括Szegedy)对该问题进行了更深层次的研究,它们认为高维空间下深度神经网络的线性线性行为是导致该问题的根本原因。并提出FGSM算法。代码复现链接。
在实际问题当中由于我们分类器输出的特征精度有限,通常为8bits,16bits等。以8bits为例,当输入的信息小于 1 256 \frac{1}{256} 2561就会丢失掉该信息、例如 x ~ = x + η \tilde{x}=x+η x~=x+η,如果 η η η足够小的情况下( ∣ ∣ η ∣ ∣ ∞ < ϵ ||η||_{\infty}<\epsilon ∣∣η∣∣∞<ϵ),分类器无法将其区别开。
给定一个向量 η,如果它的无穷范数(即向量中绝对值最大的元素)小于某个值 ε,那么这个向量 η 就满足某个条件。具体来说,这个条件是根据上下文而定的,可能是某个算法中的收敛条件,也可能是某个优化问题中的约束条件等等。
当把无穷范数换成二范数(即欧几里得范数)或一范数时,公式的含义也会有所不同。
如果将无穷范数换成二范数,那么公式就变成了 ∣ ∣ η ∣ ∣ 2 < ϵ ||η||_{2}<\epsilon ∣∣η∣∣2<ϵ,表示向量 η 的二范数(即向量中各元素平方和的平方根)小于某个值 ε。这个条件通常用于最小化向量的误差或距离等问题。
如果将无穷范数换成一范数,那么公式就变成了 ∣ ∣ η ∣ ∣ 1 < ϵ ||η||_{1}<\epsilon ∣∣η∣∣1<ϵ,表示向量 η 的一范数(即向量中各元素绝对值之和)小于某个值 ε。这个条件通常用于最小化向量的稀疏性等问题。
假设我们有一个线性分类器 f ( x ) f(x) f(x),它的输出可以通过如下线性方程表示:
f ( x ) = w T x + b f(x) = w^T x + b f(x)=wTx+b
其中 x x x 是一个输入向量, w w w 是权重向量, b b b 是偏置项, T T T 表示矩阵转置。
现在,假设我们有一个样本 x x x,它的正确分类为 y y y。我们可以表示这个样本的损失函数为 L ( f ( x ) , y ) L(f(x), y) L(f(x),y),其中 L L L 是损失函数。我们的目标是找到 w w w 和 b b b 的值,使得对于所有样本,损失函数 L L L 的值最小。
现在,考虑一个对抗样本 x ~ \tilde{x} x~,它通过向原始输入 x x x 添加一个微小的扰动而产生:
x ~ = x + η \tilde{x} = x + η x~=x+η
其中 η η η 是一个微小的扰动向量。我们希望找到一个合适的扰动 η η η,使得 f ( x ~ ) f(\tilde{x}) f(x~) 得到一个错误的分类。
将 x ~ \tilde{x} x~ 代入 f ( x ) f(x) f(x) 的公式中,我们有:
f ( x ~ ) = w T ( x + η ) + b = w T x + w T η + b f(\tilde{x}) = w^T (x + η) + b = w^T x + w^T η + b f(x~)=wT(x+η)+b=wTx+wTη+b
我们可以观察到,如果我们选择 η η η 与 w w w 成正比,那么 w T η w^T η wTη 的值将会很大。这意味着,通过调整 η η η 的大小和方向,我们可以使 f ( x ~ ) f(\tilde{x}) f(x~) 的值足够大,从而导致错误的分类。
FGSM类
FSGM算法
FGSM算法的核心思想是,利用输入数据的梯度信息来进行扰动,从而生成对抗样本。具体来说,FGSM算法会计算输入数据关于损失函数的梯度,然后将梯度的符号作为扰动的方向,添加一个很小的扰动,从而生成对抗样本。FGSM算法的公式如下:
- 给定输入样本* x x x*和真实标签 y t r u e y_{true} ytrue。
- 计算输入样本 x x x关于损失函数 J J J的梯度,即 ∇ x J ( x , y t r u e ) \nabla_x J(x, y_{true}) ∇xJ(x,ytrue)。
- 计算梯度的符号,即 s i g n ( ∇ x J ( x , y t r u e ) ) 。 sign(\nabla_x J(x, y_{true}))。 sign(∇xJ(x,ytrue))。
- 将符号作为扰动方向,添加一个很小的扰动 ϵ \epsilon ϵ,即 ϵ ∗ s i g n ( ∇ x J ( x , y t r u e ) ) \epsilon * sign(\nabla_x J(x, y_{true})) ϵ∗sign(∇xJ(x,ytrue))。
- 生成对抗样本:
x ~ = x + ϵ ∗ s i g n ( ∇ x J ( x , y t r u e ) ) 。 \tilde{x} = x + \epsilon * sign(\nabla_x J(x, y_{true}))。 x~=x+ϵ∗sign(∇xJ(x,ytrue))。
**伪代码示例:**用MNIST数据集来验证
import torch
import torch.nn as nn
def fgsm_attack(image, epsilon, data_grad): #输入图像,扰动因子,数据梯度
sign_data_grad = d