معرفی AlexNet و یا: زمانی که یادگیری عمیق رسما متولد شد.

سال ۲۰۱۲ آقای Alex Krizhevsky به همراه Ilya Sutskever و  Geoffrey E. Hinton مقاله‌ای ۸ صفحه‌ای منتشر می‌کنن که عنوانش هست “ImageNet Classification with Deep Convolutional Neural Networks” و با معرفی AlexNet دروازه‌ی ورود به نارنیان رو  جلو راه پژوهشگران بینایی ماشین قرار می‌دن.

در اون زمان AlexNet رو روی مسابقه‌ی  ImageNet تست کردن و با CNN که طراحی کرده بودن میان  و Top-5 error rate رو به ۱۵٫۳٪ کاهش می‌دن، در حالی که خطای نزدیک‌ترین رقیب اون‌ها ۲۶٫۲٪ بوده.

و این اختلاف فاحش بود پژوهش‌گرها رو متوجه کاربرد یادگیری عمیق در پردازش تصویر کرد. و میشه گفت با  AlexNet  یادگیری عمیق متولد شد!*

*نه که قبلا نبوده اماAlexNet اولین کاربرد و نمایش برتری شبکه‌های ژرف هست.

در ادامه این نوشته مروری خواهیم داشت بر معماری یکی از معروف‌ترین شبکه‌‌های عصبی عمیق: AlexNet و  با هم مفاهیمی که در اون مقاله مطرح شده‌اند رو بررسی می‌کنیم.

ورودی:

AlexNet برنده‌ی مسابقه‌ی  طبقه‌بندی تصاویر ILSVRC سال ۲۰۱۲ شد، در اون مسابقه به شما یک عکس از بین ۱۰۰۰ نوع مختلف (Label) ورودی (به عنوان مثال سگ، گربه یا …) داده می‌شه و خروجی شما یک بردار ۱۰۰۰ عنصریه که جمع تمامی عناصر این بردار ۱ می‌شه. یعنی هر المان این بردار بیانگر احتمال تعلق عکس ورودی به اون کلاس هست.

ورودی AlexNet تصاویر RGB در اندازه‌ی ۲۵۶×۲۵۶ هستن و اگر تصاویر در اندازه‌ای غیر این باشن باید تصویر رو تغییر اندازه بدیم تا سایزش دقیقا ۲۵۶×۲۵۶ بشه.

برای این منظور از بین طول و یا عرض تصویر کوچک‌ترین اون رو انتخاب می‌کنیم و تصویر  تغییر اندازه داده می‌شه تا اندازه‌ی بعُد کوچیکتر به  ۲۵۶ پیکسل برسه. بعُد دیگه هم از مرکز برش داده می‌شه تا تصویر به اندازه‌ی ۲۵۶×۲۵۶ در بیاد.

نمونه‌ای از این تغییر اندازه و برش رو در تصویر زیر می‌بینید.

همچین اگر تصویر ورودی سیاه و سفید (grayscale) باشه با ۳ بار تکرار کانال رنگی‌ای که داریم یک تصویر RGB می‌سازیم.

در  گام بعد تصاویر  ۲۵۶×۲۵۶ به شکل تصادفی برش زده می‌شن تا به سایز  227×227 در بیان، این سایز ورودی لایه‌ی اول AlexNet است.

در مقاله‌ی اصلی اشاره می‌کنن که بجز همین تغییر اندازه و برش هیچ پیش‌پردازش دیگه‌ای روی تصاویر انجام نمیشه.

معماری AlexNet:

AlexNet نسبت به شبکه‌های CNNی که قبل از اون‌ها برای پردازش تصویر استفاده شدن (یه عنوان مثال Yann LeCun’s LeNet paper in 1998) بسیار بزرگ‌تر (عمیق‌تر) است.

در اینجا یک شبکه با ۶۵۰.۰۰۰ نرون داریم و باید مقدار ۶۰ میلیون پارامتر رو  مقدار دهی بهینه کنیم، در سال ۲۰۱۲ که مقاله نوشته می‌شهAlex Krizhevsky و همکارانش از ۲ عدد کارت گرافیک GTX 580 3GB استفاده می‌کنن. در زمانی که  AlexNet معرفی شد پایگاه داده‌ی ImageNet شامل ۱٫۲ میلیون عکس بوده و با این مقدار عکس و قدرت پردازشی GPUهایی که داشتن  آموزش شبکه ۶ روز  طول می‌کشه.

بذارید با همنگاهی بندازیم به لایه‌های مختلف AlexNet، در مقاله‌ی اصلی چنین چیزی رو خواهید دید:

در تصویر بالا دوتا شبکه‌ی عین هم داریم که به شکل موازی بر روی دوتا کارت گرافیک آموزش می‌بینن. همچنین اگر دقت کنید سایز ورودی لایه‌ی اول ۲۲۴×۲۲۴ نوشته شده که اشتباهه و باید ۲۲۷×۲۲۷ باشه.

