Pytorch对机器学习模型的安全漏洞攻击方法之Fast Gradient Sign Attack(FGSM,快速梯度符号攻击)

这篇具有很好参考价值的文章主要介绍了Pytorch对机器学习模型的安全漏洞攻击方法之Fast Gradient Sign Attack(FGSM,快速梯度符号攻击)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原论文:EXPLAINING AND HARNESSING ADVERSARIAL EXAMPLES
一般本人的习惯是先看论文熟悉它,然后代码去实现它,这样感觉要好点。因为论文讲解的比较全面和一些实验对比还有很多的引用等,另外大家知道好论文基本都是英文,所以对于英文弱点的伙伴们可能需要多花点时间去研读了。论文有论文的好处:全面,博客也有博客的好处:重点展示,以及代码的实现。

1、快速梯度符号攻击

攻防是一个永恒的主题,同样也适应在机器学习模型中,这也是一门热门话题:对抗性机器学习。

通过论文的阅读,我这里表达下自己对论文的理解(如有错误请指正):FGSM是一种简单高效的对抗样本生成方法,​通过计算loss对于输入的梯度为∇xJ(θ,x,y),​然后将其符号化,使用这个函数sign(),​最后将符号化的梯度乘以一个小的扰动值ϵ,​这个扰动值ϵ是一个超参数,​从而生成肉眼难以察觉的对抗样本,让机器模型学习产生错误的分类结果。

我们先来看下一张“经典熊猫”图:

Pytorch对机器学习模型的安全漏洞攻击方法之Fast Gradient Sign Attack(FGSM,快速梯度符号攻击)

输入是一张“熊猫”,加了一些扰动之后,我们发现目标网络错误地将它归类为“长臂猿”了,而且这个置信度是99.3%,哈哈,这算不算迷之自信。所以说我们在设计和训练机器学习模型的时候,经常会忽视的方面是安全性和鲁棒性,特别是在面对希望欺骗模型的对手时,也就是说攻击模型,让这个模型的输出造成错误,比如分类错误。就是在我们的图像中添加不可察觉的扰动都会导致截然不同的模型性能。

本章将通过一个图像分类器的例子来探讨这个主题。具体来说,我们将使用一个最早最流行的攻击方法之一:快速梯度符号攻击(Fast Gradient Sign Attack)方法来欺骗MNIST分类器。
我们知道对于攻击分两种,白盒攻击和黑盒攻击,这里介绍的FGSM属于白盒攻击,而黑盒攻击的意思就是不清楚模型的架构和权重,只有输入和输出,也就是说模型对于攻击者来说是个黑盒子,不清楚里面的任何情况。

本人深度学习的第一个真正实例也是这个手写识别数字数据集MNIST,对于初次接触的可以先熟悉下这个数据集,很经典的例子,下面是一些MNIST相关文章,有兴趣的可以看看:
MNIST数据集手写数字识别(一)
MNIST数据集手写数字识别(二)
深度的卷积神经网络CNN(MNIST数据集示例)
卷积神经网络(CNN)之MNIST手写数字数据集的实现
这个攻击方法的示例来自于:https://github.com/pytorch/tutorials/blob/main/beginner_source/fgsm_tutorial.py
下面本人将对其进行一些通俗的解释,然后具体来看下是如何进行攻击的。最后通过可视化,让大家有个更直观的感受。

这里使用Jupyter Lab来测试,没有安装的可以安装来体验下,安装命令:

pip install jupyterlab -i http://pypi.douban.com/simple/  --trusted-host pypi.douban.com

安装好了之后,命令行输入启动命令即可:jupyter lab

2、MNIST模型 

首先导入相关需要的库 

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

这里使用的是PyTorch框架,如果你没有安装相关库,将报模块缺失的错误,然后安装的时候还是推荐使用加镜像安装,国内安装速度要快很多!

报错:ModuleNotFoundError: No module named 'torch'
安装命令:

pip install torch -i http://pypi.douban.com/simple/  --trusted-host pypi.douban.com

报错:ModuleNotFoundError: No module named 'torchvision'
安装命令:

pip install torchvision -i http://pypi.douban.com/simple/  --trusted-host pypi.douban.com
#这是一个hack,用来在下载MNIST数据集时绕过“User-agent”限制,看情况可选
from six.moves import urllib
opener = urllib.request.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
urllib.request.install_opener(opener)

