小工具      在线工具  汉语词典  css  js  c++  java

反样本攻击与防御实践

计算机视觉,机器学习,安全 额外说明

收录于:40天前

01前言

对抗性例子大家都很熟悉,但你可能觉得它们离你很遥远。毕竟主要是学术界在做这项工作,可能需要大量的数学理论基础,所以我没有尝试去实践。本文不会提及高等数学理论。唯一的公式仅用于形式化描述攻击计划,不涉及任何数学概念。同时,面向代码实践论文中提出的方案,成功实现了对抗性样本攻击,进而提供了典型的防御方案,即对抗性训练,同样面向实战,并证明了有效性的防御解决方案。对抗样本领域的研究正在如火如荼地进行。本文提到的攻防方案都不是最优的。希望感兴趣的大师读完这篇文章后,不再对这个领域产生排斥,加入到对抗性样本的研究团队中来。快来为人工智能安全做出贡献吧。

02模型构建与评估

我们这次使用的数据集是Fashion MNIST。 Fashion-MNIST 是一个替代 MNIST 手写数字集的图像数据集。它由德国时尚科技公司 Zalando 的研究部门提供。它涵盖了10个类别总共70,000种不同产品的正面图像。 Fashion-MNIST 的大小、格式和训练/测试集划分与原始 MNIST 完全相同。 60000/10000训练和测试数据划分,28x28灰度图像。

数据集大致如下

上图中,每个类别有 3 行。这 10 个类别分别是“T 恤/上衣”、“裤子”、“套头衫”、“连衣裙”、“外套”、“凉鞋”、“衬衫”、“运动鞋”、“包”、“踝靴”

首先加载数据集

我们需要简单地预处理数据集并为其添加通道维度,否则卷积层将无法正常工作,像素值需要缩放到[0,1]范围。

接下来,打印出实际加载的样本并看一下。

因为图像是灰度图像,所以输入形状定义如下

接下来,构建具有以下架构的 CNN 模型:

使用summary方法输出各层参数状态

设置优化器、损失函数、批量大小等超参数。

我们定义另一个辅助函数来绘制与训练过程相关的指标变化。

接下来,开始训练模型

使用前面定义的绘图函数来绘制模型训练过程中指标的变化。

评估模型在测试集上的性能

您如何阅读上图中打印的分类报告?

列表左侧一栏是类别的标签名称

右侧第一行,精确召回率f1-score的三列分别是每个类别的精确率、召回率和F1值。支持度是测试数据中某一类别的样本数量;

Accuracy代表准确度,即正确预测的样本量占总样本量的比例; Macro avg代表宏观平均,代表所有类别对应指标的平均值,而weighted avg有加权平均值,代表类别样本占总样本的比例与对应指标乘积的累加和。

从上面的分类报告中,我们可以看到模型在测试集上表现良好。

打印的混淆矩阵如下

混淆矩阵是总结机器学习中分类模型预测结果的情况分析表。它根据两个标准以矩阵形式汇总数据集中的记录:真实类别和分类模型预测的类别。矩阵的行代表实际值,矩阵的列代表预测值。

我们以第一行为例。样本的真实类别是T恤。分类结果中,862个样本被正确分类,16个样本被错误分类为套头衫,15个样本被错误分类为连衣裙,3个样本被错误分类为外套,96个样本被错误分类为衬衫,8个样本被错误分类为包包。

如果只想看每个类别有多少个样本被正确分类,那么只需要看对角线即可。每个类别总共有1000个测试样本,其中862件T恤被正确分类,975件裤子被正确分类,依此类推。从混淆矩阵中,我们可以更具体地看到测试样本被错误地分类到了哪一类。

03 对抗样本攻击

正如您可能在某种程度上听说过的那样,对抗性示例是通过对数据集中的样本应用小而故意的扰动而形成的输入,从而导致最坏的情况。因此,扰动的输入会导致模型以高置信度执行。输出错误答案。

这次我们来练习最经典的对抗性样本攻击方案——FGSM。你应该看过下面的图片。这是来自提出FGSM的论文。

从熊猫图像开始,攻击者向原始图像添加小扰动,导致模型将该图像预测为长臂猿。

那么FGSM攻击是如何实施的呢?或者攻击中添加的扰动从何而来?

我们知道,在训练分类模型时,网络根据输入图像学习特征,然后通过softmax层得到分类概率。然后损失函数根据分类概率和真实标签计算损失值,返回损失值并计算梯度(即梯度反向传播),最后根据计算的梯度更新网络参数。更新网络参数的目的是让损失值越来越小,从而使模型正确分类的概率越来越高。

