متعة تعلم الأله Machine Learning – الجزء 8

كيفية خداع الشبكات العصبية neural networks

974

ال hackers دائماً ما يسعون لإيجاد ثغرات يخترقون من خلالها البرامج وذلك للقيام بالإستيلاء علي البيانات والتحكم في الأنظمة.

لكن الأنظمة القوية التي تستخدم ال deep learning في أمان لأنها بعيدة عن التحكم البشري. أليس كذلك؟ كيف لل hacker أن يخترق neural network تم تدريبها علي كمات ضخمة من البيانات تصل إلي تُقدر ب terabytes؟

لكن حتي أقوي ال deep neural networks من السهل أن يتم إختراقها. من خلال خدع بسيطة يمكنك جعلها تتوقع النتائج التي ترغب بها:

لذلك قبل أن تستخدم نظامك الجديد يجب أن نتوقف لكي نتعلم ما يجب فعله كي نجعله في أمان أكثر من المخترقين.

 

ال neural networks كأفراد أمن

لتخيل أننا نعمل علي موقع Ebay. في الموقع، نريد أن نمنع الناس أن يبيعوا المنتجات الممنوعة.

ليس من السهل تطبيق هذه القواعد خاصة مع ملايين المستخدمين للموقع. من الممكن أن يتم تعيين آلاف الأشخاص كي يقوموا بذلك لكن الأمر مكلف. في المقابل، يُمكن إستخدام ال deep learning كي يفحص الصور للمنتجات الممنوعة.

هذه مشكلة تصنيف. لكي نبني النموذج، نحتاج إلي تدريب ال deep convolutional neural network لكي تتمكن من التعرف عن المنتجات الممنوعة وبعد ذلك يتم تشغيلها علي كل الصور بالموقع.

أولاً، نحتاج إلي آلاف الصور من الماضي لكل من المنتجاب الموغوب والغير مرغوب فيها لتدريب الشبكة.

لتدريب الشبكة، نستخدم خوارزمية ال back-propagation. هذه الخوارزمية تستطيع تحديث أوزان الشبكة من خلال تعديلها بشكل صغير علي مدار العديد من دورات التدريب حتي تُصبح الشبكة قادرة علي توقع الناتج الصحيح:

نقوم بتكرار تغيير الأوزان عن طريق تلك الخوارزمية حتي يصل النموذج إلي أعلي دقة ممكنة.

الناتج النهائي هو شبكة تستطيع تصنيف الصور بدقة عالية:

 

لكن الأمور لا تسير علي النحو المطلوب

ال convolutional neural networks نماذج قوية تستطيع أخذ الصورة بأكملها في الإعتبار عند التصنيف. تستطيع التعرف علي الأشكال المعقدة والأنماط أينما تكون موجودة في الصورة. حتي أنها تستطيع التغلب علي الإنسان في هذا الأمر.

مع تلك النماذج، تغيير بعض ال pixels لن يؤثر بقوة عليها. أليس كذلك؟ يمكن لذلك أن يؤثر بشكل بسيط لكن لن يصل إلي تغيير الناتج من ممنوع إلي مرغوب.

لكن في بحث مشهور في سنة 2013 يُسمي Intriguing properties of neural networks، تم إكتشاف أن هذا ليس دائماً صحيح. إذا علمت بشكل صحيح ما هي ال pixels التي يجب تغييرها وما هو أثر تغيير قيمها بشكل دقيق يمكنك أن تجعل الشبكة تتوقع الناتج الذي تريده.

هذه يعني أنك تستطيع تحويل الصورة المصنفة علي أنها ممنوعة علي أنها مرغوبة من خلال خداع الشبكة:

لماذا هذا؟ ال machine learning classifier يعمل بالعثور علي الخط الذي يفصل بين الأشياء كما في الصورة التالية حيث أن النقاط الخضراء تعني مقبول والنقاط الحمراء تعني ممنوع:

ال classifier يعمل الآن بدقة 100% حيث قام بإيجاد الخط الذي يفصل بين النقاط الخضراء والحمراء.

