적대적 예 - 비표적 회피 공격

개요



이 기사에서는 Adversarial Examples를 사용하여 비표적 공격을 연습합니다.
적대적 사례는 원본 데이터에 섭동(perturbation)이라는 미세한 변화를 추가하여 의도적으로 기능을 변경하여 AI 오분류를 유도하는 공격입니다.
이러한 섭동은 사람의 눈으로 포착하기에는 너무 작아서 적대적인 예를 데이터와 구별하기가 매우 어렵습니다.
Adversarial Example에는 두 가지 유형이 있습니다. 임의의 클래스로 오분류하는 untargeted와 특정 클래스로 오분류하는 target이 있습니다.

사전 준비



여기에서 일부 라이브러리를 가져와야 합니다.
이 기사에서는 keras로 이미지 분류기 모델을 빌드합니다.

#Install ART
#ART is The Adversarial Robustness Toolbox (ART) is a Python library for AI security.
With ART, you can validate attack methods against the AI (e.g., Adversarial Examples, Data Poisoning, Model Extraction, Membership Inference, etc.) and defense methods against them. In order to protect AI from attacks, it is necessary to understand the attack mechanisms and appropriate defense methods. Therefore, in this column, I will learn techniques to secure AI through ART!

!pip3 install adversarial-robustness-toolbox

#Import Library
import random
import numpy as np
import matplotlib.pyplot as plt

# TensorFlow with Keras.
import tensorflow as tf
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Dense, Flatten, Conv2D
from tensorflow.keras.layers import MaxPooling2D, GlobalAveragePooling2D, Dropout
tf.compat.v1.disable_eager_execution()

# ART
import art
from art.attacks.evasion import FastGradientMethod
from art.estimators.classification import KerasClassifier


데이터 세트



대상 데이터 세트로 CIFAR10 데이터 세트를 사용합니다. CIFAR-10은 물체 인식에 사용되는 확립된 컴퓨터 비전 데이터 세트입니다. 8000만 작은 이미지 데이터 세트의 하위 집합이며 클래스당 6000개의 이미지가 있는 10개의 객체 클래스 중 하나를 포함하는 60,000개의 32x32 컬러 이미지로 구성됩니다. Alex Krizhevsky, Vinod Nair 및 Geoffrey Hinton이 수집했습니다.

Load CIFAR10
(X_train, y_train), (X_test, y_test) = tf.keras.datasets.cifar10.load_data()

# Get CIFAR10 Label
classes = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
num_classes = len(classes)

#Visualize Dataset 
show_images = []
for _ in range(5 * 5):
    show_images.append(X_train[random.randint(0, len(X_train))])

for idx, image in enumerate(show_images):
    plt.subplot(5, 5, idx + 1)
    plt.imshow(image)

# Check Dataset Size
print(X_train.shape, y_train.shape)



(50000, 32, 32, 3) (50000, 1)

전처리



데이터 세트를 정규화하고 각 레이블을 One-hot-vector로 변환합니다.

#Normalization
X_train = X_train.astype('float32') / 255
X_test = X_test.astype('float32') / 255

# Convert label to One-hot-vector
y_train = tf.keras.utils.to_categorical(y_train, num_classes)
y_test = tf.keras.utils.to_categorical(y_test, num_classes)


목표 모델 구축



다음으로 대상 이미지 분류기를 빌드합니다. 이 기사에서는 CNN(Convolution Neural Network)을 정의합니다.

# Model Definition
inputs = Input(shape=(32, 32, 3))
x = Conv2D(64, (3, 3), padding='SAME', activation='relu')(inputs)
x = Conv2D(64, (3, 3), padding='SAME', activation='relu')(x)
x = Dropout(0.25)(x)
x = MaxPooling2D()(x)

x = Conv2D(128, (3,3), padding='SAME', activation='relu')(x)
x = Conv2D(128, (3,3), padding='SAME', activation='relu')(x)
x = Dropout(0.25)(x)
x = MaxPooling2D()(x)

x = Conv2D(256, (3,3), padding='SAME', activation='relu')(x)
x = Conv2D(256, (3,3), padding='SAME', activation='relu')(x)
x = GlobalAveragePooling2D()(x)

x = Dense(1024, activation='relu')(x)
x = Dropout(0.25)(x)
y = Dense(10, activation='softmax')(x)

model = Model(inputs, y)

# MODEL COMPILE
model.compile(optimizer=tf.keras.optimizers.Adam(),
              loss='categorical_crossentropy',
              metrics=['accuracy'])
model.summary()


기차 모형



다음으로 X_train 및 y_train을 사용하여 이미지 분류기를 훈련합니다. 그런 다음 GPU로 데이터 세트를 훈련하는 것이 좋습니다.