对抗性样本攻击的目的不是修改分类网络的参数,而是修改输入图像的像素值,使得修改后的图像能够扰乱分类网络的分类。然后根据上面提到的分类模型的训练过程,可以将损失值传回输入图像并计算梯度,也就是下面的公式

其中 θ 是模型的参数,x 是模型的输入,y 是与 x 相关的类别,J (θ, x, y) 是用于训练神经网络的损失函数。

接下来,可以通过sign()函数计算梯度的方向。 Sign() 函数是用于查找值的符号的函数。例如,对于输入大于0,输出为1,对于输入小于0,输出为-1,对于输入等于0的输入,输出为0。 使用梯度方向的原因而不是梯度值来控制扰动的距离。

常规分类模型训练在更新参数时,会从参数中减去计算出的梯度,使得损失值越来越小,模型预测正确的概率越来越大。由于对抗性攻击希望模型将输入图像误分类到错误的类别,因此要求损失值越来越大,即模型预测的概率对应真实标签的概率小到可能,这和原来的参数更新目的一模一样。相反。因此,只需要将计算出的梯度方向添加到输入图像中,使得修改后的图像通过分类网络时的损失值大于未修改的图像通过分类网络时的损失值。也就是说,模型预测正确的概率变小了。另外,我们还需要控制扰动的程度,保证扰动足够小。因此,扰动公式如下

向原始样本添加扰动会创建对抗性样本,如下所示:

我们将其称为生成对抗性示例的快速梯度符号方法。

对应的代码实现如下

应用上述函数,我们看一下外套样本受到攻击前后的结果。

从视觉结果可以看出,左侧是原始样本,真实标签为外套,模型以很高的置信度预测其为外套。中间是增加的对抗性扰动。添加后,得到右侧的对抗样本。模型错误地将其预测为套头衫,表明我们的攻击成功了。

查看sneaker攻击前后结果

同样的攻击成功,其他测试集样本生成的对抗样本也能被成功攻击。

接下来,我们将进行对抗性训练,以提高模型的鲁棒性。

为了更全面地衡量模型对对抗性样本攻击的脆弱程度,我们可以将FGSM应用于测试数据,生成相应的对抗性样本测试集。

通过打印分类报告和混淆矩阵来评估模型面对对抗性样本攻击的鲁棒性

可以看出,整体指标较低,表明模型对于对抗性样本攻击的鲁棒性较差。

接下来,我们通过对抗性训练增强模型的鲁棒性。

04 对抗训练

在练习之前,我们先介绍一下对抗性训练的概念。

对抗性训练最初是由 Ian Goodfellow 等人提出的。作为一种防御对抗性攻击的方法,其思想非常简单明了。将生成的对抗样本添加到训练集中,并进行数据增强,让模型在训练过程中有更好的表现。这个时候,先学习对抗性例子。

对抗训练实际上是一个最小-最大优化问题,寻找一个模型(用参数表示)能够对在一定范围S内扰动的对抗样本进行正确分类,即

其中(x,y)表示原始数据和对应的标签,D表示数据的分布,L是损失函数

内层(括号内)是一个最大化,L表示对样本x叠加一个扰动,然后传入神经网络函数并与标签y进行比较得到的损失。 max L 是优化目标,即找到使损失函数最大化的扰动。简而言之,添加的扰动应该尽可能地混淆神经网络。外层是优化神经网络的最小化公式。也就是说,当扰动固定时,我们训练神经网络模型以最小化训练数据上的损失。也就是说,模型具有一定的鲁棒性,能够适应这一点。一种干扰。

接下来,让我们看看对抗性训练如何在实践中提高模型的鲁棒性。

首先,对训练集采用同样的方法,生成一批原始训练集的对抗样本作为对抗样本训练集,将对抗样本训练集与原始训练集合并作为最终训练集。

开始在最终训练集上训练模型

训练过程中指标变化如下:

这样,对抗训练就完成了

那么如何打击训练模型的质量呢?

首先,我们需要看看模型在正常测试集上的表现。毕竟大部分测试样本都是正常的。这是训练模型的主要任务,即需要在正常的测试样本面前表现良好。

可以看到性能还是相当不错的

此外,还取决于模型在接收对抗性样本时的表现。毕竟,这就是对抗性训练相对于一般训练的主要目的,就是在面对对抗性样本时不被它们欺骗。

从结果可以看出,模型在面对对抗性样本时表现非常好。

