حامد قاسمی
حامد قاسمی
خواندن ۱۰ دقیقه·۳ سال پیش

تحلیل و بررسی معماری ResNet و بهبودهای آن

مقدمه مقاله ResNet یکی از مقالات مهم و کلیدی منتشر شده در سال های اخیر در زمینه یادگیری عمیق است که تاکنون بیش از ۱۰۰ هزاربار به آن ارجاع داده شده است که پر ارجاع ترین مقاله دنیایی یادگیری عمیق تا کنون است و بعید است فعلا عنوان خود را از دست بدهد. میدانیم شبکه های عصبی هر چه عمیق تر شوند فرآیند یادگیری آنها پیچیده تر می شود و این مقاله تلاش می کند تا فرآیند یادگیری را برای الگوریتم های بهینه سازی ساده تر کند و عمق شبکه عصبی را به هر میزان که بخواهد زیاد کند. به عنوان نمونه در بخشانتهایی مقاله شبکه ای با عمق ۱۲۰۰ لایه نیز معرفی می شود. شبکه های عمیق در آن سال ها حدود ۲۰ لایه (شبکه VGG با ۱۹ لایه و GoogLeNet با ۲۲ لایه) داشته و طراحی و آموزش شبکه ای با ۱۲۰۰ لایه پیشرفت بزرگی محسوب می شود که البته چالشهای مخصوصبه خود را نیز داراست