#这里的epsilons就是扰动量,随着这个值的增加,我们可以观察到它们的分类错误将越来越大
epsilons = [0, .05, .1, .15, .2, .25, .3]
pretrained_model = "data/lenet_mnist_model.pth"
use_cuda=True #由于这里使用的数据集比较小,所以使用CPU也是可以的

其中预训练模型下载:https://drive.google.com/drive/folders/1fn83DF14tWmit0RTKWRhPq5uVXt73e0h

当然这里需要科学上网,对于不方便的,我将其上传到了CSDN,点击下载:MNIST预训练模型.pth文件

# 定义被攻击的模型
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
        self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
        self.conv2_drop = nn.Dropout2d()
        self.fc1 = nn.Linear(320, 50)
        self.fc2 = nn.Linear(50, 10)

    def forward(self, x):
        x = F.relu(F.max_pool2d(self.conv1(x), 2))
        x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
        x = x.view(-1, 320)
        x = F.relu(self.fc1(x))
        x = F.dropout(x, training=self.training)
        x = self.fc2(x)
        return F.log_softmax(x, dim=1)

# MNIST Test dataset and dataloader declaration
test_loader = torch.utils.data.DataLoader(
    datasets.MNIST('../data', train=False, download=True, transform=transforms.Compose([
            transforms.ToTensor(),
            ])),
        batch_size=1, shuffle=True)

#CUDA Available:  False
print("CUDA Available: ",torch.cuda.is_available())
device = torch.device("cuda" if (use_cuda and torch.cuda.is_available()) else "cpu")

# 初始化模型
model = Net().to(device)

# 加载预训练模型的权重
model.load_state_dict(torch.load(pretrained_model, map_location='cpu'))

# 设置模型为评估模式
model.eval()

如果没有下载好MNIST数据集将先自动下载,然后初始化模型并加载预训练模型的权重。

'''
Net(
  (conv1): Conv2d(1, 10, kernel_size=(5, 5), stride=(1, 1))
  (conv2): Conv2d(10, 20, kernel_size=(5, 5), stride=(1, 1))
  (conv2_drop): Dropout2d(p=0.5, inplace=False)
  (fc1): Linear(in_features=320, out_features=50, bias=True)
  (fc2): Linear(in_features=50, out_features=10, bias=True)
)
'''

3、FGSM攻击函数

模型定义并初始化好了之后,我们就开始写FGSM的攻击代码
通过干扰原始输入来定义产生对抗性例子的函数,公式如下:
perturbed_image=image+epsilon∗sign(data_grad)=x+ϵ∗sign(∇xJ(θ,x,y))
另外为了保持数据的原始范围,将扰动后的图像裁剪到范围内[0,1]
代码如下: 

def fgsm_attack(image, epsilon, data_grad):
    # 收集数据梯度的元素符号
    sign_data_grad = data_grad.sign()
    # 通过调整输入图像的每个像素来创建扰动图像
    perturbed_image = image + epsilon*sign_data_grad
    # 添加剪辑以保持[0,1]范围
    perturbed_image = torch.clamp(perturbed_image, 0, 1)
    return perturbed_image

4、攻击MNIST模型代码

def test( model, device, test_loader, epsilon ):
    # 正确的计数
    correct = 0
    adv_examples = []

    # 循环遍历测试集中的所有示例
    for data, target in test_loader:
        # 将数据和标签发送到设备
        data, target = data.to(device), target.to(device)
        # 设置张量的requires_grad属性。重要的进攻
        data.requires_grad = True

        output = model(data)
        init_pred = output.max(1, keepdim=True)[1] # 得到最大对数概率的索引

        # 如果最初的预测是错误的,不要攻击,继续前进
        if init_pred.item() != target.item():
            continue

        # 计算损失
        loss = F.nll_loss(output, target)

        # 梯度置零
        model.zero_grad()
        loss.backward()
        data_grad = data.grad.data

        # 调用上面写的FGSM攻击函数
        perturbed_data = fgsm_attack(data, epsilon, data_grad)
        # 重新分类扰动图像
        output = model(perturbed_data)

        final_pred = output.max(1, keepdim=True)[1]
        if final_pred.item() == target.item():
            correct += 1
            # 保存ε为0的例子
            if (epsilon == 0) and (len(adv_examples) < 5):
                adv_ex = perturbed_data.squeeze().detach().cpu().numpy()
                adv_examples.append( (init_pred.item(), final_pred.item(), adv_ex) )
        else:
            # 为了后面的可视化,保存一些对抗性例子(就是错误的分类)
            if len(adv_examples) < 5:
                adv_ex = perturbed_data.squeeze().detach().cpu().numpy()
                adv_examples.append( (init_pred.item(), final_pred.item(), adv_ex) )

    # 计算最终精度
    final_acc = correct/float(len(test_loader))
    print("Epsilon: {}\tTest Accuracy = {} / {} = {}".format(epsilon, correct, len(test_loader), final_acc))

    # 返回最终精度和对抗性例子
    return final_acc, adv_examples

