حملات تخاصمی (Adversarial Attacks) با چارچوب PyTorch – راهنمای کاربردی


در سالهای اخیر از «هوش مصنوعی» (Artificial Intelligence) و «یادگیری ماشین» (Machine Learning) در زمینههای گوناگونی استفاده شده است. برخی از دانشمندان نسبت به رشد بیوقفه هوش مصنوعی ابراز نگرانی کردهاند و برخی دیگر این نگرانیها را بیدلیل میدانند. اما جنس دیگری از نگرانیها اخیرا در رابطه با مدلهای یادگیری ماشین مطرح شده که با آنچه پیشتر بیان میشد متفاوت است. گمراه کردن مدلهای یادگیری ماشین و یا به عبارتی هک کردن آنها امکانپذیر است و شاید این همان موضوعی باشد که واقعا باید نگران آن بود. در ادامه، به موضوع «حملات تخاصمی» (Adversarial Attacks)، مفهوم و چگونگی پیادهسازی آنها با استفاده از «زبان برنامهنویسی پایتون» (Python Programming Language) پرداخته شده است.
حملات تخاصمی (Adversarial Attacks)
با وجود آنکه مدلهای «یادگیری عمیق» (Deep Learning) در بسیاری از وظایف پیچیده موفقیتهای قابل توجهی کسب کردهاند، اما آنقدرها هم که بشر ممکن است فکر کند، هوشمند نیستند. پژوهشها حاکی از آن است که مدلهای یادگیری عمیق به چیزی با عنوان «نمونههای تخاصمی» (Adversarial Examples) آسیبپذیر هستند. نمونههای تخاصمی، ورودیهایی محسوب میشوند که به شکل مخربی طراحی شدهاند و به لحاظ ادراکی (برای مثال در صورتی که انسان آنها را مشاهده کند) از ورودیهای اصلی قابل تشخیص نیستند، ولی توسط مدل به اشتباه دستهبندی میشوند.
برای مثال، اگر تصویر یک «بَبرَک» (Tiger Cat) موجود باشد (نمونه تصویر اصلی و تصویر تخاصمی در ادامه مطلب آمده است) که توسط مدل InceptionV3 به درستی تشخیص داده میشود، میتوان با استفاده از مدل تخاصمی این تصویر را به گونهای تغییر داد که به لحاظ بصری از تصویر اصلی غیر قابل تشخیص باشد، اما توسط مدل به اشتباه دستهبندی شود. نمونههای تخاصمی پس از آنکه برای اولینبار مطرح شدند، توانستند توجهات زیادی را از جامعه پژوهشگران به خود جلب کنند و در نتیجه، پس از آن چندین روش برای ساخت نمونههای تخاصمی ارائه شده است. در این راهنما، چهار روش ساده برای تولید نمونههای تخاصمی ارائه شده است. کار با نصب کتابخانههای لازم، بارگذاری تصویر ورودی و دستهبندی آن با استفاده از یک مدل InceptionV3 از پیش آموزش دیده شده آغاز میشود. سپس، از روشهای گوناگون انجام حملات تخاصمی یا Adversarial Attacks برای ساخت نمونههای تخاصمی و گمراه کردن «دستهبند» (Classifier) استفاده میشود.
ابتدا، کتابخانههای مورد نیاز برای انجام سناریو بیان شده را باید با دستور زیر فراخوانی کرد. فرض میشود که کتابخانههای «نامپای» (NumPy)، (مَتپِلاتلیب) (Matplotlib) و «رِکوئِست» (Requests) پیشتر توسط کاربر نصب شدهاند و در حال حاضر نیازی به نصب آنها نیست و فراخوانی آنها کفایت دارد. کاربرانی که این موارد را نصب ندارند و اکنون اقدام به نصب آنها میکنند باید توجه داشته باشند که پس از نصب، زمان اجرا را صفر کنند. بدین دلیل گفته میشود باید زمان اجرا را صفر کرد که بعدا زمان اجرای فرآیند اصلی قابل اندازهگیری باشد.
در اینجا از مدل پیش-آموزش داده شده inceptionv3 برای دستهبندی دادهها استفاده خواهد شد. همچنین، میتوان از مدل VGG یا دیگر انواع مدلها استفاده کرد، اما باید تغییراتی در این کد داده شود (برای مثال در سایز ورودی). با توجه به اینکه inceptionv3 از «رها کردن» (Dropout) و «نرمالسازی دسته» (Batch Normalization) استفاده میکند، رفتار آن در هنگام ارزیابی و ضمن آموزش متفاوت است. بنابراین، باید در حالت ()eval تنظیم شود.
اکنون، یک تصویر با استفاده از requests و PIL بارگذاری میشود. گزینش تصویر به انتخاب کاربر است.
در حال حاضر، نیاز به پردازش کردن تصویر ورودی پیش از پاس دادن آن به مدل inceptionv3 است. به دلیل آنکه این تصویر با استفاده از PIL بارگذاری شده، باید آن را به یک تانسور تورچ (تبدیل کردن به تانسور در کتابخانه پایتورچ) تبدیل کرد. همچنین، نیاز به شکلدهی مجدد تصویر ورودی است. Inceptionv3 میپذیرد که ارتفاع و وزن ورودی ۲۹۹ باشد. در نهایت، «نرمالسازی» (Normalization) انجام میشود. شایان توجه است که مدل inceptionv3 پایتورچ از وزنهای از پیش آموزش داده شده از گوگل استفاده میکند و تصاویری با مقدار پیکسل بین -۱ تا ۱ را میپذیرد.
«پایتورچ» (PyTorch) این عملیات را به صورت داخلی انجام میدهد و ورودیهای نرمالشده با «میانگین» (Mean) و «انحراف معیار» (Standard Deviation) ارائه شده در زیر را (به منظور یکنواختی) قبول میکند. افرادی که قصد پیادهسازی نرمالسازی را به صورت دستی دارند (چنانکه با وزنهای از پیش آموزش داده شده از گوگل فرض شده)، باید یک پارامتر بیشتر را پاس بدهند (transform_input=False)، در حالیکه دادههای از پیش آموزش دیده مدل inceptionv3 بارگذاری میشوند. برای مثال، inceptionv3 = models.inception_v3(pretrained=True, transform_input=False). در اینجا، ()Compose ترکیب تبدیلهای چندگانه در یک تابع را آسان میکند.
سپس، تصویر ورودی با استفاده از تابع ساخته شده در بالا پیشپردازش میشود.
در ادامه، این تصویر با استفاده از مدل از پیش آموزش داده شده inceptionv3 که پیشتر بارگذاری شده بود دستهبندی میشود.
282
پس از آن، یک دیکشنری برای نگاشت اندیسها به کلاس imagenet مورد استفاده قرار میگیرد. ImageNet دارای ۱۰۰۰ کلاس است.
tiger cat
شایان توجه است که متد ()forward اکنون logits را باز میگرداند. بنابراین به منظور دریافت تابع احتمال برای ۱۰۰۰ کلاس، نیاز به انتقال دادن خروجی از طریق یک تابع «softmax» (سافتمَکس) است.
74.9844
روش علامت گرادیان سریع
فرض میشود که ورودی X موجود و به درستی توسط مدل (M) دستهبندی شده است. هدف، پیدا کردن یک نمونه تخاصمی است که به لحاظ ادراکی از نسخه اصلی X غیر قابل تشخیص باشد، اما توسط همان مدل (M) به اشتباه دستهبندی میشود. میتوان این کار را با افزودن آشفتهسازی تخاصمی (θ) به ورودیهای اصلی انجام میشود.
باید به این نکته توجه کرد که هدف پیدا کردن مثال تخاصمی است که به لحاظ ادراکی از نسخه اصلی غیر قابل تشخیص باشد. این نمونه را میتوان با محدود کردن بزرگی آشفتگی تخاصمی X−||∞⩽ϵ|| به دست آورد. نُرم ∞L باید کمتر از اپسیلون باشد. در اینجا، ∞L نشانگر حداکثر تغییرات برای همه پیکسلها در نمونه تخاصمی است. روش «علامت گرادیان سریع» (Fast Gradient Sign Method | FGSM) یک روش سریع و به لحاظ محاسباتی کارآمد برای تولید نمونههای تخاصمی محسوب میشود. اگرچه، معمولا نرخ موفقیت کمتری دارد. راهکار برای پیدا کردن مثال تخاصمی به صورت زیر است:
((Xadv=X+ϵsign(∇XJ(X,Ytrue
در اینجا داریم:
- X = ورودی اصلی (سالم)
- Xadv = ورودی تخاصمی (عمدا به گونهای طراحی شده که توسط مدل به اشتباه دستهبندی شود)
- ϵ = بزرگی آشفتگی تخاصمی
- (XJ(X,Ytrue∇ = گرادیان تابع زیان w.r.t به ورودی (X)
Variable containing: 282 [torch.LongTensor of size 1]
سلول کد زیر همه نمونههای تخاصمی را با استفاده از فرمول نشان داده شده در بالا محاسبه میکند.
Egyptian cat 66.0086
در نهایت، یک نمونه تخاصمی ساخته شده که توسط مدل به اشتباه دستهبندی میشود. به دلیل آنکه «گربه مصری» (Egyptian cat) بسیار شبیه به بَبرَک است، همچنان میتوان گفت نمونه تخاصمی خیلی خوب نیست.
در ادامه، تابعی تعریف میشود که ورودی اصلی، نمونه تخاصمی و آشفتگی تخاصمی را بصریسازی میکند. این کار، درک بهتری از چگونگی به نظر رسیدن نمونههای تخاصمی و اینکه آیا آنها از تصویر اصلی قابل تشخیص هستند یا خیر ارائه میکند.
همانطور که مشهود است، تصویر تخاصمی تولید شده به لحاظ بصری از تصویر اصلی قابل تشخیص نیست، اما «دستهبند» (classifies) مورد استفاده در اینجا، یعنی inceptionv3 تصویر را به اشتباه گربه مصری تشخیص داده است. اکنون، چندین تصویر تخاصمی با مقادیر مختلف اپسیلون ساخته میشود. شایان توجه است که هر چه مقدار اپسیلون بیشتر شود، تصویر تخاصمی از تصویر اصلی غیر قابل تشخیص میشود.
برای مقدار بسیار کوچک اپسیلون، دسته تغییر نمیکند. اما احتمال کاهش مییابد. یک راه جایگزین استفاده از گرادیان خام (علامتگذاری نشده) بدون هرگونه محدودیتی (اپسیلون) است. به این روش، «مقدار گرادیان سریع» (Fast Gradient Value) گفته میشود.
روش دسته هدف یک گام
مخاطبان این مطلب ممکن است تاکنون متوجه شده باشند که FGSM آشفتگی را پیدا میکند که زیان را برای کلاس صحیح افزایش میدهد و متعاقبا منجر به دستهبندی غلط میشود. همچنین، FGSM یک روش غیر هدفمند است. میتوان به سادگی آن را با بیشینه کردن احتمال (P(Ytarget|X برای برخی از کلاسهای هدف Ytarget به کلاس هدف تبدیل کرد.
برای یک «شبکه عصبی» (Neural Network) با «زیان آنتروپی متقاطع» (Cross-Entropy Loss) فرمول به صورت زیر خواهد بود:
(Xadv=X−ϵsign(∇XJ(X,Ytarget
تنها تغییری که نیاز به اعمال آن است، حذف آشفتگی از ورودی مدل به جای افزودن آن است. اما چگونه میتوان کلاس هدف را انتخاب کرد؟ دو راهکار در پاسخ به این پرسش وجود دارد. یکی استفاده از یک کلاس تصادفی به عنوان کلاس هدف است. راهکار دیگر و توصیه شده، استفاده از دستهای است که مدل کمترین احتمال را به آن تخصیص میدهد. این روش به عنوان دسته با کمترین احتمال نیز شناخته شده است. در اینجا از راهکار دسته تصادفی استفاده میشود.
Variable containing: 288 [torch.LongTensor of size 1]
به نظر میرسد مدل در اینجا عملکرد خوبی نداشته است. میتوان از تصاویر دیگر استفاده کرد و نتایج ممکن است تغییر کند. در ادامه دیگر روشهای انجام حملات تخاصمی مورد بررسی قرار میگیرد تا مشاهده شود که آیا میتوانند نمونههای تخاصمی بهتری تولید کنند.
روش تکرار شونده پایه
روش «تکرار شونده پایه» (Basic Iterative Method) افزونهای از روش FGSM است که FGSM را چندین بار با اندازههای گام کوچک تکرار میکند. بدین منظور، تصویر تخاصمی به بعنوان تصویر اصلی مقداردهی اولیه میشود و سپس یک گام در جهت گرادیان در طول هر تکرار برداشته میشود.
در اینجا، ClipX,ϵ نشانگر قطع کردن ورودی در طیف [X−ϵ,X+ϵ] است.
Inceptionv3 بَبرَک را به عنوان گربه مصری با درجه اطمینانی بیش از آنچه برای بَبرَک دارد دستهبندی کرد.
روش دسته هدف تکرار شونده
میتوان کار مشابهی را برای روش دسته هدف یک گام انجام داد. همانطور که پیشتر نمایش داده شد، به منظور انجام FGSM هدفمند نیاز به حذف آشفتگی از تصویر اصلی است. در اینجا، این کار با چندین تکرار انجام میشود.
مجددا لازم به ذکر است که توصیه میشود از کلاسی که کمترین احتمال را دارد استفاده شود، اما در اینجا از یک کلاس تصادفی استفاده میشود. میتوان کلاس با کمترین احتمال را با اجرای [y_LL = torch.min(output.data, 1)[1][0 پیدا کرد.
همانطور که میتوان مشاهده کرد، تصویر آشفتهسازی شده از تصویر اصلی قابل تشخیص نیست، اما مدل آن را در دسته «شترمرغ» (Ostrich) دستهبندی کرد. به منظور بررسی بیشتر، چندین کلاس هدف مختف مورد آزمون قرار گرفتند و مدل هر بار درست عمل کرده است. روشهای معرفی شده در اینجا برای تولید نمونههای تخاصمی، بسیار ساده و موثر هستند.
همانطور که پیشتر بیان شد، روشهای تکرار شونده نمونههای تخاصمی بهتری نسبت به روش یک گام، تولید میکنند. روشهای دیگری نیز وجود دارد (DeepFool ،Carlini & Wagner's Attack ،Jacobian-based Saliency Map Attack و دیگر موارد). همچنین، تاکنون روشهایی مانند Defensive Distillation و «آموزش تخاصمی» (Adversarial Training) برای دفاع از مدل در مقابل چنین حملاتی ارائه شدهاند.
اگر نوشته بالا برای شما مفید بود، آموزشهای زیر نیز به شما پیشنهاد میشوند: