FGSM kullanan muhalif örnek

TensorFlow.org'da görüntüleyin Google Colab'da çalıştırın Kaynağı GitHub'da görüntüleyin Not defterini indir

Bu öğretici, Goodfellow ve diğerleri tarafından hazırlanan Çelişkili Örnekleri Açıklama ve Harnessing'de açıklandığı gibi Fast Gradient Signed Method (FGSM) saldırısını kullanarak bir rakip örnek oluşturur. Bu, bir sinir ağını kandırmak için yapılan ilk ve en popüler saldırılardan biriydi.

Karşıt örnek nedir?

Olumsuz örnekler, bir sinir ağını karıştırmak amacıyla oluşturulan ve belirli bir girdinin yanlış sınıflandırılmasına neden olan özel girdilerdir. Bu kötü şöhretli girdiler insan gözüyle ayırt edilemez, ancak ağın görüntünün içeriğini tanımlayamamasına neden olur. Bu tür saldırıların birkaç türü vardır, ancak burada odak noktası, amacı yanlış sınıflandırmayı sağlamak olan beyaz kutu saldırısı olan hızlı gradyan işareti yöntemi saldırısıdır. Beyaz kutu saldırısı, saldırganın saldırıya uğrayan modele tam erişiminin olduğu yerdir. Aşağıda gösterilen muhalif bir görüntünün en ünlü örneklerinden biri, yukarıda bahsedilen makaleden alınmıştır.

Düşman Örneği

Burada, bir panda görüntüsünden başlayarak, saldırgan orijinal görüntüye küçük bozulmalar (bozulmalar) ekler, bu da modelin bu görüntüyü yüksek bir güvenle jibon olarak etiketlemesine neden olur. Bu pertürbasyonları ekleme işlemi aşağıda açıklanmıştır.

Hızlı gradyan işareti yöntemi

Hızlı gradyan işareti yöntemi, rakip bir örnek oluşturmak için sinir ağının gradyanlarını kullanarak çalışır. Bir girdi görüntüsü için yöntem, kaybı en üst düzeye çıkaran yeni bir görüntü oluşturmak için girdi görüntüsüne göre kaybın gradyanlarını kullanır. Bu yeni görüntü, muhalif görüntü olarak adlandırılır. Bu, aşağıdaki ifade kullanılarak özetlenebilir:

\[adv\_x = x + \epsilon*\text{sign}(\nabla_xJ(\theta, x, y))\]

nerede

  • adv_x : Düşmanca görüntü.
  • x : Orijinal giriş görüntüsü.
  • y : Orijinal giriş etiketi.
  • \(\epsilon\) : Pertürbasyonların küçük olmasını sağlamak için çarpan.
  • \(\theta\) : Model parametreleri.
  • \(J\) : Kayıp.

Buradaki ilgi çekici bir özellik, gradyanların giriş görüntüsüne göre alınmasıdır. Bu yapılır çünkü amaç, kaybı en üst düzeye çıkaran bir görüntü oluşturmaktır. Bunu başarmanın bir yöntemi, görüntüdeki her pikselin kayıp değerine ne kadar katkıda bulunduğunu bulmak ve buna göre bir pertürbasyon eklemektir. Bu oldukça hızlı çalışır çünkü zincir kuralını kullanarak ve gerekli gradyanları bularak her bir giriş pikselinin kayba nasıl katkıda bulunduğunu bulmak kolaydır. Bu nedenle, gradyanlar görüntüye göre alınır. Ek olarak, model artık eğitilmediğinden (böylece gradyan, eğitilebilir değişkenlere, yani model parametrelerine göre alınmaz) ve bu nedenle model parametreleri sabit kalır. Tek amaç, zaten eğitilmiş bir modeli kandırmaktır.

Öyleyse önceden eğitilmiş bir modeli kandırmaya çalışalım. Bu eğitimde model, ImageNet üzerinde önceden eğitilmiş MobileNetV2 modelidir .

import tensorflow as tf
import matplotlib as mpl
import matplotlib.pyplot as plt

mpl.rcParams['figure.figsize'] = (8, 8)
mpl.rcParams['axes.grid'] = False

Önceden eğitilmiş MobileNetV2 modelini ve ImageNet sınıf adlarını yükleyelim.

pretrained_model = tf.keras.applications.MobileNetV2(include_top=True,
                                                     weights='imagenet')
pretrained_model.trainable = False

# ImageNet labels
decode_predictions = tf.keras.applications.mobilenet_v2.decode_predictions
Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/mobilenet_v2/mobilenet_v2_weights_tf_dim_ordering_tf_kernels_1.0_224.h5
14540800/14536120 [==============================] - 0s 0us/step
14548992/14536120 [==============================] - 0s 0us/step
-yer tutucu7 l10n-yer
# Helper function to preprocess the image so that it can be inputted in MobileNetV2
def preprocess(image):
  image = tf.cast(image, tf.float32)
  image = tf.image.resize(image, (224, 224))
  image = tf.keras.applications.mobilenet_v2.preprocess_input(image)
  image = image[None, ...]
  return image

# Helper function to extract labels from probability vector
def get_imagenet_label(probs):
  return decode_predictions(probs, top=1)[0][0]

