【Adversarial Attack】快速梯度符号攻击(FGSM) EXPLAINING AND HARNESSING ADVERSARIAL EXAMPLES

https://blog.csdn.net/qq_51399582/article/details/134699501
https://blog.csdn.net/WangHY_XCJ/article/details/109401368
https://blog.csdn.net/kking_edc/article/details/123094670
https://blog.csdn.net/shuweishuwei/article/details/119758366
https://blog.csdn.net/hy592070616/article/details/131055217
https://blog.csdn.net/qq_42931831/article/details/107895635
https://blog.csdn.net/qq_21149391/article/details/125531473

https://arxiv.org/abs/1412.6572

本文认为神经网络易受对抗性扰动影响的主要原因是它们的线性性质
在高维空间中,线性行为也能产生对抗样本。我们发现把对抗性样本加入到训练集中,比仅仅由dropout带来的正则化的正确率更高。一般正则化策略(如dropout、pretraining和model averaging )不会显著降低模型对对抗性样本的脆弱性,但利用非线性模型系列(如 RBF 网络)可以降低对抗性样本的脆弱性。

https://blog.csdn.net/qq_29462849/article/details/123039068
正则化策略是什么?
训练中的一个关键因素是网络的正则化,它可以防止模型在训练的过程中出现过拟合的现象。
机器学习中的一个普遍问题是调整给定模型的参数,使其对训练数据和新的数据能够有更好的鲁棒性。旨在减少不属于训练集的数据上的误差的算法的集合被称为正则化技术。
标准化和正则化技术的一个主要区别是,正则化在训练期后不再使用,而标准化保留在模型之中。例如,Cutout和MaxDropout在推理期间没有被执行,但是Batch Normalization在推理时需要执行。
第一:是“数据正则化”,其中所有的方法都专注于对于输入数据的更改
第二:是“结构正则化”,主要是修改神经网络或核函数生成特征映射的过程
最后:是“标签正则化”,主要是对给定输入的标签进行转换和修正

设计由于线性而易于训练的模型与设计使用非线性效应来抵抗对抗扰动的模型之间具有根本的对立关系。从长远来看,通过设计更强大的优化方法可以成功训练更多的非线性模型,可以摆脱这种权衡。

相关工作

  • Box-constrained L-BFGS可以可靠地找到敌对的例子
  • 很多数据集上对抗样本与基本样本差异较少
  • 同一个对抗性样本可以被不同训练数据集的分类器或不同结构的分类器分类错误
  • Shallow softmax regression models也无法抵抗对抗性样本带来的错误率
  • 利用对抗性样本可以帮助模型正则化,但是很不实际(因为代价昂贵,需要在内部循环中进行昂贵的约束优化)

为什么对抗样本可以帮助正则化?
通过对抗训练(Adversarial Training)减少原有独立同分布的测试集的错误率——在对抗扰动的训练集样本上训练网络。Goodfellow表明,这些对抗样本的主要原因之一是过度线性。神经网络主要是基于线性块构建的。因此在一些实验中,它们实现的整体函数被证明是高度线性的。这些线性函数很容易优化。不幸的是,如果一个线性函数具有许多输入,那么它的值可以非常迅速地改变。如果我们用ϵ 改变每个输入,那么权重为w 的线性函数可以改变ϵ||w||之多。如果w是高维的这会是一个非常大的数。对抗训练通过鼓励网络在训练数据附近的局部区域恒定来限制这一高度敏感的局部线性行为。这可以被看作是一种明确地向监督神经网络引入局部恒定先验的方法。对抗训练有助于体现积极正则化与大型函数族结合的力量。

线性模型中对抗样本存在的原因

在这里插入图片描述
每个像素的颜色信息通常使用8位(bit)来存储。由于每个像素的值是离散的,只能取0到255之间的整数,所以任何小于1的灰度变化(即小于1/255的变化)在这种8位表示中是无法区分的。换句话说,如果两个像素的灰度值相差小于1,它们在图像中看起来是相同的,这种微小的变化在8位图像中是不可识别的。

非线性模型的线性扰动

