چگونه یک مدل برای شناسایی مکان‌ها آموزش دادیم؟

نویسندگان ‌: محیا مهدیان و محمد حسن ستاریان

مقدمه

deeplearning

در هر مسئله دسته‌بندی (Classification)، پیاده‌سازی یک مدل مناسب -از جهت صحت پیش‌بینی- به مولفه‌های متفاوتی وابسته است؛ داشتن ورودی‌های -با ویژگی‌های- گوناگون و به تعداد زیاد یکی از مولفه‌های مهم برای آموزش مدلی که دقیق (Accurate) بوده و قادر به عمومیت بخشی (Generalization) به دانش خود و راستی آزمایی آن در محیط واقعی است می‌باشد. با این حال جمع آوری داده زیاد کاری سخت و نیازمند زمان و هزینه زیاد، بسته به شرایط و نوع داده مورد نیاز خواهد بود. در این شرایط و با توجه به اینکه کار‌های پیشین زیادی انجام شده اند، استفاده از روش‌های یادگیری انتقال (Transfer learning)، درواقع استفاده از یک مدل از پیش آموزش دیده و استفاده از آن به عنوان استخراج کننده ویژگی (Feature Extractor) یا به عنوان شبکه Fine Tuning کمک بسیار زیادی در ساخت مدلی دقیق و مناسب خواهد داشت. همچنین استفاده از روش‌های افزایش داده (Data augmentation) باعث افزایش چشم‌گیر داده شده و در آموزش بهتر مدل موثر خواهد بود؛ با این‌حال در استفاده از این روش باید توجه داشت از روش‌هایی برای تغییر عکس استفاده کرد که عکس خروجی خارج از فضای حالت مسئله نبوده و در شرایط واقعی مسئله وجود داشته باشد. به علاوه در جمع‌آوری داده باید داده‌های جمع آوری شده بررسی و در صورت نیاز پاکسازی‌هایی نیز انجام شود، تا داده‌های نامناسب، نامربوط و بی‌تاثیر حذف شوند اما از عمومیت داده‌ها کم نشده و داده‌های مختلفی در شرایط مختلف آزمون مسئله وجود داشته باشد؛ چرا که هرچه داده‌ها متفاوت‌تر باشند مدل قابلیت عمومیت بخشی بیشتری خواهد داشت. استفاده از پارامترهای (Hyperparameter)‌ مناسب در آموزش مدل، انتخاب دقیق و بسته به شرایط -و داده‌- پارامترها نیز از اهمیت زیادی برخوردار است و شاید نیاز باشد تغییر دقت مدل با تغییر این پارامترها بررسی شود که در این‌صورت نیاز است مدل چندین دفعه آموزش داده شود.

مراحل پیاده‌سازی مدل

هدف ما آموزش مدلی بود تا بتواند مکان‌های دانشگاه را تشخیص بدهد؛ برای پیاده‌سازی مدل خود از فریم‌ورک کراس (Keras) و زبان پایتون استفاده کردیم. از آنجایی که تعداد کلاس‌ها کم بوده و امکان جمع‌آوری داده زیادی که بتواند مدل را خوب آموزش بدهد نبود، مدلی برای استفاده به عنوان مدل پایه (Base Model)‌ برای Fine Tuning انتخاب شد. سپس داده‌های مورد نیاز جمع‌آوری شده، تمیز شده و آماده آموزش شدند. مدل روی گوگل کولب (Google Colab) به همراه استفاده از روش‌های افزایش داده آموزش داده شده و ذخیره شد. برای استفاده از مدل برنامه‌ای برای اجرای آن روی سرور و گرفتن خروجی با میکروفریم‌ورک فلسک نوشته شده و اپلیکیشن اندرویدی نیز برای گرفتن عکس و پیش‌بینی آن در لحظه ساخته شد. هر مرحله به تفضیل توضیح داده خواهد شد:

کد تمامی مراحل در ریپوزتوری «SRU-Place-Recognizer» قابل دسترسی است.

پیدا کردن مدل پایه

VGG16 + places365

