Método de símbolo de gradiente rápido (FGSM) y su mejora

Método de símbolo de gradiente rápido (FGSM) y su mejora

Parte de la cotización, si hay infracción, notificar para eliminar.
Comprensión personal, si hay algún problema, corríjame.

Documentos relacionados con el desarrollo de FGSM

FGSM ——> IFGSM (también llamado BIM), ILCM ——> Documentos
relacionados con R + FGSM : FGSM: "Explaining And Harnessing Adversarial Examples" (2014) [2]
I-FGSM (también llamado BIM), ILCM: "Adversarial Examples en el mundo físico "(2016)
R + FGSM:" Ensemble Adversarial Training: Attacks and Defenses "(2017)
Fuente del artículo:
FGSM: http://de.arxiv.org/pdf/1412.6572
IFGSM (también conocido como BIM), ILCM: http://arxiv.org/pdf/1607.02533
Notas de referencia:
FGSM: https://zhuanlan.zhihu.com/p/33875223
IFGSM (también llamado BIM), ILCM: https://www.jianshu.com/ p / 2f3b15617236

FGSM

FGSM: encuentre el signo de dirección del gradiente (▽ J (θ, x, y)) donde la función de pérdida aumenta en la muestra original (x, y) y genere una cierta perturbación (controlada por ε) en la dirección del gradiente ŋ
Inserte la descripción de la imagen aquí

Implementación de código de FGSM (pytorch)

El código se movió de https://www.cnblogs.com/tangweijqxx/p/10615950.html, con algunos comentarios que entiendo, no lo ejecuté yo mismo, solo como referencia,
no sé mucho al respecto, espero poder dar consejos un poco

class FGSM(nn.Module):
    def __init__(self,model):
        super().__init__()
        self.model=model#必须是pytorch的model
        self.device=torch.device("cuda" if (torch.cuda.is_available()) else "cpu")
    def generate(self,x,**params):
        self.parse_params(**params)
        labels=self.y
        if self.rand_init:     #模型给x求导之前会为其添加一个随机噪声(噪声类型可以自己指定),据说这样效果过会好一点。
            x_new = x + torch.Tensor(np.random.uniform(-self.eps, self.eps, x.shape)).type_as(x).cuda()

        # get the gradient of x
        x_new=Variable(x_new,requires_grad=True)
        loss_func = nn.CrossEntropyLoss()
        preds = self.model(x_new)
        if self.flag_target:
            loss = -loss_func(preds, labels)    # labels为指定的目标标签,加负号即正常的梯度下降
        else:
            loss = loss_func(preds, labels)     #使整体损失函数增大
        self.model.zero_grad()   #把模型中参数的梯度设为0
        loss.backward()
		#如果想把CUDA tensor格式的数据改成numpy时,需要先将其转换成cpu float-tensor随后再转到numpy格式。 numpy不能读取CUDA tensor 需要将它转化为 CPU tensor
        grad = x_new.grad.cpu().detach().numpy()  
        # get the pertubation of an iter_eps
        if self.ord==np.inf:   #无穷范数
            grad =np.sign(grad)
        else:
            tmp = grad.reshape(grad.shape[0], -1)
            norm = 1e-12 + np.linalg.norm(tmp, ord=self.ord, axis=1, keepdims=False).reshape(-1, 1, 1, 1)
            # 选择更小的扰动
            grad=grad/norm
        pertubation = grad*self.eps   

        adv_x = x.cpu().detach().numpy() + pertubation
        adv_x=np.clip(adv_x,self.clip_min,self.clip_max)  #产生的对抗样本可能会在(0,1)这个范围之外,因此需要对x clip至(0,1)

        return adv_x

    def parse_params(self,eps=0.3,ord=np.inf,
    				clip_min=0.0,clip_max=1.0,    #保证对抗样本在样本空间
                     y=None,rand_init=False,flag_target=False):
        self.eps=eps
        self.ord=ord     #指定范数类型
        self.clip_min=clip_min   
        self.clip_max=clip_max
        self.y=y        #可指定目标标签
        self.rand_init=rand_init     #扰动是否随机初始化
        self.model.to(self.device)
        self.flag_target=flag_target

IFGSM / IBM

FGSM ITERATIVO (MÉTODO ITERATIVO BÁSICO): Para ataques
Inserte la descripción de la imagen aquí
sin objetivo ILCM (MÉTODO DE CLASE ITERATIVO MENOS PROBABLE): Para ataques de objetivo, minimice la función de pérdida de clase más improbable. El
Inserte la descripción de la imagen aquí
algoritmo BIM comienza con X N adv = X cy sigue la fórmula [min (ε + 4,1.25ε)] determina el número de iteraciones. Este método puede reducir eficazmente los ruidos molestos.

Comparación de los dos algoritmos

La FGSM es más rápida, pero el efecto de ataque no es muy bueno y la perturbación generada es mayor
Inserte la descripción de la imagen aquí

R + FGSM

El objetivo es maximizar la función de pérdida.
Inserte la descripción de la imagen aquí
El autor aproxima la ecuación reemplazando la solución del problema de maximización incorporado con el resultado de un ataque de un solo paso.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_36488756/article/details/109285323
Recomendado
Clasificación