اون شبکه‌ها ساختاری مشابه تصویر زیر دارن:

همون طور که در تصویر بالا مشخصه AlexNet از ۵ لایه‌ی Convolutional و ۳ لایه‌ی Fully Connected تشکیل شده.

معرفی ساختار و چیدمان لایه‌ها:

لایه‌های Convolutional با سایزهای مختلف همون فیلترهایی هستن که وظیفه‌ی استخراج Futureها از عکس ورودی رو دارن. اصولا هر لایه‌ی Convolutional از تعداد زیادی کرنل هم‌سایز تشکیل میشه، به عنوان مثال لایه‌ی اول AlexNet از ۹۶ کرنل با سایز 11x11x3 تشکیل شده.

به شکل خلاصه:

دوتا لایه‌ی اول Convolutional هستن که بعد از هر کدوم یک لایه‌ی Overlapping Max Pooling داریم (وظیفه‌ی این لایه بعدا شرح داده میشه)، لایه‌های ۳ و ۴ و ۵  Convolutional هستن، بعد از لایه‌ی ۵اوم مجددا یک Overlapping Max Pooling داریم،  بعد دولایه‌ی fully connected و در انتها softmax classifier رو داریم که مشخص می‌کنه عکس داده شده با چه احتمالی به کدوم یک از ۱۰۰۰ Label تعلق داره.

بعد از هر لایه‌ی Convolutional و  fully connected یک بار هم از تابع فعال‌ساز ReLU استفاده شده و بعد از هر کدوم از لایه‌های اول و دوم یک local normalization قرار داده شده. [اما بعدا متوجه می‌شن که این local normalization  آنچنان خاصیتی هم نداره و کلا چه کاریه کلی پردازش به سیستم اضافه کنیم؟ پس ما هم اگر خواستیم شبکه‌ی خودمون رو طراحی کنیم بهتره بیخیال local normalization  شیم:)]

سوالی که اینجا داریم اینه که چرا این تعداد لایه‌ها و چرا این عمیق و شکل؟ مشخصا هیچ جوابی براش نیست! هنوز کسی از اینکه دقیقا داخل شبکه‌های ژرف چی میگذه اطلاع نداره و برای همین تعداد و ترکیب لایه‌ها و سایز فیلتر‌ها و … یک سری هایپرپارامتر هستن که با آزمون و خطا و توکل الی الله به دست میان.

[البته یک سری قواعد داریم اما واقعا نمیشه گفت چرا این معماری جواب می‌ده، به عنوان مثال در مقاله‌ی اصلی اشاره می‌کنن که:

this depth seems to be important: we found that removing any convolutional layer (each of which contains no more than 1% of the model’s parameters) resulted in inferior performance.

یعنی چند بار آزمون و خطا و ۶ روز صبر تا بالاخره نتیجه می‌گیرن که همین خوبه مقاله رو چاپ کنیم بریم به زندگیمون برسیم.]

چرا Overlapping Max Pooling؟

کاربرد  لایه‌های Max Pooling اینه که عرض و ارتفاع tensorها* رو تغییر می‌ده اما عمق رو ثابت نگه می داره.

Pooling layers in CNNs summarize the outputs of neighboring groups of neurons in the same kernel map.

[ *بعد از اولین لایه‌ی Convolutional دیگه عکس به اون معنی‌ای که ما میشناختیم که نداریم! اینجا دیگه یک تصویر ۳ کاناله‌ی x×y در کار نیست، پس بیاید بهشون بگیم tensor :)]

Overlapping Max Pool مثل همون  Max Pool است اما با این تفاوت که اون پنجره‌هایی که دارن جا به جا می‌شن (adjacent windows) روی هم overlap می‌شن.

نویسنده‌های مقاله اومدن و از Overlapping Max Pool معمولی با سایز  ۲×۲ و stride به اندازه‌ی ۲ استفاده کردن دیدن خطای top-1 به مقدار ۰٫۴٪ و خطای top-5 به مقدار ۰٫۳٪ نسبت به حالتی که از Max Pool نرمال با سایز ۲×۲ و stride به اندازه‌ی ۲ استفاده می‌کردن کمتر می‌شه. [بازم آزمون و خطا.]

ReLU Nonlinearity:

یکی از اون نکات مهم در AlexNet استفاده از ReLU(Rectified Linear Unit) Nonlinearity هست.

تا قبل از AlexNet خلق الله عادت داشت از Tanh یا sigmoid برای آموزش شبکه‌های عصبیشون استفاده کنن. اما استفاده از ReLU بجای  Tanh یا sigmoid باعث افزایش سرعت آموزش شبکه می‌شه و میشه گفت که امروزه استفاده از ReLU به یک استاندارد تبدیل شده.

نویسنده‌ها میان و از AlexNet روی دیتاست CIFAR-10 استفاده می‌کنن و نشون می‌دن که صرفا استفاده از ReLU باعث میشه تا با سرعت ۶ برابر بیشتر نسبت به وقتی که از Tanh استفاده می‌کنن به دقت ۲۵٪ خطای آموزش برسن.