كاذا لو قمنا بخداعه حتي يقوم بتصنيف خاطئ لنقطة حمراء؟ ما هو أقل كمية يُمكننا تحريك النقطة الحمراء من مكانها حتي تتواجد في مكان النقاط الخضراء؟

إذا أضفنا كمية صغيرة علي قيمة ال Y في النقاط الحمراء، يمكننا أن ندفع النقطة الحمراء إلي الجزء الأخضر:

لكي تخدع ال classifier عليك فقط بمعرفة إتجاه الحركة للنقطة. ولكي لا يكون الأمر غريباً، يمكن فقط إضافة أقل كمية علي النقطة الحمراء التي تسمح لها بأن تتواجد في المنطقة الخضراء.

في تصنيف الصور بإستخدام ال deep neural networks، كل نقطة نقوم بتصنيفها هي عبارة عن صورة كاملة تتكون من آلاف ال pixels. هذه يُعطينا آلاف القيم التي يمكن تغييرها. إذا قمنا بمعرفة أي pixels يمكننا تغييرها في الصورة حتي لا يبدو تغييراً كبيراً علي الصورة يلحظة للإنسان، فيمكنا أن نخدع ال classifier.

بمعني آخر، يمكننا تغيير ال pixels لكائن داخل الصورة حتي تنخدع الشبكة في تصنيفه.

 

كيف أن نخدع ال neural network؟

تحدثنا عن العملية الأساسية لتدريب شبكة لتصنيف الصور:

  1. تغذية صور التدريب.
  2. إختبار الشبكة ومعرفة إذا كان التوقع صحيح.
  3. تغيير الأوزان بإستخدام ال back-propagation حتي الحصول علي الناتج الأأقرب للصواب.
  4. تكرار الخطوات 1 إلي 3 عدة الآلاف من المرات ببيانات تدريب محتلفة.

 

لكن ماذا إذا ما قمنا بتغيير الصور بدلاً من تغيير الأوزان حتي نصل إلي الناتج المطلوب؟

لنقوم بإعادة تدريب شبكة مدربة بالفعل. لكن سنستخدم ال back-propagation لتغيير المدخلات بدلاً من تغيير الأوزان:

ها هي الخوارزمية الجديد:

  1. تغذية الصورة إلي الشبكة.
  2. إختبار الشبكة ومعرفة مدي بعد الناتج المتوقع عن الصحيح.
  3. تغيير الصورة نفسها بإستخدام ال back-propagation حتي نصل إلي الناتج الأقرب للصحيح.
  4. تكرار الخطوات من 1 إلي 4 حتي نصل إلي الناتج الصحيح علي تلك الصور.

 

في النهاية نحصل علي صورة جديدة ببعض التغييرات حتي نجعل الشبكة تتوقع الناتج الصحيح بدون تغيير الشبكة نفسها.

المشكلة الوحيدة أنه بتغيير أي مجموعة pixels يمكن ملاحطة تلك التغيير في الصورة الناتجة. هذا واضح من خلال الأجزاء الملونة في الصورة التالية:

لمنع تلك التشويهات بالصورة، نضع شرط. الشرط هو عدم تغيير قيم ال pixels داخل الصورة إلا بكمية قليلة مثل 0.01% حتي لا يتم ملاحظتها في الناتج النهائي.

هذه هي الصورة الجديدة بعض تطبيق هذا الشرط:

الصورة تبدو كأنها بدون تغييرات لكنها قامت بخداع الشبكة.

 

لنقوم ببرمجة ذلك

نحتاج في البداية إلي شبكة مدربة بالفعل لكي نقوم بخداعها.

إطار Keras يوجد به العديد من الشبكات المدربة مسبقاً. سنستخدم نسخة من Google’s Inception v3 deep neural network والتي تم تدريبها من خلال 1000 نوع مختلف من الكائنات.

