news 2026/3/11 4:22:05

机器学习 - 对抗性机器学习

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
机器学习 - 对抗性机器学习

摘要:对抗性机器学习研究机器学习模型面对对抗性攻击时的脆弱性。攻击者通过微小扰动欺骗模型做出错误预测,可能影响自动驾驶、医疗等关键领域。主要攻击类型包括规避攻击、投毒攻击和模型反演攻击。防御技术有对抗训练、防御性蒸馏等。Python中可使用CleverHans、ART等工具库实现攻击和防御。实验显示,模型在原始MNIST数据上准确率达98.5%,但在对抗样本上骤降至35.2%,证实了对抗性攻击的有效性。

目录

机器学习 - 对抗性机器学习

Python 实现

步骤 1:安装 ART 包

步骤 2:编写代码实现

代码说明

输出结果


机器学习 - 对抗性机器学习

对抗性机器学习是机器学习的一个子领域,专注于研究机器学习模型在对抗性攻击面前的脆弱性。对抗性攻击是指通过在输入数据中引入微小扰动,蓄意欺骗机器学习模型的行为。这些扰动通常人类无法察觉,但却能导致模型以高置信度做出错误预测。在自动驾驶、安全系统和医疗保健等实际应用场景中,对抗性攻击可能会引发严重后果。

对抗性攻击主要分为以下几种类型:

  • 规避攻击(Evasion attacks):这类攻击旨在操纵输入数据,导致模型对其进行错误分类。规避攻击可分为靶向攻击(攻击者明确知晓目标类别)和非靶向攻击(攻击者仅希望引发错误分类)。
  • 投毒攻击(Poisoning attacks):这类攻击旨在操纵训练数据,使模型偏向特定类别或降低其整体准确率。投毒攻击包括数据投毒(攻击者修改训练数据)和模型投毒(攻击者直接修改模型本身)两种形式。
  • 模型反演攻击(Model inversion attacks):这类攻击通过观察模型的输出结果,推断训练数据或模型本身的敏感信息。

为抵御对抗性攻击,研究人员提出了多种防御技术:

  • 对抗训练(Adversarial training):该技术通过在训练数据中添加对抗样本,增强模型对 adversarial 攻击的鲁棒性。
  • 防御性蒸馏(Defensive distillation):该技术通过在第一个模型的输出基础上训练第二个模型,提升其对对抗性攻击的抵抗能力。
  • 随机化(Randomization):该技术通过向输入数据或模型参数添加随机噪声,增加攻击者构造对抗样本的难度。
  • 检测与拒绝(Detection and rejection):该技术通过检测对抗样本,在其被模型处理前将其拒绝。

Python 实现

在 Python 中,多个库提供了对抗性攻击与防御的实现,包括:

  • CleverHans:适用于 TensorFlow、Keras 和 PyTorch 的对抗性攻击与防御工具集合。
  • ART(Adversarial Robustness Toolbox,对抗鲁棒性工具箱):提供一套全面的工具,用于评估和防御机器学习模型中的对抗性攻击。
  • Foolbox:适用于 PyTorch、TensorFlow 和 Keras 的对抗性攻击工具集合。

以下示例将使用对抗鲁棒性工具箱(ART)实现对抗性机器学习:

步骤 1:安装 ART 包

首先通过 pip 安装 ART 包:

pip install adversarial-robustness-toolbox

步骤 2:编写代码实现

import tensorflow as tf from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense, Flatten, Conv2D, MaxPooling2D from keras.optimizers import Adam from keras.utils import to_categorical from art.attacks.evasion import FastGradientMethod from art.estimators.classification import KerasClassifier # 禁用 TensorFlow 急切执行模式 tf.compat.v1.disable_eager_execution() # 加载 MNIST 数据集 (x_train, y_train), (x_test, y_test) = mnist.load_data() # 数据预处理 x_train = x_train.reshape(-1, 28, 28, 1).astype('float32') / 255 x_test = x_test.reshape(-1, 28, 28, 1).astype('float32') / 255 y_train = to_categorical(y_train, 10) y_test = to_categorical(y_test, 10) # 定义模型架构 model = Sequential() model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1))) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Flatten()) model.add(Dense(10, activation='softmax')) # 编译模型 model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.001), metrics=['accuracy']) # 使用 ART 的 KerasClassifier 包装模型(使其兼容 ART 攻击) classifier = KerasClassifier(model=model, clip_values=(0, 1), use_logits=False) # 训练模型 classifier.fit(x_train, y_train, epochs=20) # 在测试集上评估模型准确率 accuracy = classifier.evaluate(x_test, y_test)[1] print("测试集准确率: %.2f%%" % (accuracy * 100)) # 使用快速梯度方法(FastGradientMethod)生成对抗样本(最大扰动值 eps=0.1) attack = FastGradientMethod(estimator=classifier, eps=0.1) x_test_adv = attack.generate(x_test) # 在对抗样本上评估模型准确率 accuracy_adv = classifier.evaluate(x_test_adv, y_test)[1] print("对抗样本上的准确率: %.2f%%" % (accuracy_adv * 100))

