مقدمه ای بر روش های تفسیر پذیری برای سهولت نظارت بر آموزش شبکه عصبی
این مقاله به معرفی کتابخانه tf-explain می پردازد و توضیحاتی در مورد روش های تفسیر پذیری ، مانند Grad CAM ، با Tensorflow 2.0 ارائه میدهد.
آیا تا به حال برای شما پیش آمده که منتظر آموزش داده های یک شبکه عصبی باشید و در نهایت پس از ساعت ها انتظار آموزش با شکست مواجه شده باشد؟ مطمئنا اگر در این حوزه فعالیت دارید به این مشکل برخورده اید و احتمالا بیش از یک بار برای شما اتفاق افتاده است.
برای جلوگیری از این مشکل، من شروع به جستجو ابزار هایی کردم که میتوانند به من در زمینه ی پیش بینی و رفع اشکال شبکه های عصبی که مرحله آموزش را پشت سر گذاشته اند، کمک کنند.
این مقاله خلاصه ای است از آنچه من یافتم:
- ثبت بصری برای بررسی یکپارچگی خط لوله (Pipeline )
- روش های تفسیری برای داشتن بینش و اطلاع از داخل شبکه های عصبی
همه روش های ارائه شده در این مقاله در tf-explain که کتابخانه ای برای تفسیر با استفاده از TensorFlow 2.0 ساخته شده است، پیاده سازی شده است.
بیایید اکنون نحوه پیاده سازی آن ها را بررسی کنیم.
فهرست مطالب
آنچه که به شبکه وارد می شود را بررسی کنید
اولین دلیل برای آموزش های ناموفق ، وارد کردن داده های ناخواسته به شبکه است. تجسم و بررسی ورودی ها بسیار مهم است و برای این کار ، من از کتابخانه VisualLogging استفاده میکنم. بررسی تصاویر نمونه در لحظات مختلف و مهم خط لوله ( بارگذاری ، تغییر اندازه ، داده افزایی ) میتواند به شما در جلوگیری از بروز اتفاقات نا مطلوب در نتیجه نهایی کمک کند.
گزارش ها مستقیماً در یک صفحه HTML قرار داده میشوند ، که میتوانید آن را پیمایش کرده و بررسی کنید.
کرنل های کانولوشنی را کنترل کنید
بیایید اکنون به روش های تفسیری بپردازیم. اجزای اصلی شبکه های کانولوشنی ، کرنل ها هستند. آنچه مهم است این است که کرنل در حال یادگیری است ، اینکه خروجی آن چگونه به طبقه بندی نهایی کمک میکند.
تجسم لایه های میانی
اولین قدم این است که به سادگی آنچه را که از لایه های فعال سازی بیرون میآید ، تجسم کنید. آیا بازده هنوز هم مناسب به نظر میرسد؟ یا شبیه نویز های تصادفی است؟ با بررسی نحوه انتقال تصویر درون شبکه ، میتوانید مطمئن شوید که شبکه روی بخش های مناسبی از ورودی تمرکز دارد.
استخراج خروجی یک لایه میانی با Tensorflow نسبتاً آسان است. شما از کل مدل خود شروع کرده و نمودار بخشی از آن را استخراج میکنید. کد زیر نحوه بدست آوردن خروجی های لایه activation_1 از مدل Resnet50 را نشان میدهد.
بررسی کرنل
دیدن آنچه از یک لایه بیرون می آید بسیار خوب است ، اما باید بفهمیم ،چه چیزی کرنل را فعال کرده و روی آن تاثیر می گذارد.
ایده پشت این تجسم، تولید ورودی ای برای شبکه است که واکنش یک فیلتر کرنل خاص را به حداکثر میرساند. بنابراین ، ما یک زیر مدل ایجاد میکنیم که در لایه هدف متوقف میشود. تابع loss که به دنبال حداکثر کردن آن هستیم ، میانگین خروجی این لایه فعال سازی است. نقطه شروع، وارد کردن تعدادی نویز تصادفی به عنوان ورودی است. سپس ، ما گرادیان ها با روش پس انتشار تغییر می دهیم تا گرادیان افزایشی روی نویز اتفاق بیفتد. به همین ترتیب ، ما ورودی ایجاد می کنیم که واکنش فیلتر را قوی تر و قوی تر می کند.
با استفاده از Tensorflow ، اجرای این روش فقط ۴ مرحله است:
- ایجاد زیرگراف اولیه ( همانند قبل )
- از شی GradientTape برای گرفتن گرادیان های ورودی استفاده کنید
- گرفتن گرادیان با gradient
- افزایش گرادیان را با assign_add بر روی متغیر اولیه انجام دهید.
مثال ارائه شده در اینجا برای ساده نگه داشتن کد ، خلاصه شده است. تکنیک های بسیاری برای بهبود تجسم کرنل وجود دارد (تنظیم ، ارتقا سطح). اگر به این موضوع علاقه مند هستید ، من شدیداً خواندن این مقاله در مورد تجسم ویژگی ها ( Feature Visualization ) را به شما توصیه میکنم.
چه چیزی تصمیم شبکه عصبی را مشخص می کند
تجسم کرنل ها و لایه های میانی میتواند به تشخیص رفتار های عجیب و غریب شبکه کمک کند. با این حال ، هیچ شناختی در مورد اینکه چرا یک شبکه عصبی تصمیم خاصی میگیرد ، نمیدهد. چند روش بعدی روش هایی برای تجسم بخشی از ورودی است که بر مقدار خروجی تأثیر میگذارد.
حساسیت به انسداد
ایده انجام تست حساسیت به انسداد ، پنهان کردن قسمت هایی از تصویر و دیدن تأثیر آن بر تصمیم شبکه عصبی برای یک کلاس خاص است.
برای این کار، ما یک هاله آبی را روی یک تصویر که در آن یک گربه حضور دارد، اعمال می کنیم و میزان اطمینان هر مرحله را محاسبه میکنیم. وقتی هاله از روی گربه عبور میکند ، میزان اطمینان شبکه کاهش مییابد ، بنابراین متوجه می شویم که ناحیه پشت هاله مهم است. وقتی هاله گربه را مسدود نکند ، میزان اطمینان یکنواخت باقی می ماند یا در نهایت بالا می رود. دلیل این اتفاق این است که ما عناصر مهم تصویر را پنهان می کنیم و همین موضوع باعث پایین آمدن عملکرد سیستم می شود.
نقشه حرارتی (نمایانگر نقاط مهم) تولید شده اطلاعات “آیا این قسمت از تصویر به بهبود میزان اطمینان شبکه کمک میکند” را نشان میدهد. اگر وضوح ضعیف است ، شما میتوانید با تغییر اندازه هاله آن را بهبود بخشید تا تاثیر آن را از مناطق میکرو تا ماکرو تصویر بررسی کنید.
فرآیند تولید نقشه حرارتی به مراحل زیر تجزیه میشود:
- دسته ای از تصاویر را با وصله های اعمال شده ایجاد کنید
- پیش بینی ها را بدست آورید
- برای کلاس هدف پیش بینی ها را ذخیره کنید
- اطلاعات میزان اطمینان را در نقشه حاصل در کنار یکدیگر قرار دهید.
نقشه های فعال سازی کلاس
نوع دیگر روش ها به طور مستقیم از گرادیان ها برای تعیین مناطق مربوطه و مهم استفاده میکنند. نقشه های فعال سازی کلاس ( CAM) و به طور خاص روش های Grad-CAM (که در زیر پیاده سازی شده است) اهمیت فیلتر های خروجی را نسبت به تصمیم نهایی بررسی میکنند (به بخش تجسم لایه های میانی در بالا مراجعه کنید).
با توجه به فیلتر های کانولوشنی (در یک شکل WxHxN) ، ما گرادیان ها را به سمت بالا بردن نمره کلاس (در همان شکل WxHxN) محاسبه میکنیم. برای تعیین اهمیت هر فیلتر در تصمیم گیری ، میانگین وزن های آن را (با شکل ۱x1xN) به عنوان مرجع در نظر می گیریم و هر نقشه را در وزن های متناظر آن ضرب میکنیم.
سپس ، همه آن نقشه های بدست آمده را در یک نقشه حرارتی نهایی جمع بندی می کنیم. اگر یک نقشه فعال سازی در فاز انتشار به جلو سبک شده باشد ، و اگر گرادیان آن زیاد باشد ، به این معنی است که منطقه فعال شده تأثیر زیادی در تصمیم گیری دارد.
پیاده سازی انجام شده در زیر، از این ایده پیروی میکند و موارد ارائه شده در الگوریتم های قبلی در آن استفاده نشده است.
با این حال ، موضوعی که در مقاله Grad CAM ارائه شده است ، پس انتشار هدایت شده نامیده میشود. در این روش با صفر کردن گرادیان های منفی یا گرادیان های مرتبط با مقدار منفی فیلتر، المان هایی که تاثیر منفی روی نتیجه گیری دارند را حذف می کند..
Tensorflow روش tf.RegisterGradient را برای تعریف یک روش جدید گرادیان ارائه میدهد ، که همراه با gradient_override_map به تغییر رفتار لایههای ReLU ما کمک میکند.
https://gist.github.com/RaphaelMeudec/f78c8d9ecb9c455e8f4141e84984de17#file-register_gradient-pyمتأسفانه ، اگر بخواهید این عملیات را انجام دهید ، Tensorflow به شما اطلاع میدهد که tf.cast دیگر در نسخه ۲٫۰ پشتیبانی نمی شود: tf.GradientTape.gradients () از عملیات کنترل نمودار مانند tf.cond یا tf.while در این زمان پشتیبانی نمیکند .
از آنجا که ما از این راهنما فقط در زمان استنباط استفاده میکنیم ، می توانیم این عملیات را بعد از محاسبه گرادیان ها انجام دهیم. این به معنای یک تغییر کوچک پس از فراخوانی GradientTape است.
اطلاعات کامل در مورد اجرای Grad CAM در اینجا موجود است.
این روش ها همه در tf-explain پیاده سازی میشوند ، که می توانید از آن در مدل های آموزش دیده یا در پاسخ های Keras استفاده کنید.
اگر به موضوع این مقاله علاقمند هستید، در بخش نظرات به ما اطلاع دهید تا مقالات بیشتری در این حوزه برای شما ارائه کنیم.
متاسفانه ترجمع گوگل ترنسلیتی از مقالات انگلیسی باعث میشه که کلمه ای مثل callback ، بعنوان “پاسخ های” ترجمه شه و باعث گیج شدن بیشتر افراد بشه.