هذا هو الكود الأساسي في ال Keras للتعرف علي الصور بإستخدام الشبكة. تأكد من أن ال Python 3 وال Keras موجودين بالفعل في بيئة العمل:

import numpy as np
	from keras.preprocessing import image
	from keras.applications import inception_v3
	

	# Load pre-trained image recognition model
	model = inception_v3.InceptionV3()
	

	# Load the image file and convert it to a numpy array
	img = image.load_img("cat.png", target_size=(299, 299))
	input_image = image.img_to_array(img)
	

	# Scale the image so all pixel intensities are between [-1, 1] as the model expects
	input_image /= 255.
	input_image -= 0.5
	input_image *= 2.
	

	# Add a 4th dimension for batch size (as Keras expects)
	input_image = np.expand_dims(input_image, axis=0)
	

	# Run the image through the neural network
	predictions = model.predict(input_image)
	

	# Convert the predictions into text and print them
	predicted_classes = inception_v3.decode_predictions(predictions, top=1)

بعد التشغيل، يتوقع الصورة علي أنها Persian cat:

$ python3 predict.py

This is a Persian_cat with 85.7% confidence!

لنقوم بخداع الشبكة من خلال عمل تغييرات في الصورة.

ال Keras ليس بها وسيلة لتدريب الشبكة بناءً علي الصور المدخلة، لذلك يحب عمل تغييرات في الكود بشكل يدوي.

ها هو الكود:

import numpy as np
	from keras.preprocessing import image
	from keras.applications import inception_v3
	from keras import backend as K
	from PIL import Image
	

	# Load pre-trained image recognition model
	model = inception_v3.InceptionV3()
	

	# Grab a reference to the first and last layer of the neural net
	model_input_layer = model.layers[0].input
	model_output_layer = model.layers[-1].output
	

	# Choose an ImageNet object to fake
	# The list of classes is available here: https://gist.github.com/ageitgey/4e1342c10a71981d0b491e1b8227328b
	# Class #859 is "toaster"
	object_type_to_fake = 859
	

	# Load the image to hack
	img = image.load_img("cat.png", target_size=(299, 299))
	original_image = image.img_to_array(img)
	

	# Scale the image so all pixel intensities are between [-1, 1] as the model expects
	original_image /= 255.
	original_image -= 0.5
	original_image *= 2.
	

	# Add a 4th dimension for batch size (as Keras expects)
	original_image = np.expand_dims(original_image, axis=0)
	

	# Pre-calculate the maximum change we will allow to the image
	# We'll make sure our hacked image never goes past this so it doesn't look funny.
	# A larger number produces an image faster but risks more distortion.
	max_change_above = original_image + 0.01
	max_change_below = original_image - 0.01
	

	# Create a copy of the input image to hack on
	hacked_image = np.copy(original_image)
	

	# How much to update the hacked image in each iteration
	learning_rate = 0.1
	

	# Define the cost function.
	# Our 'cost' will be the likelihood out image is the target class according to the pre-trained model
	cost_function = model_output_layer[0, object_type_to_fake]
	

	# We'll ask Keras to calculate the gradient based on the input image and the currently predicted class
	# In this case, referring to "model_input_layer" will give us back image we are hacking.
	gradient_function = K.gradients(cost_function, model_input_layer)[0]
	

	# Create a Keras function that we can call to calculate the current cost and gradient
	grab_cost_and_gradients_from_model = K.function([model_input_layer, K.learning_phase()], [cost_function, gradient_function])
	

	cost = 0.0
	

	# In a loop, keep adjusting the hacked image slightly so that it tricks the model more and more
	# until it gets to at least 80% confidence
	while cost < 0.80:
	    # Check how close the image is to our target class and grab the gradients we
	    # can use to push it one more step in that direction.
	    # Note: It's really important to pass in '0' for the Keras learning mode here!
	    # Keras layers behave differently in prediction vs. train modes!
	    cost, gradients = grab_cost_and_gradients_from_model([hacked_image, 0])
	

	    # Move the hacked image one step further towards fooling the model
	    hacked_image += gradients * learning_rate
	

	    # Ensure that the image doesn't ever change too much to either look funny or to become an invalid image
	    hacked_image = np.clip(hacked_image, max_change_below, max_change_above)
	    hacked_image = np.clip(hacked_image, -1.0, 1.0)
	

	    print("Model's predicted likelihood that the image is a toaster: {:.8}%".format(cost * 100))
	

	# De-scale the image's pixels from [-1, 1] back to the [0, 255] range

 

