مقدمه‌ای بر شبکه‌های عصبی(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 بیشتر این توابع را پیاده سازی کردند پس نیازی نیست که نگران پیاده سازی این توابع باشیم.

طبقه بند K نزدیکترین همسایه در scikit-learn

مسائل machine learning  به سه دسته تقسم می شوند:

1.supervised

2.unsupervised

3.enforcement learning

اکنون به دسته ی اول یعنی supervised learning میپردازیم.

The k-Nearest Neighbor Classifier

این الگوریتم از دسته الگوریتم های supervised learning  است. که آن را با چند مثال بررسی خواهیم کرد.

مثال اول:  در اینجا تعدادی feature برای تعدادی از گل ها مشخص کرده ا یم. اندازه ی گلبرگ ها و روشنایی گلبرگ ها.با توجه به مقادیری از feature ها که هر گل دارد، و label  های آن، مکان آن در نمودار مشخص می شود.

اگر بخواهیم بگوییم عکس جدیدی که    label آن را نداشته ایم در کدام دسته از گل ها قرار میگیرد(یعنی در واقع بخواهیم کلاس آن را تعیین کنیم.)، طبق الگوریتم nearest neighbor به صورت زیر میکنیم:

فاصله عکس جدید را با تمام training dataset ها محاسبه میکنیم تا ببنیم به کدام یک نزدیک تر است. و label عکس جدید همان label  نزدیک ترین data خواهد بود.

مثال دوم: در اینجا سه کلاس مختلف و دو feature داریم. و برای تعیین کلاس داده جدید مانند مثال قبل عمل خواهیم کرد.

1-nearest neighbor

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

k-nearest neighbor

برای رفع مشکل ذکر شده از این الگوریتم استفاده می شود. که در آن به جای یک همسایه، چند همسایه در نظر گرفته می شوند. K تعداد همسایه ها را مشخص می کند و hyper parameter است. که در فرایند training مشخص نمی شود.

انتخاب مقدار k به مسئله بستگی دارد. و باید مقادیر مختلف آن را برای test data بررسی کرد. اما اگر مقدار آن را بر اساس test data تعیین کنیم، مشکلی که به وجود می آید این است که ممکن است این مقدار فقط روی داده هایی که داریم عملکرد خوبی داشته باشد. و روی داده های جدید به خوبی عمل نکند.

برای مثال در اینجا از این الگوریتم با 3 همسایه استفاده شده است.

از مشکلات این الگوریتم این است که اگر تعدادdata ها زیاد باشد، تعداد مقایسه ها بالا رفته و الگوریتم زمان بر می شود.

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

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

1.scipy : برای لود کردن فایل مطلب استفاده می شود.

2.matplotlib : برای کشیدن نمودار استفاده می شود.

3.scikit-learn: کتابخانه ای برای machine learning است و بیشتر در machine learning  سنتی و کلاسیک کاربرد دارد.

میتوانید به جای pip از کلمه ی conda استفاده کنید. (اگر از آناکوندا استفاده میکنید.)

ابتدا package  ها و function های مورد نیاز را import  میکنیم.

 

Load_hoda : تابعی است که قبلا نوشته بودیم. که یک tuple شامل 1000 عدد training data و 200 عدد test data  بر می گرداند.

ایجاد طبقه بند k-nn

در کتابخانه scikit-learn طبقه بند به این شکل ایجاد می شود.

عدد 3 در اینجا همان k است.

و از تابع fit برای ذخیره دیتا های  train استفاده شده است.

پیش بینی داده های آموزشی

متغیر: sample را برای مشخص کردن اولین خانه تعریف می کنیم.

طبق کد X یک لیست شامل یک خانه است که آن خانه لیستی شامل 25 خانه (یک عکس از 200 دیتای  test) است.

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

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

در اینجا به تابع predict یک vector 25 تایی دادیم، و در قسمت fit 1000 تا vector 25 تایی. یکvector اول با 1000 vector دوم مقایسه شده و فاصله ها محاسبه می شود. با داشتن label  هر 1000 vector آن ها را sort می کند. و نزدیک ترین ها را پیدا می کند. و با بررسی سه  تا از نزدیک ترین ها، label داده را پیدا می کند.

Predict probability

تابع predict_proba درصد احتمال تعلق x تعریف شده به هرکدام از کلاس ها را بر می گرداند. که در اینجا با k=3 سه حالت اتفاق می افتد. (1، 0.6، 0.3)

پیش بینی چندین داده آزمون

Pred_classes: همه ی 200 داده مربوط به test data است.

True_classes: همه ی کلاس های واقعی را شامل می شود.

ارزیابی

با استفاده از تابع آماده score می توانیم میزان performance را محاسبه کنیم. همانطور که مشاهده می شود performance  برابر با 96 درصد است. یعنی از 200 داده، 8 تای آن اشتباه تشخیص داده شده است.

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

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

  • مراحلی که یک الگوریتم 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 :

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