model.fit(X_train, y_train,
          batch_size=512,
          epochs=30,
          validation_data=(X_test, y_test),
          shuffle=True)


평가 정확도



테스트 데이터 X_test를 사용하여 생성된 이미지 분류기의 추론 정확도를 평가합니다. 아래 코드를 구현하면 정확도가 약 80%임을 알 수 있습니다.

predictions = model.predict(X_test)
accuracy = np.sum(np.argmax(predictions, axis=1) == np.argmax(y_test, axis=1)) / len(y_test)
print('Accuracy on benign test example: {}%'.format(accuracy * 100))


양성 검사 예에 대한 정확도: 81.11%
완료.

적대적 사례 만들기



ART에서 Adversarial Examples를 생성하기 위해서는 대상 분류자가 ART에서 제공하는 래퍼 클래스에 래핑되어야 합니다. 이 글에서는 이미 모델을 구축하는데 케라스를 사용했기 때문에 케라스클래스파이어를 사용합니다.

#Set min and max about feature of input data
#Features are normalized to fit into the range of 0.0 to 1.0, so that the minimum value is 0.0 and the maximum value is 1.0.
min_pixel_value = 0.0
max_pixel_value = 1.0

#Wrap model with ART Keras Classifier
classifier = KerasClassifier(model=model, clip_values=(min_pixel_value, max_pixel_value), use_logits=False)


FGSM 구현



FastGradientMethod 인수에 필요한 인수를 지정하기만 하면 Adversarial Examples를 만들 수 있습니다.
공격의 성공률(오분류 유발 확률)은 두 번째 인수에서 지정한 eps 값에 비례하여 증가하지만 이미지가 부자연스럽게 보일 것입니다(노이즈 증가로 인해).
따라서 공격의 성공률과 Adversarial Examples의 시각적 자연스러움 사이에는 트레이드오프가 있습니다.

나는 Adversarial Examples를 생성하기 위해 FGSM 인스턴스의 생성 방법을 사용합니다.

#Create FGSM Instance
attack = FastGradientMethod(estimator=classifier, eps=0.1)

#Create Adversarial Examples
X_test_adv = attack.generate(x=X_test)


예측 구현




all_preds = model.predict(X_test_adv)
accuracy = np.sum(np.argmax(all_preds, axis=1) == np.argmax(y_test, axis=1)) / len(y_test)
print('Accuracy on Adversarial Exmaples: {}%'.format(accuracy * 100))


적대적 예에 대한 정확도: 20.349999999999998%
완료.

일반 테스트 데이터의 경우에 비해 추론 정확도가 현저히 떨어지는 것을 볼 수 있습니다.
나는 이 결과로부터 적대적 표본에 의해 오분류가 유발되었음을 유추할 수 있다.

다음으로 정상 샘플과 적대적 샘플의 추론 결과를 육안으로 확인합니다.
먼저 정상적인 데이터를 추론합니다.

# [1-13]
# Show normal data
target_index = 2
plt.imshow(X_test[target_index])

#Predict normal data
pred = model.predict(X_test[target_index][np.newaxis, ...])

#Show prediction result
print('True label: "{}"\nPrediction: "{}"'.format(classes[np.argmax(y_test[target_index])], classes[np.argmax(pred)]))




표시된 이미지는 이미지 분류기에 입력된 일반 데이터입니다.
아마도 실제 레이블 True 레이블과 이미지 분류기의 Prediction 레이블 Prediction은 동일할 것입니다.

그런 다음 적대적인 샘플을 추론합니다.

# [1-14]
# Show Adversarial Examples
plt.imshow(X_test_adv[target_index])

# Predict Adversarial Examples
pred_adv = model.predict(X_test_adv[target_index][np.newaxis, ...])

# Show prediction result
print('True label: "{}"\nPrediction: "{}"'.format(classes[np.argmax(y_test[target_index])], classes[np.argmax(pred_adv)]))




표시되는 이미지는 이미지 분류기에 입력된 적대적인 샘플입니다.
섭동으로 인해 이미지에 노이즈가 있지만 실제 레이블이 표시하는 이미지처럼 보입니다.
그러나 실제 True 레이블과 이미지 분류기의 예측 레이블 예측이 동일하다고 생각하지 않습니다.

결론



"1부: 비표적 회피 공격"이라는 제목의 이 실습에서는 ART를 사용하여 임의 클래스로 잘못 분류된 적대적 샘플을 만들었습니다.
ART를 사용하면 적은 양의 코드로 적대적인 샘플을 만들 수 있다는 것을 알게 되었습니다.

좋은 웹페이지 즐겨찾기