从线性视角看待对抗样本提供了一种快速生成它们的方法。我们假设神经网络过于线性,无法抵抗线性对抗扰动。LSTM、ReLUs和maxout网络都被有意设计为以非常线性的方式运行,以便更容易进行优化。出于同样的原因,许多非线性模型(如sigmoid网络)会被仔细调整,使其大部分时间都处于非饱和、更线性的状态。这种线性行为表明cheap, analytical perturbations of a linear model should also damage neural networks。

FGSM

Fast Gradient Sign Attack(FGSM),简称快速梯度下降符号攻击,直接利用神经网络的学习方式–梯度更新来攻击神经网络,这种攻击是根据相同的反向传播梯度调整输入数据来最大化损失,换句话说,攻击使用了输入数据相关的梯度损失方式,通过调整输入数据,使损失最大化。
在这里插入图片描述

在这里插入图片描述
这是产生对抗性样本的“fast gradient sign method”方法,需要利用 backpropagation快速得到梯度

使用ϵ = 0.25 ,我们使浅层softmax分类器在MNIST上测试集的错误率为99.9%,且平均置信度为79.3%。在相同的设定下,maxout网络错误分类了89.4%的对抗样本,平均置信度为97.6%。类似地,在预处理版本的CIFAR-10测试集上使用卷积maxout网络时,使用ϵ = 0.1,我们获得87.15%的错误率和96.6%的平均置信度。其他生成对抗性示例的简单方法也是可能的。

在这里插入图片描述
通过加上一个人类感知不到的小向量,向量的值为ϵ乘输入像素点关于误差的梯度值的符号值。这里的0.007对应于GoogLeNet转换为真实的数字后的8位图像编码的最小位的大小。

预先设置一个扰动值e

from __future__ import print_function
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
import numpy as np
import matplotlib.pyplot as plt
from torchvision import models
import cv2
from torch.autograd import Variable
e=0.5#扰动值
#获取计算设备 默认是CPU
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

图像的加载以及预处理,要考虑图片通道数(RGB),尺寸,图片类型

image_path="data/goldfish.jpg"
orig = cv2.imread(image_path)[..., ::-1]
#省略号 (...): 表示保留数组的前两个维度(通常是图像的高度和宽度)。步长 (::-1): 表示反转每个颜色通道的顺序。
#例如,如果图像是BGR格式(蓝色、绿色、红色),则通过这个操作将其转换为RGB格式(红色、绿色、蓝色)
orig = cv2.resize(orig, (224, 224))
img = orig.copy().astype(np.float32)
#使用Imagenet的均值和标准差是一种常见的做法。它们是根据数百万张图像计算得出的。如果要在自己的数据集上从头开始训练,则可以计算新的均值和标准差,这是一种经验值
mean = [0.485, 0.456, 0.406]
std = [0.229, 0.224, 0.225]
#归一化,为什么进行归一化,因为训练效果好
img /= 255.0
img = (img - mean) / std
#把HWC的图片转为CHW的图片
#如果你有一个图像数组,其原始形状是 (channels, height, width),使用 img.transpose(2, 0, 1) 后,它的形状将变为 (height, width, channels)
img = img.transpose(2, 0, 1)
 
 # 第0维(即最前面)增加一个新的维度
img=np.expand_dims(img, axis=0)
 
img = Variable(torch.from_numpy(img).to(device).float())
print(img.shape)

定义模型,优化器、损失等等参数

#使用预测模式 主要影响droupout和BN层的行为
model = models.alexnet(pretrained=True).to(device).eval()
#取真实标签
label=np.argmax(model(img).data.cpu().numpy())#这里为什么要加cup()?因为np无法直接转为cuda使用,要先转cpu
print("label={}".format(label))
# 图像数据梯度可以获取
img.requires_grad = True
 
# 设置为不保存梯度值 自然也无法修改
for param in model.parameters():
    param.requires_grad = False
 
optimizer = torch.optim.Adam([img])#优化器
loss_func = torch.nn.CrossEntropyLoss()#交叉熵计算损失
 
epochs = 10#训练轮次
target = 31#原始图片的标签
target = Variable(torch.Tensor([float(target)]).to(device).long())#转换数据类型
print(target)

定义fgsm攻击函数

