آدرس رو غلط نرید، یادگیری ماشینی هیچ چیزی جز ریاضی نیست. وقتی که میگم ریاضی منظورم ترکیبیه از حسابان و معادلات دیفرانسیل و آمار. تمام الگوریتمهایی که میبینید جادو میکنند و یاد میگیرند و دستاورد کارشون این روزها تو صدر اخبار میشینه، در واقع همون فرمولهای ریاضی هستند که با کمک کامپیوترها و با کمک ماتریسهای بزرگی از ورودی و خروجیهای دلحواه ما (همون چیزی که بهشون میگیم دیتا) حل شدهاند و به جواب رسیدند. این چیزیه که خیلی از ماها وقتی برای اولین بار با این الگوریتمها آشنا میشیم نمیبینیم. یک مثلا ساده از حرفم درخت تصمیمه که فقط و فقط با کم کردن Cross Entropy ساخته میشه. هر چند که مثالهایی از این دست زیاده، اما من میخوام تو این نوشته در مورد جذابترین و پرکاربرد روش یادگیری ماشین صحبت کنم. یعنی شبکههای عصبی.
شبکههای عصبی رو احتمالا میشناسیم. نرونهایی که با ارتباطات وزن داری با هم متصل شدند. این ارتباطات از نرون ورودی یک عدد میگیرند، در وزنشون ضرب میکنند و میدن به نرون خروجی. نرون خروجی تمام ورودیهای دریافتی رو با هم جمع میکنه، از تو یه تابع فعالسازی در میکنه و خودش تبدیل میشه به نرون ورودی برای اتصال بعدی.
وقتی که تازه با این شبکههای عصبی آشنا میشیم، این اتصالات و این نرونهای گرافیگی چیزیه که تو همه کتابها و مقالهها و ویدیوهای آموزشی میبینیم. اما این نمایش گرافیکی علیرغم قابل فهم بودن و قشنگ بودن، یه حقیقت مهمی رو از چشم ما مخفی میکنه. اون حقیقت اینه که این نرونها واقعی نیستند و در واقع شبکه عصبی هیچ چیزی نیست جز یه تابع پیچیده و به شدت غیر خطی که ما سعی میکنم پارامترهاش رو با استفاده از رفتاری که از تابع توقع داریم انجام بده (دیتا) تخمین میزنیم. یک شبکهی feedforward ساده رو در نظر بگیرید. اگر این شبکه سه لایه باشه در واقع این شبکه چیزی نیست جز رگرسیون غیر خطی با هایپرتز y=g(W’f(WX+b)+b’) که W وزنهای لایه اول، Wپریم وزنهای لایه دوم، تابع f تابع فعالسازی لایه پنهان و g تابع فعالسازی تابع خروجیه. هدف ما از آموزش این شبکه عصبی صرفا یادگیری پارامترهای این تابعه و تمام feedforwardها و back propagateها برای همینه.
اما چیزی که بالا گفتم یه جنبه از شبکههای عصبی بود. این شبکهها رو جور دیگهای هم میشه نگاه کرد. نگاه دوم که نگاه مورد علاقه منه نگاه آماریه. وقتی که این تابع پارامترهای خودش رو یاد میگیره، در واقع داره یاد میگیره که وزنهای این شبکه عصبی رو چطوری تنظیم کنه که بتونی با ورودی، خروجی رو بسازه. وقتی که پارامترهای تعیین شدند، برای هر ورودی یک یا چند نمایش (representaion) به دست میآره که نشون دهنده اطلاعات آماری پنهان توی اون ورودیاند! برای مثال سه شبکه سه لایهای که پاراگراف قبل توضیح دادم، وقتی شبکه آموزش داده شد، شبکه به ازای هر ورودی یه بردار f میسازه که خروجی نرونهای لایه دومه. این بردار بعد از اینکه تو ماتریس Wپریم ضرب شه خروجی رو میسازه، پس این بردار نمایشی از ورودیه و بسته به اینکه ورودی و خروجی این شبکه عصبی چی هستند این نمایش میتونه ویژگیهای منحصر به فردی داشته باشه. مثلا اگه ورودی پیکسلهای خام عکس باشه و خروجی این باشه که این عکس هات داگه یا نه (سریال سیلیکون ولی رو دیدید؟)، این بردار f یا همون خروجی نرونهای لایه پنهان ویژگیهای استخراج شدهای از عکس هستند که طبق آمار موجود در دیتای آموزش، میتونن به تشخیص هات داگ بودن یا نبودن عکس کمک کنند. ویژگیهای مثل رنگ و فرم و چیزهای دیگه. البته که میدونیم یه شبکه عصبی سه لایه اونقدری قدرت یادگیری نداره که بتونه همچین مسئله سنگینی رو یاد بگیره و برای حل این مسئله نیاز به شبکههایی با لایههای بیشتر داریم و بعضا معماری متفاوت داریم. یک شبکه با لایههای بیشتر در واقع چیزی نیست جز یه تابع که بیشتر غیرخطیه و میتونه انعطافپذیری بیشتر از خودش تو فضای با ابعاد خیلی زیاد نشون بده.
نمیدونم چقدر تونستم با یه نوشته کوتاه مفهومی که تو ذهنم بود رو منتقل کنم. خلاصه تمام این حرفها این بود که گول نخورید، یادگیری ماشین و به طور کلی علوم کامپیوتر هیچ چیزی جز ریاضیات نیست و چوب جادوی پشت تمام این معجزات، چیزی جز همون فرمولهای پیچیده ریاضی نیستند.