بتشغيلة، سيتم خداع الشبكة:

$ python3 generated_hacked_image.pyModel’s predicted likelihood that the image is a toaster: 0.00072%[ …. a few thousand lines of training …. ]Model’s predicted likelihood that the image is a toaster: 99.4212%

لنختبر الشبكة من خلال الصورة المعدلة:

$ python3 predict.pyThis is a toaster with 98.09% confidence!

تم بالفعل خداع الشبكة وتوقعت الصورة أنها toast بدلاً من cat.

 

ماذا يُمكننا فعله بصورة كذلك؟

البحث العلمي أظهر أن تلك الصور لديها بعض الخصائص كالتالي:

  1. يُمكن لتلك الصور أن تخدع الشبكات حتي وإن كانت مطبوعة علي ورق! لذلك يُمكننا خداع الكاميرات وليس فقط الأنظمة التي نقوع برفع الصور إليها.
  2. تلك الصور يُمكنها خداع أكثر من شبكة بتصميمات مختلفة لو تم تدريبهم علي بيانات مختلفة.

لكن يوجد عائق كبير في إنتاج تلك الصور. هذا الهجوم يعتمد علي الوصول إلي الشبكة نفسها. في الواقع، الشركات لن تدع المجال لتحميل تلك الشبكات. لكن هذا لن يجعل من الأمر مستحيلاً.

الباحثون يمكنهم ملاحظة كيف للشبكة أن تتصرف بناءً علي المدخلات. بناءً علي ذلك، يُمكنهم إنتاج صور جديدة تستطيع خطاع الشبكة. هذا يُسمي black-box attack.

تطبيقات ال black-box attack غير محدودة. هذه هي بعض الأمثلة:

  • خداع ال self-driving cars لجلعهم يروا إشارة الوقوف.
  • خداع أنظمة ال content filtering بالسماح بالمحتويات الغير شرعية.
  • خداع ال ATM check scanners بأن الملبلغ المكتوب علي الشيك أكبر مما هو عليه.

وهذا ليس مقتصر علي الصور فقط ولكن يُمكن تطبيق ذلك علي أي نوع من البيانات.

 

كيف نحمي أنفسنا من تلك الهجمات؟

الإجابة القصيرة هو أنه لا يوجد أحد متأكد من كيفية إيقاف تلك الهجمات. هذا الأمر مازال في نطاق البحث.

 

لكن يود بعض الأمور التي يُمكن معرفتها:

  • إذا ما قمت بإنتاج العديد من تلك الصور لتدريب الشبكة، هذا يعني أن الشبكة أصبحت تقاوم هذا الهجوم. هذا يُسمي Adversarial Training.
  • طريق آخر هو ال Defensive Distillation حيث تقوم بتدريب نموذج آخر يُحاكي النموذج الأصلي. لكن هذه الطريقة جديدة ومعقدة.

لتعلم المزيد

يمكن الإطلاع علي تلك الأبحاث: Intriguing properties of neural networksExplaining and Harnessing Adversarial ExamplesPractical Black-Box Attacks against Machine Learning , Adversarial examples in the physical world

متابعة مدونة Ian Goodfellow  و Nicolas Papernot’s

مسابقة Kaggle والتي يتنافس من خلالها الباحثون للتصدي لتلك الهجمات.


تم الترجمة بواسطة أحمد جاد.

الدرس الأصلي:

https://medium.com/@ageitgey/machine-learning-is-fun-part-8-how-to-intentionally-trick-neural-networks-b55da32b7196

تعليقات