همانطور که گفته شد از آنجایی که تعداد کلاس‌ها کم بوده و امکان جمع‌آوری داده زیادی که بتواند مدل را خوب آموزش بدهد نبود، از روش یادگیری انتقال (Transfer learning) استفاده کرده و مدل VGG16 Places365  برای استفاده به عنوان مدل پایه (Base Model)‌ برای Fine Tuning انتخاب شد. این مدل یک شبکه VGG16 است که از پیش با داده‌های دیتاست Places365 که شامل بیش از ۱۰ میلیون عکس در بیش از ۴۰۰ موضوع است آموزش داده شده است؛ پس نه تنها ویژگی‌های اولیه مورد نیاز مسئله در لایه‌های ابتدایی شناسایی شده‌اند بلکه در لایه‌های جلوتر نیز ویژگی‌های بصری عمیقی شناسایی شده اند و مدلی بسیار مناسب برای این مسئله خواهد بود. بنابراین ما از این مدل به عنوان مدل پایه آموزش خود استفاده کردیم به صورتی که تنها لایه‌های کانولوشنی استفاده شده و از میان‌ آن‌ها ۵ لایه آخر را نیز از حالت فریز (freeze) خارج کردیم. در قسمت ساخت مدل بیشتر بخوانید.

جمع‌آوری داده

برای مسئله شش کلاس -شش مکان برای آموزش مدل- در نظر گرفته شد: دانشکده کامپیوتر، دانشکده معماری، سلف، بوفه، ساختمان امور فرهنگی و زمین ورزشی؛ برای جمع‌آوری داده از این مکان‌ها عکس و فیلم از تمامی زوایای ساختمان‌ها گرفته شد. همچنین سعی شد در زمان‌های متفاوتی عکس‌برداری انجام شود تا تصاویر از تنوع قابل قبولی در نور محیط برخوردار باشند. فریم‌های فیلم‌ها بعدا با استفاده از اسکریپت پایتونی زیر جدا شد تا نهایتا در هر کلاس (از هر مکان) ۸۰۰ عکس شامل ۵۰۰ عکس برای آموزش و ۳۰۰ عکس برای تست و مجموعا ۴۸۰۰ عکس تولید شود.

از این اسکریپت به صورت زیر استفاده می‌کنیم (با این فرض که کدهای بالا را در فایلی با نام frameExtractor.py ذخیره کرده اید)؛ پارامتر اول آدرس فایل ویدئو و پارامتر دوم عددی برای شروع نام‌گذاری تصاویر اسکریپت است برای مواقعی که فریم‌های چندین فایل ویدئو را می‌خواهیم جدا کنیم:

آماده‌سازی داده‌ها

از آنجایی که روش جمع‌آوری داده ما، جدا کردن فریم‌ از فیلم‌های گرفته شده بود، تصاویر نامربوط، برای نمونه از محیط اطراف ساختمان و یا تصاویر تار شده نیز در میان عکس‌ها وجود داشت. همچنین تصاویر با کیفیت ۲۱۶۰*۳۸۴۰ گرفته شده بودند و هر کدام تقریبا حجمی بیش از ۳ مگابایت داشتند که برای آموزش شبکه بسیار سنگین بوده و ویژگی‌های (features) بسیار زیادی تولید می‌کردند که برای برنامه خود تا این حد نیاز به جزئیات نداشتیم؛ همچنین عکس‌ها به صورت landscape جدا شده بودند و نیاز به چرخواندن (rotate) داشتند. برای همین، با استفاده از برنامه ImageMagick تصاویر را ۹۰ درجه چرخوانده و سپس همگی را به سایز ۱۹۲*۱۰۸ تبدیل کردیم تا مدل در حین سبک شدن از ویژگی‌های کافی برای آموزش برخوردار باشد.

برای آشنایی با Image Magick و نحوه انجام کار پست «کار با تصاویر توسط ImageMagick» را بخوانید.

در نهایت تصاویر در فولدرهای مربوطه Train و تست و زیرفولدرهایی با اسامی کلاس‌ها قرار داده شدند. این اسم فولدرها بعدا در آموزش مدل و استفاده از دیتا جنریتور (Data Generator) به عنوان اسامی کلاس‌های مدل تعریف می‌شوند. ساختار فولدربندی داده‌ها به صورت زیر شد:

 

ساخت مدل