5、运行攻击代码

accuracies = []
examples = []

# 为每个epsilon运行测试
for eps in epsilons:
    acc, ex = test(model, device, test_loader, eps)
    accuracies.append(acc)
    examples.append(ex)

'''
Epsilon: 0	Test Accuracy = 9810 / 10000 = 0.981
Epsilon: 0.05	Test Accuracy = 9426 / 10000 = 0.9426
Epsilon: 0.1	Test Accuracy = 8510 / 10000 = 0.851
Epsilon: 0.15	Test Accuracy = 6826 / 10000 = 0.6826
Epsilon: 0.2	Test Accuracy = 4301 / 10000 = 0.4301
Epsilon: 0.25	Test Accuracy = 2082 / 10000 = 0.2082
Epsilon: 0.3	Test Accuracy = 869 / 10000 = 0.0869
'''

可以看到随着ε的增加,准确率是越来越低了。

6、精度的可视化 

 我们将上面的迭代数据做一个可视化,更直观的感受下:

plt.figure(figsize=(5,5))
plt.plot(epsilons, accuracies, "*-")
plt.yticks(np.arange(0, 1.1, step=0.1))
plt.xticks(np.arange(0, .35, step=0.05))
plt.title("Accuracy vs Epsilon")
plt.xlabel("Epsilon")
plt.ylabel("Accuracy")
plt.show()

Pytorch对机器学习模型的安全漏洞攻击方法之Fast Gradient Sign Attack(FGSM,快速梯度符号攻击)

 7、对抗性示例

 最后我们在每个epsilon上绘制几个对抗性样本的例子来感受下,原始分类 -> 对抗分类

cnt = 0
plt.figure(figsize=(8,10))
for i in range(len(epsilons)):
    for j in range(len(examples[i])):
        cnt += 1
        plt.subplot(len(epsilons),len(examples[0]),cnt)
        plt.xticks([], [])
        plt.yticks([], [])
        if j == 0:
            plt.ylabel("Eps: {}".format(epsilons[i]), fontsize=14)
        orig,adv,ex = examples[i][j]
        plt.title("{} -> {}".format(orig, adv))
        plt.imshow(ex, cmap="gray")
plt.tight_layout()
plt.show()

Pytorch对机器学习模型的安全漏洞攻击方法之Fast Gradient Sign Attack(FGSM,快速梯度符号攻击)

我们可以看到在epsilon=0.25甚至0.3的时候,在有噪声的情况下,人眼还是可以区分这些数字,但是这个模型的识别在epsilon=0.05的时候就开始分类有误了。

对于模型有攻击,那就会有防御,这块有兴趣的可以看这篇论文:Adversarial Attacks and Defences Competition 就是讲解对抗性攻击和防御竞争,对抗性攻击不限于图片,其他的语音和文本模型的攻击都是可以。文章来源地址https://www.toymoban.com/news/detail-422674.html

