مقاله رزنت از پایه ای ترین مقالات منتشر شده در زمینه بینایی کامپیوتر است. سایتیشن این مقاله تا به امروز به بیش از 17 هزار عدد رسیده است. شایان ذکر است که این مقاله اعتبار زیادی را برای نویسندگان خود به همراه داشته است. طبق تجربه ای که در مطالعه باقی مقالات داشتم این معماری به عنوان یک شبکه استاندارد برای تست گرفتن در مقالات استفاده می شود، یعنی اگر معماری جدیدی نیاز به شبکه ای برای استخراج ویژگی داشته باشد از این شبکه بهره می برد. در صنعت نیز اگر نیاز به یک استخراج کننده ویژگی باشد احتمال استفاده از این شبکه وجود دارد.
در این پست میخواهم این مقاله را بررسی کنم، زیرا طبق تجربه، مطالعه این مقاله برای هر پژوهشگر و مهندس هوش مصنوعی الزامی است. میتوانید مقاله اصلی را از لینک زیر بارگیری کنید.
https://arxiv.org/abs/1512.03385
در این مقاله شبکهای ارائه میشود که از شبکههای پر استفاده در دنیای بینایی ماشین است. در خلاصهی این مقاله آمده است که اگر بخواهیم شبکهای را عمیقتر کنیم، بدیهی است که آموزش آن دشوارتر میشود اما ایدهای که مطرح شده است باعث میشود ما بتوانیم شبکه را عمیقتر و همزمان آموزش آن را نیز راحت و سریعتر کنیم. این شبکه با این که دارای 152 لایه درون خود است، 8 برابر سریعتر از شبکهی سنگین VGG است و از پیچیدگی کمتری نیز برخوردار است. قابل ذکر است که شبکهی VGG دارای 19 لایه بود که حدود 144 میلیون پارامتر برای آموزش داشت در حالیکه این شبکه با 152 لایه فقط 60 میلیون پارامتر آموزشی دارد. ورژنهای سبک تری نیز به صورت از پیش آموزش دیده در کراس یا پایتورچ وجود دارد. در این مقاله اشاره میشود که بر روی دیتاست CIFAR-10 حتی تا 100 و 1000 لایه نیز ترین شده است که به نتایج جالبی رسیدهاند . مقاله با این سوال ایده میگیرد:
آیا با اضافه کردن لایههای بیشتر به مدل بهتری میرسیم؟
برای پاسخ به این سوال، نویسندههای این مقاله دو شبکه را که یکی 20 لایه و دیگری 52 لایه داشت را مورد بررسی قرار دارند. در شکل نتایج آموزش این دو شبکه را بر روی دیتاست CIFAR-10 مشاهده میکنید. اگر به خطای آموزشی دو شبکه دقت کنید، شبکهی عمیقتر خطای بالاتری دارد و این برای خطای تست نیز صدق میکند [3]. نویسندگان این مقاله معتقدند که محو یا انفجار گرادیان که قبلا هم توضیح داده شد علت این امر است و گفته شد که با مقداردهی اولیهی درست و بچ نرمالیزیشن این مشکل حل تا حدودی حل خواهد شد. در کل میتوان گفت که شبکهی کم عمق در اینجا بهتر عمل کردهاست.
در مقاله تصریح شده است که مشکلی که ایجاد شده بیشبرازش نیست، زیرا در بیشبرازش ما با کاهش خطای دادههای آموزشی و افزایش خطای دادههای تست طرفیم.
یک ساختار کم عمق و یک ساختار عمیقتر که با اضافه کردن چند لایه به ساختار کم عمق بدست آمده را در نظر بگیرید. فرض کنید شبکه کمعمق به خوبی بر روی دیتاست فرضی ما آموزش دیده و دارای دقت مناسبی است. پس منطقی است که اگر شبکه عمیقتر که دارای چند لایه اضافی است را با شرایط مشابه شبکه اول آموزش دهیم انتظار داشته باشیم بهینهساز شبکه، اثر وزنهای چندلایه اضافی را به شکلی خنثی کند که این چند لایه اضافه شده تاثیری بر شبکه نداشته باشند یا به عبارتی همانی شوند. می توان گفت تا آن لایههایی که شرایط مشابه با شبکه کمعمق دارد به شکل یکسان آموزش ببینند و لایههایی که بدون دلیل به انتهای شبکه دوم اضافه کردیم به صورت یک نگاشت همانی اثر بگذارند تا اثری نداشته باشند. پس حداقل انتظار ما این است که با افزایش عمق شبکه، دقت تغییری نکند ولی در تصویر 1 مشاهده میشود که دقت کاهش مییابد.
مشکل اینجاست که بهینهسازهای امروزه توانایی این کار را ندارند که لایههای که به آنها نیاز ندارند را به شکل نگاشت همانی دربیاورند زیرا لایههایی که پشت هم قرار میدهیم ذاتا وظیفه ایجاد یک تابع غیرخطی را دارند و ایجاد یک نگاشت خطی از آنها بسیار مشکل است . نویسندگان این مقاله بلوکهای سازندهای تحت عنوان Residual Block معرفی کردند که توانایی ایجاد یک نگاشت خطی در خروجی را دارند. به تصویر زیر دقت کنید. تابع F(x) مثل همیشه در حال ایجاد ویژگی غیرخطی است. در اینجا با اضافه کردن یک Skip Connection به خروجی لایه دوم که وظیفه دارد F(x) را با x جمع کند، میتوان به یک نتیجه بهتر رسید. دقت شود تابع فعالیت ReLU پس از جمع اعمال خواهد شد.
پس با این ساختار جدید بهینهساز شبکه توانایی این را دارد که در صورت نیاز F(x) را برابر صفر کنید و صرفا ورودی بلاک را به تابع فعالیت وارد کند. با این حساب اگر لایههای بیشتری به مدل اضافه شود 2 حالت پیش میآید:
1. این لایهها ویژگی جدید به مدل اضافه نمیکنند و F(x) آنها برابر صفر در نظر گرفته میشود تا همانطور که قبلا اشاره شد باعث کاهش دقت شبکه نشوند.
2. این لایهها ویژگی جدیدی از دیتا پیدا کرده و بهینهساز نگاشت F(x) را ایجاد کرده تا با نگاشت همانی جمع کند و به لایههای دیگر تزریق کند.
حالا با استفاده از Residual Blockها میتوان شبکهی جدید را پیریزی کرد. در شکل یک ResNet دارای 34 لایه را میبینیم که شبکههای کانولوشن مانند یک شبکه عادی پشت سرهم اعمال شده اند با این تفاوت که این شبکه دارای Skip-connection هایی پس از هر 2 لایه است. درست پس از هر لایه کانولوشنال، قبل از اعمال تابع فعالیت ReLU از Batch Normalization استفاده شده است. SGD به عنوان بهینهساز با مینی بچ 256 انتخاب شده است. میتوان باقی هایپرپارامترها را در مقاله اصلی مشاهده کرد .
طبق تصویر 3 در ساختار Residual با عبور از هر دولایه یک Skip connection خواهیم رسید. در مقاله تصریح شده است که با این کار صرفا به یک ساختار بهینهتر و سریعتر خواهیم رسید و این Residual Block ها هیچ پیچیدگی یا پارامتر آموزش پذیر اضافهای نسبت به شبکه VGG ندارد و تنها با تغییر معماری، شبکهی بهینهتری طراحی شده است . پس میتوان گفت که ResNet با افزایش دیوانهوار عمق شبکه به کمک طراحی خاص خودش توانست دقت مدل را روی دیتاست ImageNet افزایش دهد و مشکلات مدلهای قبل را پشت سر بگذارد. توجه شود خروجی F(x) حاصل از تاثیر 2 کرنل کانولوشن است که روی ورودی اثر گذاشتهاند. میدانیم که تاثیر کرنلها همراه با stride به کاهش سایز فیچرمپ میانجامد و این هم سایز نبودن xو F(x) میتواند برای زمانیکه بخواهیم این دو را جمع کنیم دردسر باشد. برای همین سایز فیچرمپ حاصل از کرنلها را بوسیله Zero-Padding افرایش میدهیم.
نکتهی دیگری که باقی میماند مقایسه خطای دو شبکهی plain و ResNet است که به صورت نمودار در تصویر 4 نشان داده شده است. واضح است که اگر Skip-connection ها را از شبکهی ResNet حذف کنیم، شبکه plain باقی میماند. خطوط نازک مربوط به خطای آموزشی یا Training Error و خطوط پررنگتر به Test Error هر شبکه مربوط است. در نمودار سمت چپ به صورت کلی هم خطای دادههای تست و هم خطای آموزشی بیشتر از حالت کم عمق تر است که قبلا هم ذکر شد اما در شبکهی ResNet با عمیقتر شدن شبکه ناظر به کاهش خطای شبکه هستیم. اگر به خطای دو شبکه در Iteration برابر با 50 دقت کنیم، میبینیم که خطای ResNet به طرز قابل محسوسی کمتر از شبکه plain است.