مثال عدائي باستخدام ختان الإناث

عرض على TensorFlow.org تشغيل في Google Colab عرض المصدر على جيثب تحميل دفتر

يُنشئ هذا البرنامج التعليمي مثالًا عدائيًا باستخدام هجوم أسلوب التدرج السريع المُوقَّع (FGSM) كما هو موصوف في شرح أمثلة الخصومة وتسخيرها بواسطة Goodfellow et al . كانت هذه واحدة من أولى الهجمات وأكثرها شيوعًا لخداع الشبكة العصبية.

ما هو مثال العداء؟

أمثلة الخصومة هي مدخلات متخصصة تم إنشاؤها بغرض إرباك الشبكة العصبية ، مما يؤدي إلى سوء تصنيف أحد المدخلات. هذه المدخلات سيئة السمعة لا يمكن تمييزها بالعين البشرية ، ولكنها تتسبب في فشل الشبكة في تحديد محتويات الصورة. هناك عدة أنواع من هذه الهجمات ، ومع ذلك ، ينصب التركيز هنا على هجوم أسلوب التدرج السريع ، وهو هجوم الصندوق الأبيض الذي يهدف إلى ضمان سوء التصنيف. هجوم الصندوق الأبيض هو المكان الذي يتمتع فيه المهاجم بإمكانية الوصول الكامل إلى النموذج الذي يتم مهاجمته. أحد أشهر الأمثلة على صورة الخصومة الموضحة أدناه مأخوذ من الورقة المذكورة أعلاه.

مثال عدائي

هنا ، بدءًا من صورة الباندا ، يضيف المهاجم اضطرابات صغيرة (تشوهات) إلى الصورة الأصلية ، مما ينتج عنه تسمية النموذج لهذه الصورة على أنها جيبون ، بثقة عالية. يتم شرح عملية إضافة هذه الاضطرابات أدناه.

طريقة تسجيل التدرج السريع

تعمل طريقة علامة التدرج السريع باستخدام تدرجات الشبكة العصبية لإنشاء مثال عدائي. بالنسبة لصورة الإدخال ، تستخدم الطريقة تدرجات الخسارة فيما يتعلق بالصورة المدخلة لإنشاء صورة جديدة تزيد من الخسارة. هذه الصورة الجديدة تسمى صورة الخصومة. يمكن تلخيص ذلك باستخدام التعبير التالي:

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

أين

  • adv_x: صورة عدائية.
  • x: صورة الإدخال الأصلية.
  • y: تسمية الإدخال الأصلية.
  • \(\epsilon\) : مُضاعِف لضمان أن الاضطرابات صغيرة.
  • \(\theta\) : معلمات النموذج.
  • \(J\) : خسارة.

خاصية مثيرة للاهتمام هنا ، هي حقيقة أن التدرجات مأخوذة فيما يتعلق بالصورة المدخلة. يتم ذلك لأن الهدف هو إنشاء صورة تزيد من الخسارة. تتمثل إحدى طرق تحقيق ذلك في معرفة مقدار مساهمة كل بكسل في الصورة في قيمة الخسارة ، وإضافة الاضطراب وفقًا لذلك. يعمل هذا بسرعة كبيرة لأنه من السهل العثور على كيفية مساهمة كل بكسل إدخال في الخسارة باستخدام قاعدة السلسلة وإيجاد التدرجات المطلوبة. ومن ثم ، يتم أخذ التدرجات فيما يتعلق بالصورة. بالإضافة إلى ذلك ، نظرًا لأن النموذج لم يعد يتم تدريبه (وبالتالي لم يتم أخذ التدرج فيما يتعلق بالمتغيرات القابلة للتدريب ، أي معلمات النموذج) ، وبالتالي تظل معلمات النموذج ثابتة. الهدف الوحيد هو خداع نموذج مدرب بالفعل.

لذلك دعونا نحاول خداع نموذج تم اختباره مسبقًا. في هذا البرنامج التعليمي ، النموذج هو MobileNetV2 ، تم اختباره مسبقًا على ImageNet .

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

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

لنقم بتحميل نموذج MobileNetV2 المدروس مسبقًا وأسماء فئة ImageNet.

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
# 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]

الصورة الأصلية

دعونا نستخدم عينة من صورة لابرادور ريتريفر Mirko CC-BY-SA 3.0 من ويكيميديا ​​كومون وننشئ أمثلة معادية منها. تتمثل الخطوة الأولى في معالجته مسبقًا بحيث يمكن تغذيته كمدخل إلى نموذج MobileNetV2.

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

دعونا نلقي نظرة على الصورة.

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()
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

بي إن جي

قم بإنشاء الصورة العدائية

تنفيذ طريقة تسجيل التدرج السريع

تتمثل الخطوة الأولى في إنشاء اضطرابات تُستخدم لتشويه الصورة الأصلية مما يؤدي إلى صورة معادية. كما ذكرنا ، بالنسبة لهذه المهمة ، يتم أخذ التدرجات بالنسبة للصورة.

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

يمكن أيضًا تصور الاضطرابات الناتجة.

# 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]

بي إن جي

دعنا نجرب هذا لقيم مختلفة من إبسيلون ونلاحظ الصورة الناتجة. ستلاحظ أنه مع زيادة قيمة epsilon ، يصبح خداع الشبكة أسهل. ومع ذلك ، يأتي هذا كمقايضة تؤدي إلى زيادة تحديد الاضطرابات.

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()
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])

بي إن جي

بي إن جي

بي إن جي

بي إن جي

الخطوات التالية

الآن بعد أن تعرفت على الهجمات العدائية ، جرب ذلك على مجموعات بيانات مختلفة وبنيات مختلفة. يمكنك أيضًا إنشاء النموذج الخاص بك وتدريبه ، ثم محاولة خداعه بنفس الطريقة. يمكنك أيضًا محاولة معرفة مدى اختلاف الثقة في التنبؤات أثناء قيامك بتغيير إبسيلون.

على الرغم من قوته ، إلا أن الهجوم الموضح في هذا البرنامج التعليمي كان مجرد بداية للبحث في الهجمات العدائية ، وكانت هناك عدة أوراق بحثية تسببت في هجمات أكثر قوة منذ ذلك الحين. بالإضافة إلى الهجمات العدائية ، أدت الأبحاث أيضًا إلى إنشاء دفاعات تهدف إلى إنشاء نماذج قوية للتعلم الآلي. يمكنك مراجعة ورقة الاستطلاع هذه للحصول على قائمة شاملة بهجمات الخصم والدفاعات.

لمزيد من تطبيقات الهجمات والدفاعات العدائية ، قد ترغب في الاطلاع على مكتبة المثال العدائي CleverHans .