如果这些指标不直接具体,我们可以从这10类样本中每一类样本打印一个对抗样本,检查模型的分类结果。

从结果中我们可以看到,模型对所有10个对抗样本进行了正确分类,这表明该模型更加稳健,展示了对抗训练的有效性。

05参考

1.解释和利用对抗性例子

2.半监督文本分类的对抗性训练方法

3.对抗对抗性攻击的深度学习模型

4.https://zhuanlan.zhihu.com/p/10404005

5.https://zhuanlan.zhihu.com/p/166364358

6.https://github.com/1Konny/FGSM

7.https://github.com/ndb796/Pytorch-Adversarial-Training-CIFAR

8.https://github.com/zjfheart/Friendly-Adversarial-Training

06实用建议

基于机器学习的网络安全应用实践:http://mrw.so/5Q7rhG

在这一系列的实验中,我们将学习如何将机器学习与网络安全相结合,利用机器学习来辅助解决网络安全问题。另外,我们也会关注机器学习本身的安全问题,比如中毒攻击、逃逸攻击等,这部分目前也是学术界和工业界的研究热点。

. . .

相关推荐

额外说明

Oracle 行到列透视

案例一: 按天汇总学生每天学习时长 create table stu ( day VARCHAR2(20), name VARCHAR2(20), len NUMBER ); INSERT INTO stu VALUES ('01', '

额外说明

SpringCloud04_OpenFeign概述(远程调用)、基本使用、超时控制、日志打印功能

文章目录 ①. OpenFeign的概述 ②. Feign的基本使用(消费端) ③. OpenFeign超时控制 ④. OpenFeign日志打印功能 ⑤. Feign案例操作 ①. OpenFeign的概述 ①. Feign是一个服务接口的绑定器,(接

额外说明

go 中 iota 枚举的使用

iota 的基本规则 iota 是 go 语言的常量计数器,只能配合常量表达式使用。 在一个 const 声明语句中,在第一个声明的常量所在的行,iota 将会被置为0,然后在每一个有常量声明的行加1,可以将 iota 看作是 const 块的索引。 不

额外说明

Java操作es

抽空总结了一下使用Java操作es的使用API,方便后续编写代码参考使用,直接上代码 1、启动es和kibana,配合java程序观察操作数据的结果, 2、导入pom依赖, <dependency> <groupId>org.

额外说明

Linux常用命令:grep找出包含某个关键字的文件,输出给sed进行修改

// grep找出包含某个关键字的文件,输出给sed进行修改。 grep -rl -E "old_str1|old_str2"| xargs sed -i -e "s/old_str1/new_str1/g" -e "s/old_str2/new_st

额外说明

性能测试的具体流程

文章目录 1. 确定性能测试目标及指标 2. 设计测试场景 3. 配置测试环境 4. 编写测试脚本 5. 进行性能测试 6. 分析测试结果 7. 提出优化建议 8. 进行反复测试和调整 以下是一个基本的性能测试过程,旨在帮助了解性能测试的具体流程和步骤。

额外说明

猿创征文 | 大数据比赛以及日常开发工具箱

最近一直在参加安徽省大数据与人工智能应用竞赛,因此学习了很长一段时间的大数据,也积攒了一些大数据的开发经验;工欲善其事,必先利其器,所以想要给准备学习大数据的同学总结一下自己在大数据开发中所用到的工具。 目录 一、VMware Workstation 1

额外说明

分布式锁使用场景以及实现方式

目录 1.分布式锁的使用场景 2.分布式锁的常用实现方式 2.1 基于Zookeeper实现 2.2 基于Redis/MySql实现 2.3 用串行化代替分布式锁 2.3.1 异步串行化 2.3.2 同步串行化 1.分布式锁的使用场景 场景:单机多个线程

额外说明

2、Kafka 生产者

3.1 生产者消息发送流程 3.1.1 发送原理 在消息发送的过程中,涉及到了两个线程——main 线程和 Sender 线程。在 main 线程 中创建了一个双端队列 RecordAccumulator。main 线程将消息发送给 RecordAccu

额外说明

【cmd】win 10:'conda' 不是内部或外部命令,也不是可运行的程序或批处理文件 —— 问题解决

目录 一、报错情况 二、报错解决 一、报错情况 二、报错解决 (1)报错原因:Anaconda  未安装:          解决方法:安装 Anaconda 软件【安装完成文件大小为 5 G 左右。】 (2)报错原因:系统环境变量 path 未添加 A

ads via 小工具