نگاه‌ی دقت‌تر  به این که چرا ReLU سریع‌تره:

شکل تابع ReLu ساده‌‌س: اگر مقدار مثبت بود خودش اگر منفی بود صفر

ReLu(x) = max(0,x)

بیاید  ReLu رو با Tanh مقایسه کنیم:

 

تابع Tanh مقادیر خیلی زیاد و یا خیلی کم رو  به محدوده‌ی −۱ تا ۱ میاره و  این می‌تونه سرعت گرادیان نزولی رو کم کنه.

اون سمت قضیه ReLu رو داریم که کلا مقادیر مثبت رو نگه می‌داره و خیلی راحت بقیه رو می‌ریزه دور و این کمک می‌کنه که تابع بهینه‌سازیمون خیلی سریع‌تر همگرا شه.

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

در مقایسه با تابع sigmoid هم علت برتری ReLu دقیقا همینه.

[اگر در مورد این توابع فعال سازی و اهمیت اون‌ها سوال دارید پیشنهاد من ویديوهای کلاس در CS231 استنفورد هست.]

چطور در  AlexNet احتمال Overfitting رو کم کردن؟

Overfitting وقتی بود که شکبه‌ی عصبی ما هرچی بیشتر آموزش می‌بینه خطای آموزشش کم‌تر و کم‌تر می‌شه اما از اون سمت خطای تست افزایش پیدا می‌کنه، یعنی خطای شبکه برای تصاویری که قبلا دیده کم میشه اما عمویمت خودش رو از دست می‌ده و وقتی بهش تصاویر جدیدی نمایش می‌دیدم دقتش پایین میاد.

برای جلوگیری ازOverfitting دوتا کار انجام دادن، یکی Data Augmentation  و راه‌کار دیگه Dropout.

Data Augmentation:

ورژن‌های مختلفی از عکس ورودی رو به شبکه نشون می‌دن، مثلا اگر یک گربه داریم کافیه تصویر رو Mirror کنیم، گربه همون گربه‌س اما کل چینش پیکسل‌ها تغییر کرده و ما یه عکس جدید گربه ساختیم.

اگر یادتون باشه تصاویر اصلی سایز ۲۵۶×۲۵۶ داشتن که به شکل تصادفی به سایز ۲۲۷×۲۲۷ برش زده می‌شن، همین برش تصادقی باعث می‌شه که تعداد عکس‌های ورودی تا ۲۰۴۸حالت مختلف (بسته به محل برش) افزایش  پیدا کنه.

شکل زیر رو ببنید،‌ گربه همون گربه‌س اما کل محل پیکسل‌ها تغییر کرده و برای شبکه‌ی عصبی این یک تصویر  جدید به حساب میاد.

آخرین کاری که برای افزایش تنوع و سایز در دیتاست می‌کنن اینه که کانال‌های تصویر RGB رو با استفاده از PCA افزایش می‌دن.

[چون خودم PCA رو هنوز نخوندم طبیعتا نمی‌تونم توضیح بدم یعنی چی!  شما خودتون به مقاله‌ی اصلی رجوع کنید و بیاید به منم بگید دقیقا چیکار کردن.]

Dropout:

Dropout از نظر من یکی از باحال‌ترین کارهایی هست که میشه انجام داد،Dropout بار اول در سال ۲۰۱۲ توسط G.E. Hinton [در +این مقاله] معرفی می‌شه و در  AlexNet هم ازش بهره می‌برن.

Dropout یعنی به شکل تصادفی هر بار ارتباط یک سری از نرون‌ها رو قطع کنیم! اینطوری شبکه مجبور می‌شه ویژگی‌های بهتری رو یاد چون مثلا نمی‌تونن بگن اگر سیبیل داشت گربه‌س و خلاص! ممکنه ارتباطمون رو با اون نرون تشخیص سبیل قطع شه و دستمون بمونه تو پوست گردو!

در AlexNet با احتمال ۰٫۵ عمل Dropout انجام می‌شه. باید دقت کنیم که نرخ ۰٫۵ یعنی  ۲ برابر شدن زمان لازم برای آموزش شبکه عصبی! اما بدون  Dropout شبکه‌ی AlexNet خیلی سریع  overfit میشه.

سایر جزییات پیاده سازی:

مقادیر پارامترهایی که اون زمان برای آموزش شبکه استفاده شده به شکل زیر بوده:

We trained our models using stochastic gradient descent with a batch size of 128 examples, momentum of 0.9, and weight decay of 0.0005.

منابع: 

این پست وبلاگ در اصل ترجمه‌ای آزاد با دخل و تصرف فراوان از وبلاگ زیر است و اکثر تصاویر از همون وبلاگ برداشته شده:

Understanding AlexNet

مقاله اصلی AlexNet:

ImageNet Classification with Deep Convolutional Neural Networks

 


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

موارد مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *