یادگیری عمیق یا Deep learning چیست؟ 

رحمن الرحیم

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

مطالبی که در زیر میاد مفاهیم و کلیاتی هست که باید بلد باشیم یا حداقل یه ایده کلی داشته باشیم (هرچند پیش نیاز یادگیری عمیق ,‌یادگیری ماشین هست و بسته به کار بینایی کامپیوتر هم ممکنه وارد بشه بیشتر بعدا توضیح میدم) بدون دونستن این مفاهیم نمیشه تو این زمینه کار کرد مگر اینکه بخواییم استفاده کننده صرف باشیم و مثلا از متلب یا کافی و یا تورچ و…. بعنوان ابزار استفاده کنیم که باز هم یه حداقل رو باید بدونیم . کسایی که از هوش مصنوعی میان و یادگیری ماشین رو احتمالا پاس کردن قاءدتا مشکلی نباید داشته باشن. بچه های نرم افزار لازمه بدونن . شبکه های عصبی هم باید آشنا باشید. اگه تسلط داشته باشید که چه بهتر. من سعی میکنم به مرور زمان تو همه این مباحث صحبت کنم و مطلب بزارم و توضیح بدم ولی خب ممکنه طول بکشه. اینجا یک کمی بصورت مختصر این مفاهیم رو توضیح میدم و بعدا بصورت مبسوط تو پست های دیگه توضیحات تکمیلی داده میشن.

اگه مطالب این پست رو نخوندید بخونید بعد بیایید اینو بخونید

مفاهیم اصلی

یادگیری ماشین یا Machine Leaning

یادگیری ماشین یکی از مفاهیم اصلی هست که باید بلد باشیم بطور خلاصه تو یادگیری ماشین, ما یکسری داده داریم(دیتاست) و بعد با استفاده از یک مدل میایم و مدلمون رو با استفاده از این داده ها (دیتاست) آموزش میدیم یا اصطلاحا train میکنیم.بعد از اینکه مدلمون رو آموزش دادیم از اون برای پیش بینی بر روی داده های جدید استفاده میکنیم . یکم سخت شد؟ بزارید واضحتر توضیح بدم . تو ماشین لرنینگ سعی ما اینه که به ماشین (کامپیوتر) آموزش بدیم تا یه کار خاصی رو انجام بده .مثل اینکه به یه بچه داریم یه چیزی رو یاد میدیم.  مثلا ما میاییم تعداد خیلی زیادی عکس گربه و تعداد خیلی زیادی عکس غیر گربه (هرچیزی میتونه باشه مثل عکس دیوار عکس خرس عکس آدم و…) رو جمع میکنیم بعد یه مدل طراحی میکنیم (فرض کنید طراحی کردیم این الان مهم نیست) . حالا میایم به کامپیوتر یکی یکی عکسارو نشون میدیم میگم این عکس گربه اس این یکی عکس گربه نیست و این کارو انقدر انجام میدیم تا تمام تصاویر تموم بشن. و این عمل رو چند بار تکرار میکنیم . نهایتا بعد از اینکار کامپیوتر یاد میگیره که گربه چی هست و اگر عکس جدیدی از گربه که تا بحال بهش نشون نداده باشیم رو بهش نشون بدیم اون باید بتونه تشخیص بده و بگه آیا این عکس یه گربه هست یا نه . این یه مثال خیلی ساده بود انشاالله در بخش منابع یا بعداز اینکه یکسری اطلاعات اولیه در مورد دیپ لرنینگ دادم منابع و نحوه خوندن و پیشرفتن تو این موضوع رو هم میگم .(البته منابع الان نسبت به موقعی که من شروع کردم الحمدالله بیشتر شده و من اونها رو هم مینویسم تا جایی که پیدا کردم اما مسیری که خودم رفتم رو توضیح میدم چون قدم به قدمش تست شده هست.و پیش نیازها رعایت شده) به هر حال برگردیم سر موضوع اصلی.

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