مساله چالشهای طراحی و آموزش شبکه های عصبی با عمق زیاد چیست ؟ به صورت کلی با اضافه شدن لایه ها و پارامترهای بیشتر به شبکه های عمیق با دو مشکل عمده روبرو می شود. (با فرضآن که مشکل بیشبرازش را نخواهیم داشت.

محوشدگی گرادیان :

محوشدگی گرادیان پدیده ای است که در اثر عمق زیاد شبکه عصبی به وجود می آید و در آن گرادیان ها از تابع ضرر به لایه های ابتدایی نمی رسند و با ضرب های متوالی کم و کمتر می شوند و این باعث می شود که وزن ها در لایه های ابتدایی به روز رسانی نداشته باشند و بنابراین شبکه خروجی مطلوب را نداشته باشد.

تنزل (degradation):

در پدیده تنزل(degradation)شبکه مشکل محو شدگی گرادیان ندارد و به صورت طبیعی وقتی لایه ها بیشتر قرار داده می شود انتظار می رود که شبکه عملکرد بهتری نسبت به شبکه هایی با لایه های کم عمق داشته باشد و یا در حداقل مورد ممکن عملکرد آن با شبکه های کم عمق برابر باشد، که این اتفاق نمی افتد ! (در مورد این پدیده در ادامه دقیق تر صحبت خواهد شد.)

مشکل اول یعنی محوشدگی گرادیان تا با کمک تکنیکی مثل Batch Normalization تا حد بسیار زیادی رفع شد و نویسندگان مقاله نیز دو مرتبه (یک بار در پارگراف ۲ قسمت -In troduction و یک بار در پارگراف ۵ قسمت (Expriments به آن اشاره کرده اند و توضیح داده اند که با اندازه گیری گرادیان ها در تمامی لایه ها مشکل محوشدگی گرادیان مشاهده نشده است و تکنیک های نرمال سازی در لایه های میانی این مشکل را تا حد زیادی رفع کرده است.

آنچه که مانع از نتایج خوب با عمیق تر شدن شبکه ها شده است پدیده تنزل یا degredation است. به صورت پیشفرضاگر محو شدگی گرادیان نداشته باشیم و شبکه نیز دچار مشکل بیش برازش نشده باشد، انتظار داریم هر چه عمق شبکه را اضافه کنیم، حداقل خروجی حداقل به اندازه شبکه های کم عمق تر باشد. به این علتکه این لایه ها اگر یکلایه همانی باشند (یعنی ورودی دریافت شده را مستقیم بدون هیچ تغییری به خروجی ببرند)بردار خروجی softmax مشابه شبکه کم عمق است و بنابراین دقت دقیقا همان دقت شبکه کم عمق می باشد. حال اگر به جای این شبکه های از لایه های کانولوشنی استفاده کنیم انتظار داریم اگر شبکه نتواند نتایج بهتری نسبت به شبکه کم عمق پیدا کند، حداقل لایه های اضافه شده را به صورت لایه های همانی یاد بگیرد و دقت خروجی کمتر نشود. اما مشکل دقیقا همین جا است و شبکه نمیتواند لایه های کانولوشنی اضافه شده را طوری وزن دهی کند که وروردی و خروجی این لایه ها تغییر نکنند و به تعبیری یک لایه identitiy باشد. در واقع الگوریتم های بهینه سازی استفاده شده این قابلیت را ندارند. شاید هم نتوان به الگوریتم های بهینه سازی خرده ای گرفت، چرا که هنوز به صورت ریاضیاتی اثبات همگرایی برای این الگوریتم ها در شبکه های عصبی ارایه نشده است و ما یک دید ناقص نسبت به عملکرد آنها داریم و اگر این دید کامل تر بود میتوانستیم شبکه ها را بهینه تر طراحی کنیم. در هر صورت باید چاره ای برای حل این مشکل یعنی مشکل تنزل یا degradation پیدا کنیم و این مقاله دقیقا همان جایی است که این مشکل را برطرف کرده است. شکل ۱ این پدیده را نشان داده است. علاوه بر آن در شکل ۲ نیز این پدیده به صورت کامل نشان داده شده است.

مشاهده میکنیم که اگر چه تعداد لایه ها بالاتر رفته است و با مشکل بیش برازش نیز روبرو نیستیم ، اما شبکه ای با ۵۶ لایه عمکرد ضعیف تری نسبت به شبکه ای با ۲۰ لایه داشته است. همچنین در مقاله [؟] نیز تابع loss شبکه ۵۶-ResNet در حضور و عدم حضور مسیر های جانبی آورده است. شکل۳ این موضوع را نشان می دهد. مشاهده می گردد که چقدر حضور این مسیرهای جانبی به نرم تر شدن loss function کمک کرده است و این نرم تر شدن باعث مشتق گیری بهتر و طبیعتا همگرایی سریعتر الگوریتم می گردد که در نتایج نیز این موضوع مشخص است.

روش حل مساله نویسندگان :

مقاله پیشنهاد کردند که وقتی شبکه نمی تواند به صورت مستقیم لایه Identity را یاد بگیرید به کمک یک skip connection و به عبارتی یک مسیر جایگزین به او در این زمینه کمک کنیم ! شکل ۴ این موضوع را نشان می دهد. همانطور که در این شکل نشان داده شده است علاوه بر مسیر اصلی که شامل لایه های کانولوشنی و Batch Normalization و تابع فعال سازی است، داده ورودی به صورتمستقیم و بدون هیچ تغییری با خروجی لایه های غیرخطی استفاده شده جمع می گردد. اما این موضوع چه اثری دارد ؟

در این حالت ما به شبکه در یادگیری کمک کرده ایم. به عبارتی در این حالت شبکه می تواند وزن های مربوط به لایه های کانولوشنی را صفر در نظر بگیرید و انگار که لایه های وزن دار عملا وجود ندارد و داده ورودی مستقیم به خروجی رفته است. به عبارتی انگار که لایه ای وجود نداشته است. تعبیر این موضوع این است که شبکه هر جا که دوست داشت می تواند لایه های وزن دار را در نظر بگیرد و اثر آن را در خروجی بیاورد و هر جا که دوست نداشت آن را نظر نگیرد و این باعث می شود که ما به هر تعدادی که بخواهیم لایه اضافه کنیم و شبکه لایه های مختلف را متناسب با درخواست خود به صورت لایه وزن دار در نظر بگیرید یا صرفا ورودی بدون هیچ تغییری در خروجی اعمال شود و این همان راه حل پیشنهادی شبکه است که باعث شده تا بتوانیم شبکه ای با ۱۰۰ و حتی ۱۰۰۰ لایه طراحی کنیم. نتایح خروجی نیز بسیار قابل توجه بود و در چالشILSVRC در همه بخشها با قدرت به عنوان تیم اول دست یافت. در بخشطبقه بندی به خطای ۳ .۶ ٪ رسیدند و در بخشObject Localization نیز نتیجه شبکه VGG که سال قبل اول شده بود را بیش از ۱۶ درصد بهبود دادند و به عدد ۹ درصد رساندند که بهبود قابل توجهی است

بهبودها Mapping Identity اهمیت بررسی ۱ .۴ در مقاله ای که بعدتر توسط نویسندگان همین مقاله تحت عنوان Identity Mapping in Deep Residual Networks ارایه گردید، به صورت دقیق تر بلوک های residual با معماری و ساختارهای مختلف تست گردید و تلاش کردند تا به صورت بهینه تری طراحی ها را انجام دهند. در بخش اول طراحی بهینه بلوک های residual بر روی مسیر جانبی اطلاعات یا همان skip connection تحقیق و بررسی انجام گرفت و تلاش شد تا به روش های مختلف این مسیر کمی بهینه تر طراحی شود. بدین منظور معماری های مختلفی در این باره ارایه شد که در شکل ۵ مشاهده می گردد. در این شکل قسمت(a (همان بلوک ResNet معمولی می باشد. در قسمت(b (خروجی لایه های وزنی و خروجی مسیر جانبی هر دو در یکعدد ثابت(در اینجا۰ .۵(ضربشده اند.نتیجه البته جالب نبود و بلوک ResNet اصلی نتایج بهتری داشت. به عبارتی ضرب مقادیر باعث شده بود فرآيند یادگیری سخت تر شود. در قسمت (c (به کمک یک کانولوشن ۱ در ۱ و تابع فعال سازی sigmoid تلاش شده است تا یک ساختار گیت مانند (مشابه GRU و (LSTM ایجاد شود و فرآیند خروجی اطلاعات کمی هوشمندانه تر کنترل شود. نتایج البته باز هم مشابه بلوک ResNet اصلی نشد. علاوه بر آن نیاز به تنظیم دقیقی از مقادیر هایپرپارامترها داشت ات نتایج قابل قبولی را کسب کند. قسمت(d (مشابه قسمت(c (استبا این تفاوت که ساختار گیتمانند فقط بر روی مسیر جانبی عمل می کند. نتایج نیز مشابه قسمت قبل است. نیاز به تنظیم هایپرپارامترها دارد و البته از بلوک ResNet اصلی نیز ضعیف تر عمل می کند. بخش(e (نیز همان حرف بخش(d (را میزند اما با زبانی کمی متفاوت تر. در واقعا به جای ساختار گیت مانند صرفا از یک کانولوشن ۱ در ۱ استفاده می شود. نتایج این بخش در صورتی خوب است که تعداد بلوک های residual زیاد نباشد و در صورت زیاد بودن نتایج ضعیف تر می شود. بخش (f (نیز از dropout) با نرخ ۰ .۵ (در مسیر جانبی استفاده کرده است .

مشابه بخش (b (می باشد که ورودی مسیر جانبی در یک عدد ثابت ضرب شده است و البته نتایج نیز قابل قبول نیست. به صورت کلی و برای جمع بندی می توان این طور گفت که مسیر جانبی اگر بدون هیچ مانعی باشد و اطلاعات به صورت مستقیم جریان یابد، نتایج خروجی بهتر است و در این ۶ مورد نیز در نهایت بلوک ResNet اصلی بهترین نتایج را کسب کرد. این موضوع نشان می دهد که با پیچیده تر نکردن مسیر جانبی ، الگوریتم بهینه سازی توانسته است مسیرهای بهتری را برای نقاط مینیمم پیدا کند و در نتیجه خروجی بهتری حاصل کند.

ResNeXt بلوک ۳ .۴ بهبود بعدی در مورد ResNet معرفی ایده بلوک ResNeXt است که در آن یک بلوک ResNet به تعدادی مسیرهای موازی تجزیه می شود که طوری که تعداد پارامترها افزایش نیابد. در واقع در این حالت همزمان با ثابت ماندن تعداد پارامترها و بدون پیچیده تر کردن آن ، دقت را افزایشمی دهند. ایده مورد استفاده در این مقاله همان استراتژی merge-transform-split است که در نرون های عادی و معماری Inception نیز مشاهده شده است. یک بلاک ResNeXt در شکل ۷ نشان داده شده است. در این تصویر بلاک سمت چپ همان بلاک ResNet معمولی است و بلاک سمت راست

نیز یک بلاک ResNeXt است. مشاهده می شود که لایه اول کانولوشنی در بلاک ResNet به صورت تعدادی مسیری موازی تبدیل شده است و لایه های کانولوشنی بعدی بدون هیچ گونه تغییری در مسیرهای موازی قرار گرفته اند. تعداد این مسیرهای موازی با کلمه کلیدی -Car dinality در مقاله معرفی شده است و در اینجا برای این که دو بلوک به لحاظ تعداد پارامترها مساوی باشند مقدار Cardinality یا به اختصار C برابر عدد ۳۲ در نظر گرفته شده است و عمق خروجی که در بلوک اصلی ResNet برای لایه کانولوشنی برابر ۶۴ بوده است در بلوک ResNext برابر ۴ می شود. همین تغییر ساده باعث می شود که نتایج بهتر شود و البته به لحاظ پیچیدگی نیز شبکه پیچیدگی بیشتری نداشته باشد. بر خلاف معماری Inception که هر چه این مسیرهای موازی بیشتر می شدند به تعداد پارامترها افزوده می شد و چالشهای مخصوصبه خود را همراه داشت. نتایج نیز جالب توجه بود و در حالی که خطا برای معماری ۱۰۱-ResNet برابر ۲۲ ٪ بود در معماری ۱۰۱-ResNeXt این خطا به عدد ۲۱ .۲ ٪ کاهش یافت. علاوه بر آن نویسندگان مقاله نیز با دو برابر کردن FLOPS از ۳ طریق مختلف نتایج را مقایسه کردند. به عبارتی یک بار عمق را اضافه کردند. یک بار به پهنا و عرض شبکه افزودند و بار دیگر پارامتر C را افزایش دادند و به این شکل پیچیدگی شبکه را دو برابر کردند. بازهم نتیجه جالب بود و معماری ResNeXt نتایج بهتری را کسب کرد.

نتیجه گیری

در این گزارش ایده درخشان معماری ResNet به تفصیل مورد بحث و بررسی قرار گرفت و مشاهده کردیم که چطور اضافه کردن یک مسیرجانبی می تواند به ساده تر شدن تابع هزینه کمک بسیاری کند و باعث شود که مشکل تنزل یا degradation حل گردد و شبکه هایی با هر عمقی را طراحی کنیم و مشکل عمق شبکه رفع شود. در گام بعد تلاش ها در زمینه بهبود بلوک ResNet معرفی گردید که مشاهده شد که چگونه ساده تر کردن مسیر جانبی و عدم قرارگیری تابع فعال سازی در مسیر جانبی نتایج را بهتر می کند. در انتها نیز ایده ResNeXt مورد بررسی قرار گرفت و با معرفی پارامتر Cardinality بدون اضافه کردن پیچیدگی به مساله نتایج قبلی بهبود داده شد.

شبکه‌های عصبییادگیری عمیق
شاید از این پست‌ها خوشتان بیاید