机器学习中对抗样本是怎么回事?怎么生成和防御?

文章导读
Previous Quiz Next 对抗性机器学习是机器学习的一个子领域,专注于研究机器学习模型对对抗攻击的脆弱性。对抗攻击是通过在输入数据中引入微小扰动来故意欺骗机器学习模型的尝试。这些扰动通常对人类来说是难以察觉的,但它们可以导致模型以高置信度做出错误预测。在现实世界应
📋 目录
  1. Python 中的实现
A A

机器学习 - 对抗性



Previous
Quiz
Next

对抗性机器学习是机器学习的一个子领域,专注于研究机器学习模型对对抗攻击的脆弱性。对抗攻击是通过在输入数据中引入微小扰动来故意欺骗机器学习模型的尝试。这些扰动通常对人类来说是难以察觉的,但它们可以导致模型以高置信度做出错误预测。在现实世界应用中,如自动驾驶、安全系统和医疗保健等领域,对抗攻击可能带来严重后果。

对抗攻击有多种类型,包括 −

  • Evasion attacks − 这些攻击旨在操纵输入数据,导致模型对其进行错误分类。Evasion attacks 可以是 targeted(目标导向)的,此时攻击者知道目标类别;也可以是 untargeted(非目标导向)的,此时攻击者仅希望引起误分类。

  • Poisoning attacks − 这些攻击旨在操纵训练数据,使模型偏向特定类别或降低其整体准确性。Poisoning attacks 可以是 data poisoning(数据投毒),攻击者修改训练数据;也可以是 model poisoning(模型投毒),攻击者修改模型本身。

  • Model inversion attacks − 这些攻击旨在通过观察模型的输出,推断训练数据或模型本身的敏感信息。

为了防御对抗攻击,研究人员提出了多种技术,包括 −

  • Adversarial training − 该技术通过在训练数据中添加对抗样本来增强模型,使其对对抗攻击更具鲁棒性。

  • Defensive distillation − 该技术通过使用第一个模型的输出训练第二个模型,使其对对抗攻击更具抵抗力。

  • Randomization − 该技术通过向输入数据或模型参数添加随机噪声,使攻击者更难构造对抗样本。

  • Detection and rejection − 该技术涉及检测对抗样本,并在模型处理之前拒绝它们。

Python 中的实现

在 Python 中,有几个库提供了对抗攻击和防御的实现,包括 −

  • CleverHans − 该库为 TensorFlow、Keras 和 PyTorch 提供了一系列对抗攻击和防御。

  • ART (Adversarial Robustness Toolbox) − 该库提供了一套全面的工具,用于评估和防御机器学习模型中的对抗攻击。

  • Foolbox − 该库为 PyTorch、TensorFlow 和 Keras 提供了一系列对抗攻击。

在下面的示例中,我们将使用 Adversarial Robustness Toolbox (ART) 来实现对抗机器学习 −

首先,我们需要使用 pip 安装 ART 包 −

pip install adversarial-robustness-toolbox

然后,我们可以使用 ART 库在预训练模型上创建一个对抗样本。

示例 - 对抗攻击

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

import tensorflow as tf
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 包装模型
classifier = KerasClassifier(model=model, clip_values=(0, 1), use_logits=False)

# 训练模型
classifier.fit(x_train, y_train)

# 在测试集上评估模型
accuracy = classifier.evaluate(x_test, y_test)[1]
print("Accuracy on test set: %.2f%%" % (accuracy * 100))

# 使用 FastGradientMethod 攻击生成对抗样本
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("Accuracy on adversarial examples: %.2f%%" % (accuracy_adv * 100))

在这个示例中,我们首先加载并预处理 MNIST 数据集。然后,我们定义一个简单的卷积神经网络 (CNN) 模型,并使用 categorical cross-entropy 损失函数和 Adam 优化器进行编译。

我们使用 ART KerasClassifier 包装模型,使其与 ART 攻击兼容。然后,我们在训练集上训练模型 10 个 epoch,并在测试集上评估它。

接下来,我们使用 FastGradientMethod 攻击生成最大扰动为 0.1 的对抗样本。最后,我们在对抗样本上评估模型。

输出

当你执行这段代码时,它将产生以下输出 −

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
-------continue