فرآیند یادگیری یه فرایند رفت و برگشت هست که در فضای پارامتری انجام میشه.این یعنی چی؟ بالا توضیح دادم که ما یه عکس ورودی میدیم به سیستممون (مدلمون) و بعد اون یکسری کارا روش انجام میده و بعد به یه نتیجه ای میرسه این نتیجه یا درسته یا غلط و اگر غلط باشه سیستم باید یه جوری تنظیم بشه که این اشتباه از بین بره و اینجا گفتیم که نتیجه درست بصورت یک بازخورد به سیستم داده میشه (از همون انتهای سیستم که پیش بینی انجام شد این بازخورد اونجا دریافت میشه و بعد از آخر به ابتدای سیستم سعی میشه تنظیمات مورد نظر در سیستم داده بشه . ) خب چجوری این تنظیمات باید انجام بشه ؟ این سیستم ما (که بعدا ما بهش میگیم شبکه (که باز میفهمیم چرا میگیم شبکه!) یکسری متغییر داره , رو هوا که کار نمیکنه! یکسری متغییر وجود داره که عملیاتها روی اونها انجام میشه و نتایج ذخیره میشه و الخ. به این متغیرها ما میگیم پارامتر و وقتی میگیم فضای پارامتری منظور ما اعمال تغییرات در این پارامترهاس (بعدا بیشتر اینو باز میکنیم و توضیح میدیم وقتی وارد شبکه های عصبی و کانولوشن شدیم انشاالله بیشتر میفهمیم که فضای پارامتری به چی میگن ولی تا اینجا فک کنم کفایت کنه ) .

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

مهندسی ویژگی یا همون Feature Engineering

مهندسی ویژگی یا همون فیچر اینجیرینگ! یعنی استخراج الگوهای مناسب از داده ها که به مدلهای یادگیری ماشین کمک میکنه تا راحت تر بین دسته ها یا کلاسهای مختلف موجود در داده ها تمایز قائل بشن. یعنی چی ؟ یعنی اینکه شما سعی کنید تو داده هایی که دارید یک سری الگوی مشترک پیدا کنید و بعد از همون الگوها برای دسته بندی و یا انجام کار خاصی روی اون داده ها استفاده کنید. بعنوان مثال فرض کنید شما تعداد پیکسلهای سبز و آبی رو بعنوان یک نشونه برای تشخیص اینکه یک حیوان آبزی یا زمینی در تصویر وجود داره یا نه درنظر بگیرید.این ویژگی برای این دلیل برای یه مدل یادگیری ماشین مفیده چرا که تعداد دسته ها( معمولا میگیم کلاسها)ییکه باید برای یه دسته بندی خوب در نظر گرفته بشه رو کاهش میده. البته چندان ویژگی خوبی هم نیست! فرض کنید تو اسمون آبی شما بخوایید از یه پرنده عکس بگیرید! اونوقت با توجه به این الگو سیستم بشما میگه این یه موجود آبزی جدید!! هست! که ما البته میدونیم نیست!! و یا برعکس بریم ته رودخونه یه عکس از یه وزغ یا حتی ماهی بگیریم که کنار یکسری جلبک!! نشسته! خب باز سیستم میگه شما الان داری به یه موجود زمینی (منظورم غیرآبزیه!) نگاه میکنید!!. همین یه مثال نشون میده که مهندسی ویژگی چندان کار ساده ای نیست. و اگه بیشتر تحقیق کنید میبینید که بَـــلــــه! مهندسی ویژگی مثل  هنریه برای خودش! و کار خیلی سختی هم هست .

مهندسی ویژگی مهمترین مهارتی هست که شما برای بدست آوردن نتایج خوب در کارهای مربوط به پیش بینی و… تو حوزه یادگیری ماشین لازم دارید.متاسفانه همونطور که بصورت خیلی ابتدایی بالا دیدیم یادگیری و تسلط پیدا کردن تو این حوزه خیلی سخته چون دیتاست های مختلف و داده های مختلف هرکدوم روشهای خاصی برای مهندسی ویژگی دارن و فقط یکسری قواعد کلی برای این کار وجود داره  که همونطور که گفتم بیشتر یک هنره که طی کار و تجربه زیاد یک نفر بدست میاره.ویژگی هایی که برای یه دیتاست قابل استفاده است برای دیتاستهای دیگه قابل استفاده نیست مثلا فرض کنید ما برای دیتاست حیوانات دریایی مهندسی ویژگی رو انجام دادیم و دیتاست دیتاست بعدی فقط دارای عکس حیونات غیرآبی باشه.! البته من خودم حوزه کاریم ماشین لرنینگ نبوده من مهندسی نرم افزار خوندم و اخیرا به این حوزه کشیده شدم و صحبتهایی که میکنم بیشتر از منابع و چیزهایی هست که دیدم و خودم تا بحال بصورت دستی (به غیر از یکی دو کورس کامیپوتر ویژن که تو دانشگاه داشتم چیزی طراحی نکردم اونم در حد ۴ ۵ تا فیلتر گابور و سوبل که اونم طراحی ما نبوده صرفا استفاده کردیم مثل کلاس اولیا!) کاری نکردم. شما هم قرار نیست کاری بکنید چون قراره این کار طاقت فرسا رو بدیم کامپیوتر برای ما انجام بده و بخوبی هم از پس این کار بر میاد(حالا خودتون میبنید).

 .(kaggle یکی از سایتهایی هست که برای یادگیری ماشین فوق العاده است رقابت ها و آموزش های خوبی داره و میشه تجربه خیلی خوبی ازش کسب کرد)

یادگیری ویژگی یا Feature Learning

الگوریتم های یادگیری ویژگی برای پیدا کردن و استخراج خودکار الگوهای مشترک استفاده میشن تا از ویژگیهای استخراج شده در فراینده های دسته بندی (کِلَسیفیکیشن!) و رگرسیون (رگرشن!) استفاده بشه.یادگیری ویژگی یا همون feature learning رو میشه بعنوان همون مهندسی ویژگی ای دید که بصورت خودکار داره توسط یه الگوریتم انجام میشه.

تو یادگیری عمیق,  ما روشهای مختلفی داریم یکی از اون روش ها استفاده از شبکه های عصبی کانولوشنی هست که الان بهش میگن همون شبکه کانولوشن بعدا به تفصیل در مورد این شبکه و لایه هاش و… توضیح میدم انشاالله اما فعلا همینقدر بدونید که اساس این شبکه , لایه کانولوشنی اون هست (برای همین بهش میگم شبکه کانولوشنی!) .لایه های کانولوشنی یا اصطلاحا convolutional layers تو پیدا کردن ویژگی های موجود در تصاویر خیلی خوب عمل میکنن و اگه تعدادی از این لایه ها رو پشت سر هم قرار بدیم بطور حیرت آوری یه سلسله مراتب از ویژگی های غیر خطی رو یاد میگیرند. یعنی در لایه های ابتدایی مثلا گوشه ها و خطها و لبه ها یادگرفته میشن و بعد از اون به ترتیب ویژگی های سطح بالاتر یادگرفته میشن مثلا اگر تصویر ورودی ما تصویر یک صورت باشه ویژگی هایی مثل بینی, چشمها, گونه ها و صورت در لایه های بعدی (بالاتر) یاد گرفته میشن.در آخر هم لایه های نهایی از این ویژگی های تولید شده برای دسته بندی (کلسیفیکیشن) و یا رگرسیون (رگرشن) استفاده میکنند.(بعدا بصورت کامل در مورد این نوع از شبکه و زیر و بم و همه داستانهاش صحبت میکنیم)

سلسله مراتب ویژگی ها

همونطور که در تصویر بالا میبنید ویژگی های سلسله مراتبی یادگرفته شده از یه الگوریتم یادگیری عمیق بخوبی مشخص هست. هر کدوم از این ویژگیها رو میشه بعنوان یه فیلتر در نظر گرفت که تصویر ورودی رو برای اون ویژگی (مثلا بینی) فیلتر میکنه.اگه یه ویژگی پیدا بشه, واحد یا واحدهای مسئول (منظور واحدهای پردازشی هست (مثل نورون!ها در شبکه عصبی) بعدا تو توضیحات شبکه کانولوشنی کامل متوجه میشید) فعال سازی های بزرگی رو تولید میکنن که مراحل دسته بندی بعدی میتونن این فعالسازی ها رو دریافت کنن و بعد از اون بعنوان یه نشونه خوب از حضور یک کلاس استفاده کنن.(کلا کار دسته بندی کننده یا همون کلاسیفایر ها اینه. شاید این بخش برای کسایی که شبکه عصبی نخوندن یا سرسری خوندن مبهم باشه نگران نباشید وقتی به بخش شبکه های عصبی و کانولوشن رسیدم همه اینارو متوجه میشید)

 یادگیری عمیق یا همون Deep learning

در یادگیری ویژگی سلسله مراتبی ما ویژگی های  غیرخطی چندین لایه رو استخراج میکنیم و بعد اونها رو به یک کلاسیفایر (دسته بندی کننده) پاس میدیم که اونم هم تمامی این ویژگی ها رو با هم ترکیب میکنه تا بتونه پیش بینی ای رو انجام بده. هرچقدر این سلسله مراتب لایه ها بیشتر (عمیقتر) باشه در نتیجه ویژگی های غیرخطی بیشتری هم بدست میاد برای همین هم هست که ما علاقه داریم از تعداد لایه های بیشتری در یادگیری عمیق استفاده کنیم (در اصل اون بخش دوم یادگیری عمیق از همین اصل نشات گرفته و اشاره به سلسله مراتب عمیقی داره که تو یادگیری ویژگیها بما کمک میکنه.) از طرف دیگه این ویژگی های پیچیده رو ما نمیتونیم بصورت مستقیم از تصویر ورودی بدست بیاریم. میشه از لحاظ ریاضی نشون داد که بهترین ویژگی هایی که میشه از یه تصویر با استفاده از یک لایه (بدون سلسله مراتب) بدست آورد فقط لبه ها و توده ها (edge ها و blob ها) هستن. دلیلش هم اینه که اینها نهایت اطلاعاتی هست که ما میتونیم از یه تبدیل غیرخطی از تصویر ورودی بدست بیاریم. برای بدست آوردن و یا تولید ویژگی هایی که شامل اطلاعات بیشتری هستند ما نمیتونیم بصورت مستقیم روی تصویر ورودی کار کنیم و لازمه برای اینکار ویژگی های اولیه خودمون رو (مثل لبه ها و توده ها) دوباره تبدیل کنیم تا ویژگی های پیچیده تری که شامل اطلاعات بیشتری برای تمایز بین کلاسها مورد نیاز هست بدست بیاد.

این نحوه کار که ما در یادگیری عمیق میبینیم در اصل ایده گرفته شده از مغز انسان و نحوه کار visual cortext در مغز انسان هست. در مغز انسان هم نورون های مربوط به سلسله مراتب اولیه در ویژوال کورتکس مغز اطلاعاتی که دریافت میکنن حساس به لبه ها و توده ها هستن و بعد خروجی اونها در یک سلسله مراتب بعدی ادامه پیدا میکنه تا اینکه نورونهای به ساختار های پیچیده تری مثل صورتها حساسیت نشون بدن.

ذکر این نکته هم لازمه که یادگیری ویژگی سلسله مراتبی قبل از بوجود اومدن رشته یادگیری عمیق وجود داشته اما معماری های موجود در زمان قدیم از مشکلات عمده ای مثل محو شدن گرادیانت (تو بخش شبکه عصبی توضیح میدیم) رنج میبردن. محوشدگی گرادیانت در اصل به مشکلی گفته میشه که در اون گرادیانت ها انقدر کوچیک میشن که دیگه نمیتونن یک سیگنال یادگیری رو برای لایه های خیلی عمیق ایجاد کنند و بنابراین این معماری ها در مقایسه با الگوریتم های یادگیری کم عمق مثل (support vector machine ها) خیلی بد عمل میکردن.

عبارت دیپ لرنینگ یا همون یادگیری عمیق از وقتی که روشها و استراتژی های جدیدی برای برطرف کردن مشکلات قبلی ارائه شد , سر زبونا افتاد و بطور خاص زمانی که توسط الکس کریژوسکی و جفری هینتون (جف هینتون) تو سال ۲۰۱۲ تونستن با یه شبکه کانولوشنی عمیق رقابت ImageNet رو با موفقیت خیلی خوبی برنده بشن و به مقام اول برسن سرعت گرفت. تقریبا بعد از موفقیت اونها بود که یکدفعه همه متوجه عملی بودن یادگیری عمیق شدن (قبل از اون خالق شبکه های کانولوشنی Yan leCunn تو دهه ۹۰ یه شبکه کانلووشنی ساخته بود که اراقام دست نویس رو تشخیص میداد اندازه تصاویر خیلی کوچیک بود ( ۲۸ در ۲۸ بود بنظرم) و کسی برای کارهای بزرگ و واقعی ازش استفاده نیمکرد چون سخت افزارهای اون موقع انقدر قوی نبودن . تو سال ۲۰۱۲ کریژوسکی با استفاده از GPU ها (دوتا کارت گرافیک GTX580 3Gig ) تونست یه شبکه ۸ لایه ای رو آموزش بده و باعث ایجاد موج جدیدی در این حوزه بشه . (اینم بگم که در مقایسه با دیتاست MNIST که  تصاویر اندازه اشون ۲۸ در۲۸ بود و سیاه و سفید. و تعداد تصاویر کلا ۶۰ هزارتا بود. دیتاست ایمیجنت ۲۰۱۲ بیش از ۱ میلیون و نیم تصاویر رنگی با اندازه ۲۲۷ در ۲۲۷ پیکسل داره که حجم این دیتاست چیزی برابر با ۱۵۰ تا ۲۰۰ گیگابایت میشه!! ورژن ۲۰۱۵ این دیتاست بیش از ۱ ترابایت حجم داره!- پس کاملا مشخصه که چرا یکدفعه از این سال دیپ لرنینگ بشدت محبوب و معروف شد!)بعدا تو یه پست جداگانه بصورت خاص به دلایل رونق دوباره گرفتن این مبحث بعد از یه بازه زمانی نسبتا زیاد میپردازیم انشاالله).

البته قبل از الکس کریژوسکی و جف هینتنون (ایشون خالق RBM ها هم هستن! یکی از دانشمندان معروف دنیا تو حوزه دیپ لرنینگ هستن ایشون) البته در اوائل سال ۲۰۱۰ نشون داده شده بود که استفاده از GPU ها و توابع فعال سازی جدید به غیر از تابع سیگموید میتونه باعث بهتر شدن جریان گرادیانت بشه و اینطور برای آموزش معماری های عمیق بدون مشکلات جدی راه باز شده بود. الکس کریژوسکی (Alex krizhevsky) و جف هینتون (Jeff hinton) هم بعنوان مثال از تابع relu بجای سگموید استفاده کرده بودن . (نگران نباشید در این باره هم توضیح میدیم اینا همه مربوط به شبکه های عصبی و کانولوشنی هست که با خوندن اینا همه چیز میاد دستتون).

تا اینجا ما هر مثالی زدیم در مورد عکس بود و تصاویر . در اصل شبکه های کانولوشنی که یکی از روش های دیپ لرننیگ هستن برای کار با تصاویر ایجاد شده بودن ولی تو حوزه دیپ لرنینگ ما تو زمینه ها پردازش صدا و جریان هم کار میکنیم . به عبارت بهتر الان با استفاده از دیپ لرنینگ فعالیت شناسی هم انجام شده یعنی شما یک فیلمی که تو اینستاگرام یا فیس بوک آپلود میکنید براحتی مشخص میکنن که چه فعالیتی در حال انجام شدن هست. مثلا دارید فوتبال بازی میکنید یا دوچرخه سواری و… این کار از طریق نوع های خاصی از شبکه های عصبی بنام long short term memory recurrrent neural network انجام میشه.

بطور خلاصه باید بگم که تو یادگیری عمیق ما در اینو نوع شبکه ها میایم وابستگی های زمانی رو هم دخالت میدیم . تو شبکه های عصبی recurrent neural network ها دقیقا همینطور هستن . اگه شبکه عصبی خونده باشید مدونید که تو این نوع شبکه ها ورودی شبکه از ورودی قبلی تاثیر میپذیره و اینطور تقریبا یک حافظه تو شبکه عصبی ایجاد شده .پس یادگیری عمیق صرفا در یادگیری ویژگی های سلسله مراتبی غیرخطی عمیق خلاصه نمیشه! بلکه از اون میشه در یادگیری وابستگی های زمانی غیرخطی طولانی در داده های ترتیبی هم استفاده کرد. (نمونه هایی که در مورد تشخیص فعالیت در حال انجام گفتم با استفاده از این نوع شبکه ها بدست اومدن) اکثر الگوریتمهای دیگه ای که روی داده های ترتیبی کار میکنن حافظه ای برای ۱۰ گام زمانی اخیر دارن در حالی که شبکه LSTM (که در سال ۱۹۹۷ توسط Sepp Horchreiter و Jurgen Schmidhuber معرفی شد) به یه شبکه این اجازه رو میده که بتونه فعالیتی رو از صدها گام زمانی قبلتر انتخاب کنه تا با استفاده از اون بتونه پیش بینی دقیقی داشته باشه. شبکه های LSTM طی ده پانزده سال اخیر بهش توجه نشده بود تا اینکه بعد از سال ۲۰۱۳ یکدفعه سر زبونها افتاد! این شبکه به همراه شبکه های کانولوشنی دوتا از نمونه های بسیار موفق تو حوزه دیپ لرنینگ هستن. من خودم تو این حوزه اصلا کار نکردم (LSTM) اما تو زمینه شبکه های کانولوشنی چرا. منابع در این زمینه هم قرار میگیره ولی شاید به خوبی شبکه های کانلووشنی نباشه اما مطمئنا بکار کسی که میخواد کار کنه میاد (مفاهیم اکثرا یکی هستن به جز یکسری تفاوتهای جزئی).

منبع >: deeplearning.ir