def fgsm_attack(image, epsilon, data_grad):  #需要输入三个变量,干净的图片,扰动量和输入图片梯度
    # 使用sign(符号)函数,将对x求了偏导的梯度进行符号化
    sign_data_grad = data_grad.sign()
    # 通过epsilon生成对抗样本。对抗样本perturbed_image由原始图像叠加epsilon像素级扰动量epsilon与梯度符号sign_data_grad的乘积组成
    perturbed_image = image + epsilon*sign_data_grad
    #噪声越来越大,机器越来越难以识别,但人眼可以看出差别
    # 做一个剪裁的工作,将torch.clamp内部大于1的数值变为1,小于0的数值等于0,防止image越界
    ## 为了保持图像的原始范围,将受干扰的图像裁剪到一定的范围【0,1】
    perturbed_image = torch.clamp(perturbed_image, 0, 1)
    # 返回对抗样本
    return perturbed_image

训练

for epoch in range(epochs):
    # forward + backward
    output = model(img)
 
    loss = loss_func(output, target)
    label = np.argmax(output.data.cpu().numpy())
 
    print("epoch={} loss={} label={}".format(epoch, loss, label))
 
    # 梯度清零
    optimizer.zero_grad()
    # 反向传递 计算梯度
    loss.backward()
    img.data = fgsm_attack(img,e,img.data)

这个感觉更好
https://blog.csdn.net/qq_51399582/article/details/134699501

线性模型对抗训练 versus weight decay

考虑在最简单的逻辑回归(Logistics Regression)模型上应用FGSM方法,从而理解在一个简单的设置中如何生成对抗样本。
在这里插入图片描述

L1正则化是什么?
https://blog.csdn.net/qlkaicx/article/details/134841465
L1正则化是指权值向量w中各个元素的绝对值之和。L1正则化的主要作用是引导模型更加关注那些绝对值较大的权重,从而在一定程度上防止过拟合。在机器学习领域,L1正则化通常用于稀疏模型,即那些大部分权重为零的模型,如Lasso回归等。

总结

对抗样本可以被解释成高维点乘的一种性质,他们是模型过于线性的结果。
对抗样本具有对不同模型都有效的特性,这个特性是可解释的。
扰动的方向十分重要。
我们介绍了一族快速生成对抗样本的方法。
通过对抗样本训练可以正则化,甚至比dorpout的好。
我们进行了实验不能用其他方法更简单的更少的高效正则化(包括L1)达到这个效果。
模型容易被优化就容易被扰动。
线性模型抵抗对抗样本能力差,只有大量隐藏层的网络才应该被训练成抵抗对抗样本的网络。
RBF神经网络对对抗样本有抵抗力。
输入加噪音并不难抵抗对抗样本。
Ensembles不能抵抗对抗样本。

优点:这篇论文中,Goodfellow否定了Szegedy关于为什么神经网络易受到对抗样例攻击的解释,他认为神经网络在高维空间中线性性质才是导致对抗样例存在的真正原因。基于这种解释,Goodfellow提出了一种快速生成对抗样例的方法,即快速梯度符号法(FGSM),这种方法的核心思想是沿着梯度的反方向添加扰动从而拉大对抗样例于原始样本的距离,因为Goodfellow认为在构造对抗样例时,我们更应该关心的是扰动的方向而不是扰动的数目。Goodfellow认为对抗样例之所以有泛化性的原因是因为添加的扰动与模型的权重向量高度一致,而且不同的模型在被训练执行相同的任务时,从训练数据中学到的东西相似。在这篇文章中,Goodfellow提出了对抗训练的思想,他认为对抗训练会导致训练过程中的正则化,而且其效果甚至超过了dropout

不足:这篇文章中提出的快速梯度符号法存在明显的缺点,首先,这是一种不定向的攻击,只能让模型出错而无法做到定向攻击。而且这种攻击的鲁棒性不强,添加的扰动容易在图片的预处理阶段被过滤掉。尽管Googdfellow提出的对抗训练方式可以提高模型的泛化能力,从而在一定程度上防御对抗样例攻击,但这种防御方法只针对一步对抗样例攻击有效,攻击者仍可以针对新的网络构造其他的对抗样例。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开心星人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值