Gerçek görüntü

Wikimedia Common'dan Mirko CC-BY-SA 3.0 Labrador Retriever'in örnek bir görüntüsünü kullanalım ve ondan çekişmeli örnekler oluşturalım. İlk adım, MobileNetV2 modeline bir girdi olarak beslenebilmesi için ön işleme tabi tutmaktır.

image_path = tf.keras.utils.get_file('YellowLabradorLooking_new.jpg', 'https://storage.googleapis.com/download.tensorflow.org/example_images/YellowLabradorLooking_new.jpg')
image_raw = tf.io.read_file(image_path)
image = tf.image.decode_image(image_raw)

image = preprocess(image)
image_probs = pretrained_model.predict(image)
tutucu9 l10n-yer
Downloading data from https://storage.googleapis.com/download.tensorflow.org/example_images/YellowLabradorLooking_new.jpg
90112/83281 [================================] - 0s 0us/step
98304/83281 [===================================] - 0s 0us/step

Şimdi görüntüye bir göz atalım.

plt.figure()
plt.imshow(image[0] * 0.5 + 0.5)  # To change [-1, 1] to [0,1]
_, image_class, class_confidence = get_imagenet_label(image_probs)
plt.title('{} : {:.2f}% Confidence'.format(image_class, class_confidence*100))
plt.show()
tutucu11 l10n-yer
Downloading data from https://storage.googleapis.com/download.tensorflow.org/data/imagenet_class_index.json
40960/35363 [==================================] - 0s 0us/step
49152/35363 [=========================================] - 0s 0us/step

png

Düşman imajını yaratın

Hızlı gradyan işareti yöntemini uygulama

İlk adım, orijinal görüntüyü bozmak için kullanılacak ve rakip bir görüntüyle sonuçlanacak rahatsızlıklar yaratmaktır. Belirtildiği gibi, bu görev için gradyanlar görüntüye göre alınır.

loss_object = tf.keras.losses.CategoricalCrossentropy()

def create_adversarial_pattern(input_image, input_label):
  with tf.GradientTape() as tape:
    tape.watch(input_image)
    prediction = pretrained_model(input_image)
    loss = loss_object(input_label, prediction)

  # Get the gradients of the loss w.r.t to the input image.
  gradient = tape.gradient(loss, input_image)
  # Get the sign of the gradients to create the perturbation
  signed_grad = tf.sign(gradient)
  return signed_grad

Ortaya çıkan bozulmalar da görselleştirilebilir.

# Get the input label of the image.
labrador_retriever_index = 208
label = tf.one_hot(labrador_retriever_index, image_probs.shape[-1])
label = tf.reshape(label, (1, image_probs.shape[-1]))

perturbations = create_adversarial_pattern(image, label)
plt.imshow(perturbations[0] * 0.5 + 0.5);  # To change [-1, 1] to [0,1]

png

Bunu farklı epsilon değerleri için deneyelim ve ortaya çıkan görüntüyü gözlemleyelim. Epsilon'un değeri arttıkça ağı kandırmanın kolaylaştığını fark edeceksiniz. Bununla birlikte, bu, karışıklıkların daha tanımlanabilir hale gelmesine neden olan bir değiş tokuş olarak gelir.

def display_images(image, description):
  _, label, confidence = get_imagenet_label(pretrained_model.predict(image))
  plt.figure()
  plt.imshow(image[0]*0.5+0.5)
  plt.title('{} \n {} : {:.2f}% Confidence'.format(description,
                                                   label, confidence*100))
  plt.show()
tutucu15 l10n-yer
epsilons = [0, 0.01, 0.1, 0.15]
descriptions = [('Epsilon = {:0.3f}'.format(eps) if eps else 'Input')
                for eps in epsilons]

for i, eps in enumerate(epsilons):
  adv_x = image + eps*perturbations
  adv_x = tf.clip_by_value(adv_x, -1, 1)
  display_images(adv_x, descriptions[i])

png

png

png

png

Sonraki adımlar

Artık düşman saldırıları hakkında bilgi sahibi olduğunuza göre, bunu farklı veri kümelerinde ve farklı mimarilerde deneyin. Ayrıca kendi modelinizi oluşturup eğitebilir ve ardından aynı yöntemi kullanarak onu kandırmaya çalışabilirsiniz. Ayrıca, epsilon'u değiştirdikçe tahminlerdeki güvenin nasıl değiştiğini deneyebilir ve görebilirsiniz.

Güçlü olmasına rağmen, bu eğitimde gösterilen saldırı, düşman saldırılarına yönelik araştırmaların yalnızca başlangıcıydı ve o zamandan beri daha güçlü saldırılar oluşturan çok sayıda makale var. Rakip saldırılara ek olarak, araştırmalar, sağlam makine öğrenimi modelleri oluşturmayı amaçlayan savunmaların oluşturulmasına da yol açmıştır. Kapsamlı bir düşmanca saldırı ve savunma listesi için bu anket belgesini inceleyebilirsiniz .

Düşman saldırıları ve savunmalarının daha birçok uygulaması için, CleverHans rakip örnek kitaplığını görmek isteyebilirsiniz.