همانطور که قبلا اشاره شد برای مسئله از Fine Tuning استفاده شد. مدل نهایی تشکیل شده است از لایه‌های کانولوشنی شبکه VGG16 Places365 که به عنوان مدل پایه استفاده شده است و ۵ لایه آخر آن از حالت حالت فریز (freeze) خارج شده و به دو لایه تماما متصل (Fully connected) با ۲۵۶ نود و ۲ نود که به ترتیب از Activation function های Relu (برای شناسایی nonlinearities) و Softmax (برای کد کردن نتیجه در ۶ کلاس) استفاده می‌کنند متصل شدند.

آموزش مدل

google colab

برای آموزش سریعتر مدل و استفاده از GPU که امکان استفاده آن در سیستم خودمان فعلا وجود نداشت، از سرویس گوگل کولب (Google Colab)‌ استفاده کردیم. برای همین منظور فایل‌های لازم برای آموزش مدل به گوگل درایو منتقل شدند -فایل‌ها آپلود شده و از طریق سرویس SavetoDrive به گوگل درایو منتقل شدند- سپس فایل‌ها را در نوت‌بوکی که در گوگل کولب ساخته بودیم وارد کردیم تا مدل را آموزش دهیم.

آموزش نحوه انتقال فایل از گوگل کولب به گوگل درایو را در پست «اتصال مستقیم سرویس کولب (Google Colab) به درایو (Google Drive) از طریق فایل سیستم FUSE» بخوانید.

برای آموزش مدل پس از تعریف ساختار مدل (که در قسمت ساخت مدل توضیح داده شد)، چون که تعداد داده‌ها زیاد بود از دیتا جنریتور (Data Generator) هایی برای خواندن تصاویر از فولدر‌های مربوطه استفاده شده و برای داده‌های آموزش (Train) از روش‌های افزایش داده (Data augmentation) استفاده شد. تصاویر در گروه‌های ۲۰ تایی به شبکه تغذیه (Feed) شده ( batch_size = 20 )، مقادیر steps_per_epoch  و validation_steps  با توجه به تعداد داده‌های Train و Test و تعداد عکس‌های هر گروه ( batch_size) محاسبه شده و با ۱۰ بار تکرار ( epochs = 10 ) شبکه آموزش دید.

بررسی مدل

برای بررسی مدل نمودارهای روند تغییر accuracy و loss در هر epoch چاپ شد تا از نبود over-fitting مطمئن شویم.

accuracy and loss Plots

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