到了这里,关于Pytorch对机器学习模型的安全漏洞攻击方法之Fast Gradient Sign Attack(FGSM,快速梯度符号攻击)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 6.1 安全漏洞与网络攻击

    数据参考:CISP官方  目录 安全漏洞及产生原因 信息收集与分析 网络攻击实施 后门设置与痕迹清除 什么是安全漏洞 安全漏洞也称脆弱性,是计算机系统存在的缺陷 漏洞的形式 安全漏洞以不同形式存在 漏洞数量逐年递增  漏洞产生的技术原因 内因: 软件复杂性使得漏洞不

    2024年02月13日
    浏览(48)
  • web安全漏洞-SQL注入攻击实验

    实验目的 学习sql显注的漏洞判断原理 掌握sqlmap工具的使用 分析SQL注入漏洞的成因 实验工具 sqlmap是用python写的开源的测试框架,支持MySQL,Oracle,PostgreSQL,Microsoft SQL Server,Microsoft Access,IBM DB2,SQLite,Firebird,Sybase,SAP,MAXDB并支持6种SQL注入手段。 实验内容 SQL注入(SQL I

    2024年02月06日
    浏览(56)
  • 【安全测试】Web应用安全之XSS跨站脚本攻击漏洞

    目录 前言 XSS概念及分类 反射型XSS(非持久性XSS) 存储型XSS(持久型XSS) 如何测试XSS漏洞 方法一: 方法二: XSS漏洞修复 原则:不相信客户输入的数据 处理建议 资料获取方法 以前都只是在各类文档中见到过XSS,也进行过相关的学习,但是都是一知半解,过了一段时间就忘了。

    2024年02月14日
    浏览(54)
  • [渗透测试]—6.2 无线网络安全漏洞和攻击技术

    在本章节中,我们将学习一些常见的无线网络安全漏洞和攻击技术,如WPS漏洞、Evil Twin攻击等。我们将尽量讲解得详细、通俗易懂,并提供尽可能多的实例。 Wi-Fi保护设置(WPS)是一种简化无线网络配置的技术,可以通过输入PIN码或按下物理按钮的方式快速连接无线网络。然

    2024年02月11日
    浏览(52)
  • MS12-020漏洞利用-----蓝屏攻击(windows安全)

    靶机系统:windows server 2008 R2      ip:192.168.100.218 攻击机系统:linux-kali                ip:192.168.100.99 首先利用kali的nmap扫描攻击进行端口的扫描,判断是否有可利用的端口; 结果:     可以看到开启了3389端口,远程连接服务,那么便可以尝试蓝屏攻击,这是提前得

    2024年01月16日
    浏览(46)
  • 智能合约安全,著名的区块链漏洞:双花攻击

    区块链技术通过提供去中心化和透明的系统彻底改变了各个行业。 但是,与任何技术一样,它也不能免受漏洞的影响。一个值得注意的漏洞是双花攻击。 在本文中,我们将深入研究双花攻击的复杂性,探讨其工作原理、开发方法、预防措施及其对区块链生态系统的影响。 区

    2024年02月04日
    浏览(57)
  • 服务器安全性漏洞和常见攻击方式解析

    服务器安全性是当今互联网信息安全的重要组成部分。在网络安全领域中,常见的威胁之-就是服务器安全性漏洞。本文将深入探讨服务器安全性漏洞的本质,并分析常见的攻击方式并提供一些建议以加强服务器的安全性。 一、服务器安全性漏洞的本质 服务器安全性漏洞指的

    2024年01月17日
    浏览(48)
  • Web系统常见安全漏洞介绍及解决方案-CSRF攻击

    🐳博客主页:拒绝冗余 – 生命不息,折腾不止 🌐订阅专栏:『Web安全』 📰如觉得博主文章写的不错或对你有所帮助的话,还望大家多多支持呀! 👉关注✨、点赞👍、收藏📂、评论。 CSRF跨站请求伪造,全称Cross-site request forgery,是指利用受害者尚未失效的身份认证信息

    2024年01月22日
    浏览(46)
  • Web安全测试(五):XSS攻击—存储式XSS漏洞

    结合内部资料,与安全渗透部门同事合力整理的安全测试相关资料教程,全方位涵盖电商、支付、金融、网络、数据库等领域的安全测试,覆盖Web、APP、中间件、内外网、Linux、Windows多个平台。学完后一定能成为安全大佬! 全部文章请访问专栏: 《全栈安全测试教程(0基础

    2024年02月10日
    浏览(72)
  • OKLink2月安全月报| 2起典型漏洞攻击案例分析

    在本月初我们发布的2024年2月安全月报中提到,2月全网累计造成损失约1.03亿美元。其中钓鱼诈骗事件损失占比11.76%。 OKLink提醒大家,在参与Web3项目时,应当仔细调研项目的真实性、可靠性,提升对钓鱼网站和风险项目的甄别能力,降低投资的风险。 官方社媒遭受诈骗与钓鱼

    2024年03月14日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包