机器学习 - 对抗样本



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

有几种类型的对抗攻击,包括:

  • 逃避攻击 - 这些攻击旨在操纵输入数据以导致模型将其错误分类。逃避攻击可以是有针对性的,攻击者知道目标类别;也可以是非针对性的,攻击者只想导致错误分类。

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

  • 模型反演攻击 - 这些攻击旨在通过观察模型的输出,推断有关训练数据或模型本身的敏感信息。

为了防御对抗攻击,研究人员提出了一些技术,包括:

  • 对抗训练 - 此技术包括使用对抗样本增强训练数据,以使模型更能抵抗对抗攻击。

  • 防御性蒸馏 - 此技术涉及训练第二个模型来学习第一个模型的输出,使其更能抵抗对抗攻击。

  • 随机化 - 此技术包括向输入数据或模型参数添加随机噪声,以使攻击者更难以创建对抗样本。

  • 检测和拒绝 - 此技术包括检测对抗样本并在它们被模型处理之前将其拒绝。

Python 实现

在 Python 中,一些库提供了对抗攻击和防御的实现,包括:

  • CleverHans - 此库为 TensorFlow、Keras 和 PyTorch 提供了对抗攻击和防御的集合。

  • ART(对抗鲁棒性工具箱) - 此库提供了一套全面的工具,用于评估和防御机器学习模型中的对抗攻击。

  • Foolbox - 此库为 PyTorch、TensorFlow 和 Keras 提供了对抗攻击的集合。

在下面的示例中,我们将使用对抗鲁棒性工具箱 (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()

# Load the MNIST dataset
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# Preprocess the 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)

# Define the model architecture
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'))

# Compile the model
model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.001), metrics=['accuracy'])

# Wrap the model with ART KerasClassifier
classifier = KerasClassifier(model=model, clip_values=(0, 1), use_logits=False)

# Train the model
classifier.fit(x_train, y_train)

# Evaluate the model on the test set
accuracy = classifier.evaluate(x_test, y_test)[1]
print("Accuracy on test set: %.2f%%" % (accuracy * 100))

# Generate adversarial examples using the FastGradientMethod attack
attack = FastGradientMethod(estimator=classifier, eps=0.1)
x_test_adv = attack.generate(x_test)

# Evaluate the model on the adversarial examples
accuracy_adv = classifier.evaluate(x_test_adv, y_test)[1]
print("Accuracy on adversarial examples: %.2f%%" % (accuracy_adv * 100))

在此示例中,我们首先加载并预处理 MNIST 数据集。然后,我们定义一个简单的卷积神经网络 (CNN) 模型,并使用分类交叉熵损失和 Adam 优化器对其进行编译。

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

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

输出

执行此代码时,将生成以下输出:

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
广告