تصویر با استفاده از تابع load_img در سایز مورد استفاده مدل خوانده شده و سپس به آرایه تبدیل شده، آرایه تبدیل به آرایه تک بعدی شده و پیش پردازشی رو آن توسط تابع  preprocess_input انجام شده است. این تابع در فایل  places_utils که مدل پایه (VGG16 Places365در اختیار گذاشته موجود است.

ذخیره مدل

در نهایت برای استفاده‌های آتی، مدل را ذخیره کردیم.

 

کد آموزش مدل و نوت‌بوک استفاده شده برای آموزش مدل در گوگل کولب در ریپازیتوری در دسترس اند.

استفاده از مدل در عمل

اسکریپت پیش‌بینی

برای اینکه از مدل استفاده کنیم، برنامه‌ای لازم داشتیم تا تصویر را دریافت کرده و نتیجه پیش‌بینی را برگرداند. برای این منظور اسکریپت زیر نوشته شد:

اسکریپت در ریپازیتوری در دسترس است.

سرور پیش‌بینی

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

برای آشنایی با فلسک و نحوه ایجاد یک برنامه سرور پست «آموزش مقدماتی فلسک (Flask)»‌ را بخوانید.

سه endpoint برای کار با مدل تعریف شدند؛  upload/  برای آپلود عکس (عکس را به صورت base64 دریافت کرده و آن را ذخیره می‌کند)، imagetopredict/  دریافت آخرین عکسی که برای پیش‌بینی فرستاده شده و  predictagain/  برای پیش‌بینی دوباره آخرین عکس آپلود شده. سپس، این برنامه روی سرور دپلوی شده و مدل آماده استفاده عملی شد.

کد برنامه سرور در ریپازیتوری در دسترس است.

برای آشنایی با نحوه دپلوی مدل پست «دپلوی کردن و استفاده از مدل در عمل (Model deployment)» را بخوانید (ما از روش سوم استفاده کردیم).

اپلیکیشن اندروید

حال که سروری داشتیم که با فرستادن عکس می‌توانستیم نتیجه پیش‌بینی را دریافت کنیم، میخواستیم از هر جایی امکان فرستادن عکس را داشته باشیم؛ برای این منظور با استفاده از فریم‌ورک Nativescript-Vue که ترکیب فریم‌ورک‌های Nativescript که برای ساخت اپلیکیشن‌های اندروید و ios با استفاده از زبان جاوااسکریپت (javascript) است و Vue که یک فریم‌ورک جاوااسکریپتی برای ساخت Progressive Web App هاست، اپلیکیشن اندرویدی برای پیش‌بینی تصاویر توسط مدل و با اتصال به سرور تولید شد.

کد اپلیکیشن در ریپازیتوری در دسترس است.

آشنایی با سرویس ابری Google Colab

محیط گوگل کولب امکان استفاده از GPU  را به صورت رایگان میدهد و امکان نصب و کار با پکیج های مختلف زبان پایتون و فریم ورکهای مطرح یادگیری عمیق همانند Tensorflow, Keras, Pytorch,Fast.ai را فراهم میکند.

مراحل ایجاد یک نوت بوک

ابتدا مطمئن شوید که به حساب کاربری gmail  خود متصل هستید . اگر حساب کاربری gmail ندارید اینجا را کلیک کنید.

* توجه :در تمام طول کار، باید  وی‌پی‌ان یا فیلترشکن روشن باشد.

از اینجا وارد محیط  google drive  شوید .

روش اول :

در محیط google drive   یک پوشه ایجاد کنید :

پوشه ای که ایجاد کرده ایم را انتخاب میکنیم

با کیلک راست بر روی  My drive فایل های نوت بوک وdataset.py    [Upload files] و

Data_hoda_full را آپلود میکنیم.

با کلیک راست بر روی نوت بوک مانند شکل زیر،نوت بوک را  با colaboratoryباز میکنیم :

بعد از باز شدن نوت بوک  GPU را فعال  میکنیم:

یک cell جدید ایجاد میکنیم :

کد زیر را در cell  وارد میکنیم :

بعد از run  شدن  cell دو مرحله تایید اعتبار داریم ، در هر مرحله بر رو لینک کلیک کنید و کد رو در تکست باکس وارد کنید :

کدهای زیر را به نوت بوک اضافه میکنیم تا فایل ها از گوگل درایو به محیط colab  اضافه شوند :

add cell+

add cell +

حالا  یک دایرکتوری برای دیتاست ایجاد میکنیم :

add cell+

دیتاست هدی را به پوشه ی دیتاست اضافه میکنیم :

add cell+

روش دوم ایجاد نوت بوک :

وارد سایت colab.research.google.com میشویم :

NEW NOTEBOOK >>> NEW PYTHON3 NOTEBOOK

سپس از منو file  نوت بوک جدید را آپلود میکنیم :

یک cell  جدید  ایجاد میکنیم سپس دستور زیر را وارد میکنیم  :

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

add cell+

دیتاست هدی را به پوشه ی دیتاست اضافه میکنیم :

add cell+

روش سوم :

ابتدا ریپازیتوری خود را با دیتاست موردنظر و دلخواه روی گیت هاب ایجاد کنید

یا در صورت وجود ریپازیتوری آدرس آن را به صورت زیر یافته و با دستور زیر آن را در جوپیتر ران کنید

*توجه داشته باشید که فرمت دستورات لینوکسی میباشد.

مثال :

بعد از اتمام موفقیت آمیز بودن عملیات کلون از ریپازیتوری گیت هاب خروجی زیر را مشاهده میکنید:

در ادامه مسیر جاری را پیدا کرده و فایل های دریافت شده از مخزن را در مسیر دلخواه ( بعنوان مثال /content ) منتقل کنید:

در نهایت کد های اجرایی مورد نظر را در یک سلول جدید وارد کرده و برنامه را اجرا کنید:

بروزرسانی : 1397/11/06

مقدمه‌ای بر شبکه‌های عصبی(2)

تا اینجا به دو مبحث درباره شبکه های عصبی پرداختیم. Activation function  برای تعیین عملکرد تابع خروجی و cost function  برای تعیین عملکرد بد شبکه. و برای بهبود عملکرد تابع مسائل بهینه سازی مطرح شد (مشتقات جزئی). اکنون به مسئله یادگیری(learning) شبکه میپردازیم.

Gradient Descent and Back-propagation

Gradient Descent

Gradient descent  یک الگوریتم بهینه سازی برای پیدا کردن مینیمم یک تابع است.

مثال : در این مسئله یک متغیر(w) داریم. و C  ، cost function  است.

یک وزن رندوم انتخاب میکنیم و مشتق c را نسبت به w محاسبه میکنیم. در نتیجه شیب به دست می آید. که جهت آن از روی علامتش مشخص می شود.

w را به سمت جهتی که به دست آوردیم، حرکت می دهیم. که در اینجا سمت راست است. یعنی باید w را بیشتر کنیم.

که با تکرار این کار در نهایت مقدار cost ، مینیمم می شود. در این نقطه مشتق یا شیب برابر با 0 است. با رسیدن به این مرحله نقطه بهینه پیدا می شود.

همان طور که دیدیم، پیدا کردن مینیمم برای فضای دو بعدی ساده بود. اما در فضاهای n بعدی این کار ساده نخواهد بود. و با شکل های پیچیده تری مواجه خواهیم شد.

پس با استفاده از gradient descent  میتوانیم بهترین پارامتر برای مینیمم کردن cost را به دست آوریم. برای مثال پیدا کردن بهترین مقادیر برای انتخاب وزن نورون های ورودی.

 

Backpropagation 

اگر شبکه بیش از دو لایه داشته باشد، فقط میتوانیم برای لایه ی آخر مشتق جزیی حساب کنیم. و برای بقیه لایه ها (لایه های وسط) این امکان را نداریم. اما میتوانیم تعیین کنیم که چه نورون هایی تاثیر بیشتری روی آنها داشته اند. به این الگوریتم backpropagation گفته می شود.

تابع cross entropy

one hot encoded

قبلا دیدیم که در شبکه تعدادی label  داشتیم. برای نشان دادن داده ی مربوط به آن label  به جای نشان دادن داده ، آن را به صورت one hot encoded  نمایش می دهیم. یعنی به تعداد کلاس های موجود 0 میگذاریم و عدد مربوط به کلاس را 1 میکنیم. یعنی به این شکل:

 

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

اما بهتر است برای بهتر شدن شبکه و بالا رفتن قطعیت آن همان گونه که بالاتر گفته شد، بهتر است یکی از خانه ها 1 شده و بقیه 0 باشند.

Cross entropy 

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

Tensorflow playground

Tensorflow playground یک visualization  برای آزمایش شبکه های عصبی است که از طرف سایت tensorflow  اراائه شده است. که میتوان در آن با data های مختلف شبکه را train کرد. میتوان برای شبکه به تعداد دلخواه hidden layer و نورون اضافه کرد. وزن ها نیز به صورت رندوم تعیین شده اند که قابل مشاهده و تغییر اند.

در قسمت بالای صفحه چند آیتم وجود دارد.

1.epoch: تعداد به روز رسانی های شبکه به ازای بررسی همه ی data ها را مشخص میکند.

2.learning rate

3.activation: نوع activation function را مشخص میکند که میتواند linear، sigmoid،tanh  یا relu باشد.

4.regularization: برای مینیمم کردن تابع cost، مجموع توان 2 تمام وزن ها و بایاس ها را محاسبه میکند و مقادیر آنها را محدود میکند تا خیلی بزرگ نباشند تا یک وزن زیاد نتواند تاثیر زیادی روی شبکه داشته باشد و قدرت بین شبکه تقسیم شود و داده را حفظ نکند. میتواند مقادیر none، L1 یا L2 را داشته باشد.

5.regularization rate

6.problem type: نوع الگوریتم را مشخص میکند که classification باشد یا regression.

در قسمت چپ صفحه نیز چند آیتم وجود دارد.

1.data: از این قسمت میتوان از بین انواع dataset های موجود یکی را انتخاب کرد که میزان سختی آن ها متفاوت است.

2.ratio of training to test data: نسبت دیتاهای test و train را مشخص میکند.

3.noise: میزان noise موجود در دیتا را مشخص میکند. که هرچه بالاتر باشد، نشان دهنده ی در هم آمیختن بیشتر data ها است.

4.batch size: تعداد داده هایی را مشخص میکند که شبکه بعد از بررسی آنها، عملیات optimization  را اجرا میکند.

مقدمه‌ای بر شبکه‌های عصبی(1)

آشنایی با پرسپترون:

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

هر نورون در مغز انسان ها شامل سه بخش دندریت ها که ورودی های نورون می باشند و بدنه اصلی و اکسون ها که خروجی آن می باشد تشکیل شده است.

نورون های مصنوعی نیز دارای ورودی ها و خروجی ها هستند که این مدل ساده به عنوان یک پرسپترون شناخته می شود.

حال بیایید مثال ساده ای از چگونگی عملکرد آن را ببینیم.

ورودی های هر پرسپترون هرکدام معرف مقادیر یک ویژگی می باشند.

 

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

حال ورودی ها در وزن های خود ضرب می شوند تا مقدار تاثیر گذاری آن ورودی مشخص شود.

پس از ضرب ورودی ها در وزن های خود این مقادیر به تابع فعال در بدنه پرسپترون انتقال پیدا میکنند.

بیایید با یک تابع فعال ساده شروع کنیم.

تابع فعال: اگر مجموع ورودی ها مثبت شد خروجی یک و اگر منفی شد خروجی صفر می باشد.

اگر تمام ورودی ها صفر باشند چه مشکلی پیش می آید؟

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

حال نحوه نمایش ریاضی این پرسپترون را با هم بررسی کنیم.

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

همانطور که ما تعداد بسیار زیادی پرسپترون در شبکه خود داریم پس می توانیم این مدل را به صورت ماتریسی گسترش دهیم.

حال اگر تعداد زیادی از پرسپترون ها را کنار هم قرار دهیم یک MLP  یا شبکه ی چند لایه پرسپترون مانند زیر ایجاد می شود.

در شکل بالا به لایه بنفش رنگ لایه ورودی و به لایه قرمز رنگ لایه خروجی گفته می شود که prediction را مشخص می کند.

به لایه هایی هم که نه ورودی هستند و نه خروجی، لایه پنهان گفته می شود.

اگر تعداد لایه های پنهان بیش از 2 باشد شبکه به deep learning تبدیل می شود.

هر چه بیش تر در لایه پیش برویم بصورت انتزاعی تر باید نگاه کنیم؛ برای مثال اگر در لایه دوم شبکه می تواند خط را تشخیص دهد در لایه های بعدی می تواند اشکال متفاوتی را تشخیص دهد که از ترکیب خط های لایه ها قبلی می باشد.

برای درک بهتر این قسمت می توانید از این لینک استفاده کنید.

حال در مجموعه داده هدی اگر بخواهیم این شبکه را آموزش دهیم باید 25 عدد ورودی برای گرفتن ویژگی ها در نظر گرفت و 10 عدد پرسپترون برای خروجی در نظر گرفت که اگر وکتور 25 تایی عدد 2 را برای مثال به این شبکه دهیم باید شبکه عدد دو را به عنوان predict برگرداند که با روش oneHotEncoding باید ترتیب پرسپترون های خروجی به شکل 0010000000 باشد.

مثلا برای عدد 9 باید 0000000001 برگرداند.

 

حال بیایید کمی بیش تر درباره توابع فعال بحث کنیم:

در شروع توابع فعال ما یک تابع ساده بود که فقط قبول و یا عدم قبول یک مقدار را با برچسب های ۰ و ۱ مشخص می کرد.

یکی از مشکل های این تابع این است که تغییرات کوچک در خروجی آن تاثییری ندارد و اگر ورودی برای مثال از ۰/۹- به ۰/۱- تغییر کند برای آن تفاوتی نمی کند و در هر دو حالت ۰ برمی گرداند.

این تابع به دلیل اینکه مشتق های آن در همه ی نقاط ۰ می باشد در شبکه های پرسپترونی چند لایه جواب نمی دهد.

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

تابع مشابه دیگری نیز معرفی شد که به دلایل ریاضی محبوب تر از sigmoid می باشد:

این تابع tanh نام دارد.

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

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

پس دانشمندان تابع ساده دیگری برای استفاده معرفی کردند:

این تابع ReLU نام دارد که چون مشتقش در محدوده بزرگتر از یک، ۱ می باشد مشکل تابع قبلی را ندارد.

شکل ریاضی این تابع:

max(0, Z)

در آینده به دلیل کارایی بالای دو تابع tanh و ReLU بیشتر تمرکز ما روی این دو تابع خواهد بود.

کتابخانه های deep learning بیشتر این توابع را پیاده سازی کردند پس نیازی نیست که نگران پیاده سازی این توابع باشیم.

مراحل یک پروژه یادگیری ماشین

در پست قبل با دسته‌بندی‌های اصلی الگوریتم‌های یادگیری ماشین آشنا شدیم. در این نوشته قصد داریم مطالب زیر را بررسی کنیم:

  • مراحلی که یک الگوریتم supervised و unsupervised باید طی کنند تا یادگیری آنها کامل شود
  • ارزیابی مدل حاصل از این الگوریتم ها
مراحل یک الگوریتم supervised machine learning:

  • Data acquisition(جمع آوری داده): جمع اوری داده های بسیار زیاد که شامل نامگذاری آنها نیز می شود.
  • Data cleaning(تمیز کردن داده): از بین بردن اختلال در داده

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

 Train Dataset (مجموعه داده یادگیری): برای یادگیری و راه اندازی الگوریتم از این مجموعه داده استفاده می شود

 Test Dataset (مجموعه داده تست): بعد از یادگیری از این مجموعه داده استفاده می کنیم تا میزان کارایی الگوریتم را بسنجیم. مجموعه داده یادگیری و  تست، به این دلیل از هم جدا می شوند که شاید الگوریتم، مجموعه یادگیری را حفظ کند.

  • Train Model (مدل یادگیری): با استفاده از مجموعه داده یادگیری، ویژگی هایی که الگوریتم از داده ها یاد گرفته، بصورت یک مدل در می آید.
  • Evaluate Model (مدل سنجشی): با استفاده از مجموعه داده تست، مدلی که ایجاد شده، ارزیابی می شود. این فرایند بازگشتی است. به این معنی که وقتی ایرادات مدل یادگیری مشخص شد، این مدل دوباره تنظیم می شود تا ایرادات قبلی رفع شود.
یک مدل دیگر برای الگوریتم  supervised learning:

در مدل قبلی برای supervised machine learning فرآیند بازگشتی بین مدل یادگیری و مدل تست، باعث ایجاد کارایی دروغین می شود. زیرا به کمک تغییر دادن پارامتر های مدل کاری می کنیم که الگوریتم روی مجموعه داده تست مشخص شده، نتیجه بهتری دهد درحالیکه ممکن است این نتیجه رو یک مجموعه داده تست جدید بدست نیاید.

برای اینکه کارایی بدست آمده واقعی باشد. مجموعه داده خود را به سه قسمت تقسیم می کنیم:

(یادگیری)Train – (پیشرفت) Development – (تست )Test

اینبار برای تنظیم کردن پارامتر ها به کمک رابطه بازگشتی بین مدل یادگیری و مدل تست , از مجموعه داده پیشرفت استفاده می کنیم. و برای ارزیابی نهایی از مجموعه داده تست استفاده می کنیم.

مراحل یک الگوریتم unsupervised machine learning:

در این الگوریتم ها مجموعه داده تست وجود ندارد و کل داده برای یادگیری استفاده می شود

همچنین یادگیری در اینجا فرق دارد. زیرا در قسمت supervised با توجه به ویژگی هایی که مشخص شده بود، داده در یکی از گروه هایی که ما مشخص کرده بودیم جای می گرفت و کاملا مشخص بود که انتظار داریم بعد از پیش بینی داده در چه گروهی قرار بگیرد. ولی در unsupervised از آنجا که ما فقط ویژگی ها رو مشخص می کنیم و گروه ها را مشخص نمی کنیم، بعد از انجام پیش بینی باید بررسی کنیم که الگوریتم بر چه اساسی داده ها را دسته بندی کرده است.

Model Evaluation

در این قسمت به روش های ارزیابی الگوریتم هایی که در بالا توضیح داده شد می پردازیم.

ازیابی Supervised Learning:

Accuracy (دقت): تعداد پیش بینی درست از تعداد کل پیش بینی ها

Recall, Precision: در دقت پیش بینی انجام شده اینکه پیش بینی غلط واقعا مربوط به کدام نامگذاری است اهمیتی ندارد. ولی در Recall, Precision اهمیت دارد. مثلا برای تشخیص دادن غده ی سرطانی اینکه شخصی که سرطان دارد به اشتباه تشخیص داده شود که سرطان ندارد خیلی بدتر است تا اینکه حالت برعکس آن اتفاق بیفتد.

MAE, MSE, RMSE: برای regression(داده های پیوسته) استفاده می شود. نحوه کار آنها براساس میزان فاصله با جواب درست است. مثلا اگر بخواهیم قیمت یک خانه را با توجه به متراژ آن پیش بینی کنیم می توانیم از این معیار ها استفاده کنیم

ارزیابی Unsupervised Learning:

همانطور که گفته شد در قسمت supervised ارزیابی بسیار آسان تر است چون که دسته ها مشخص هستند و با توجه به این که دسته مشخص شده برای داده های تست درست است یا نه، می توانیم ارزیابی را انجام دهیم. ولی ارزیابی برای unsupervised آسان نیست. چون که الگوریتم با توجه به پارامتر هایی که خودش انتخاب می کند دسته بندی را انجام می دهد. شاید از نظر انسان همان داده ها بصورت دیگری دسته بندی شوند.

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

در مثال بالا با توجه به اینکه چه معیاری تعریف کنیم دسته بندی متفاوتی بدست می آید.

مقدمه ای بر یادگیری ماشین (Machine Learning)

به عنوان یکی از شاخه‌های وسیع و پرکاربرد هوش مصنوعی، یادگیری ماشین به تنظیم و اکتشاف شیوه‌ها و الگوریتم‌هایی می‌پردازد که بر اساس آنها رایانه‌ها و سامانه‌ها توانایی تعلّم و یادگیری پیدا می‌کنند.هدف یادگیری ماشین این است که کامپیوتر (در کلی‌ترین مفهوم آن) بتواند به تدریج و با افزایش داده‌ها کارایی بهتری در انجام وظیفه مورد نظر پیدا کند. گستره این وظیفه می‌تواند از تشخیص خودکار چهره با دیدن چند نمونه از چهره مورد نظر تا فراگیری شیوه گام‌برداری روبات‌های دوپا با دریافت سیگنال پاداش و تنبیه باشد. 

برخی از روش های یادگیری ماشین

الگوریتم های یادگیری ماشین اغلب به عنوان نظارت شده یا نظارت نشده و تقویتی دسته بندی می شوند.

1.یادگیری نظارت شده یا Supervised Learning :

الگوریتم های یادگیری ماشین تحت نظارت می توانند آنچه را که در گذشته آموخته شده است به منظور پیش بینی رویدادهای آینده با استفاده از مثال های برچسب گذاری شده برای داده های جدید اعمال کنند. با شروع فرایند تجزیه و تحلیل یک مجموعه داده‌ شناخته شده، الگوریتم یادگیری، یک تابع انتزاعی برای پیش بینی مقادیر خروجی تولید می کند. سیستم می تواند اهداف هر ورودی جدید را پس از آموزش کافی فراهم کند. الگوریتم یادگیری همچنین می تواند خروجی خود را با خروجی صحیحِ در نظر گرفته شده مقایسه کرده و به منظور تغییر مدل، خطای خود را پیدا کند. مسایل این روش به دو دسته Classification و Regression تقسیم بندی می شوند که در مسایل Regression متغیر خروجی مقادیر پیوسته را می گیرد و بیشتر این مسایل به تخمین زدن یا پیش بینی یک پاسخ مربوط است ولی در مسایل Classification متغیر خروجی کلاسی از برچسب ها (Labels) را می گیرد و بیشتر به تشخیص این که داده ها به کدام گروه ها یا کلاس ها تعلق دارند، می پردازد.

 

2.یادگیری بدون نظارت یا Unsupervised Learning :

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

 

 

3.یادگیری تقویتی یا Reinforcement Learning :

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