代码说明

  1. 加载并预处理 MNIST 数据集:将图像数据重塑为 (28, 28, 1) 格式,归一化到 [0, 1] 区间,并将标签转换为独热编码(one-hot encoding)。
  2. 定义模型架构:构建一个简单的卷积神经网络(CNN),包含卷积层、最大池化层、展平层和全连接层。
  3. 编译与包装模型:使用交叉熵损失函数和 Adam 优化器编译模型,并通过 ART 的KerasClassifier包装模型,使其支持对抗性攻击。
  4. 训练与评估:在 MNIST 训练集上训练模型(20 个 epoch),分别在原始测试集和对抗样本上评估模型准确率。
  5. 生成对抗样本:使用快速梯度方法(FastGradientMethod)生成对抗样本,设置最大扰动值eps=0.1(扰动范围控制在 [0, 1] 内)。

输出结果

运行代码后,将得到类似以下的输出(训练过程持续约数分钟,具体耗时取决于硬件性能):

plaintext

Train on 60000 samples Epoch 1/20 60000/60000 [==============================] - 17s 277us/sample - loss: 0.3530 - accuracy: 0.9030 Epoch 2/20 60000/60000 [==============================] - 15s 251us/sample - loss: 0.1296 - accuracy: 0.9636 Epoch 3/20 60000/60000 [==============================] - 18s 300us/sample - loss: 0.0912 - accuracy: 0.9747 Epoch 4/20 60000/60000 [==============================] - 18s 295us/sample - loss: 0.0738 - accuracy: 0.9791 Epoch 5/20 60000/60000 [==============================] - 18s 300us/sample - loss: 0.0654 - accuracy: 0.9809 ...(后续训练日志省略) 测试集准确率: 98.50% 对抗样本上的准确率: 35.20%

输出说明:模型在原始测试集上的准确率可达 98% 以上,但在对抗样本上的准确率大幅下降(通常降至 40% 以下),直观体现了对抗性攻击对模型的影响。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/9 15:44:17

基于python OpenCV的车牌识别计费系统

基于Python OpenCV的车牌识别计费系统设计 第一章 绪论 停车场、高速公路等场景的车牌识别计费是智慧交通的核心应用环节,传统人工计费模式效率低、易出错,而商用车牌识别系统成本高、适配性差,难以满足中小场景的个性化需求。Python语言具…

作者头像 李华
网站建设 2026/3/6 1:19:12

计算机毕业设计之基于springboot的农产品信息管理系统

二十一世纪我们的社会进入了信息时代,信息管理系统的建立,大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多,而在线管理系统刚好能满足这些需求,在线管理系统突破了传统管理方式的局限性。于是本文针对这一需求设…

作者头像 李华
网站建设 2026/3/9 12:50:59

ZYNQ让卫星在太空“换脑”:基于动态部分可重构的星载智能处理革命

想象一下,一颗卫星在轨运行五年后,不是因硬件过时而被淘汰,而是通过“太空换脑手术”获得全新的智能处理能力——这正是动态部分可重构技术为航天领域带来的革命。 当传统卫星发射升空后,它的硬件功能就被永久固定,如同化石般无法进化。而太空环境中的单粒子效应等辐射威胁…

作者头像 李华
网站建设 2026/3/6 6:56:04

告别登录逻辑混乱!基于 SpringBoot 工厂+策略模式统一多端登录

各位开发者好,我是在项目里被登录功能折磨过无数次的老码农。还记得三年前接手一个多端登录项目,用户名密码、微信、手机号验证码三种登录方式挤在一个if-else里,新增支付宝登录时整整改了 17 处代码,最后还漏了一处校验 —— 从此…

作者头像 李华
网站建设 2026/3/5 15:00:08

记录一次MySQL+Redis实现优化百万数据统计的方式

提到历史项目,大家对它的第一印象可能会是数据量大、技术老旧、文档缺失、开发人员断层、"屎山"等。刚好这几天就接到了一个优化老项目的需求,客户反馈页面数据加载缓慢甚至加载不出来,希望能够做一些优化。 刚接到这个任务后真的…

作者头像 李华