تو پست قبلی درباره ی اینکه ماشین لرنینگ چیه توضیح دادم و تو این پست میخوام درباره ی انواع روش ها یا همون دسته بندی الگوریتم های ماشین لرنینگ صحبت کنم. اما قبل از اینکه بریم سراغ مطالب این دفعه میخوام تعریف ماشین لرنینگ که تو پست قبلی گفتم رو دوباره یادآوری کنم:
ماشین لرنینگ یه سری روش هوش مصنوعی هستند که به کامپیوتر اجازه میدن خوش دانش خودش رو استخراج کنه و بر اساس اونا کاری که ازش خواسته شده رو انجام بده.
خب حالا سوال اینه که چه جوری یک الگوریتم کامپیوتری باید بتونه دانش خودش رو استخراج کنه؟ یکی از این روش ها میتونه این باشه که ما به الگوریتم یک سری داده بدیم و الگوریتم تلاش کنه بر اساس اون داده ها، دانش خودش رو استخراج کنه.
مثلا بیایم و به الگوریتم یک سری عکس تحویل بدیم و بگیم که این عکس ها مربوط به رادیولوژی هایی هستند که مریض سرطان داشته و اینا مربوط به مریض هایی که سرطان ندارن. حالا خودت برو و بر اساس این عکس ها متوجه بشو (یاد بگیر) که کیا سرطان دارن و کیا سرطان ندارن.
یا مثلا میتونیم بیایم و به الگوریتم یک سری داده بدیم و ازش بخوایم بره توش الگو پیدا کنه، مثلا داده های یک سری مشتری رو بهش بدیم و الگوریتم بده و بر اساس اونا پیدا کنه که مشتری های ما چند تا دسته هستند. (حالا اینکه مشتری ها رو بر چه اساس دسته بندی میکنه رو خودش باید تشخیص بده، در واقع به صلاح دید خودش میاد و مشتری های ما رو دسته بندی میکنه.)
خب حالا با این دید اولیه بریم سراغ اینکه روش های ماشین لرنینگ چیا هستن:
الگوریتم های supervised learning، یک دسته از الگوریتم های ماشین لرنینگ هستند که ورودی اون ها یک سری داده ی برچسب داره. یعنی چی؟ مثلا داده های ما میتونن عکس های رادیولوژی ای باشن که تو مقدمه گفتم. و label (برچسب) داده ها اینه که مریض سرطان دارد یا ندارد. یا مثلا میتونه اطلاعات یک سری خونه (تعداد اتاق خواب، متراژ، محله، آپارتمانی هست یا نه، حیاط داره یا نه و....) باشه و label قیمت خونه باشه.
اگر بخوایم یکم دقیق تر صحبت کنیم باید اینجوری بگیم که ورودی الگوریتم ما یک سری x و y هستند که x ها داده ها و y ها برچست اون داده ها هستند.
هدف ما تو این روش ها اینه که بر اساس داده یا همون x بیایم و مقدار label یا همون y رو پیدا کنیم. (یا به طور دقیق تر، تخمین بزنیم).
پس میتونیم فرض کنیم الگوریتم ما داره یک تابع رو تخمین میزنه که ورودی اون x و خروجی اون y هست.
خود این الگوریتم ها به دو دسته تقسیم میشن:
اگر label یک مقدار پیوسته باشه (مثل قیمت، طول عمر احتمالی، قد، وزن، درآمد و...) میگیم با مسئله ای از نوع regression سر و کار داریم و به الگوریتیمی که بتونه این نوع مسئله رو حل کنه (با گرفتن x ، مقدار y رو حدس بزنه که خود y یک مقدار پیوسته هست) میگیم regressor
اگر label گسسته یک مقدار گسسته باشه (شیر/خط، خوشخیم/بدخیم، ارزون/عادی/گرون و....) میگیم با مسئله ای از نوع classification سر و کار داریم و به الگوریتیمی که بتونه این نوع مسئله رو حل کنه (با گرفتن x ، مقدار y رو حدس بزنه که خود y یک مقدار گسسته هست) میگیم classifier
خیلی از الگوریتم های ماشین لرنینگ که الان تو صنعت ازشون استفاده میشه جزو همین دسته هستند.
تو این دسته از الگوریتم ها داده های ما label ندارن و الگوریتم باید از بین اون ها الگو استخراج کنه.
مثلا ممکنه از الگوریتم بخوایم با گرفتن اطلاعات یک سری مشتری اونا رو دسته بندی کنه، یا مثلا با گرفتن اطلاعات یک حساب بانکی بگه که این حساب فعالیت مشکوکی داره یا نه (مثلا داره پولشویی میکنه یا نه، یا اینکه ممکن هست خرید های آخر حساب مال صاحب واقعی حساب نباشه).
در کل این روش ها دنبال استخراج الگو از داده ها هستن.
منطقا چون حجم داده های بدون label از داده هایی که label دارن بیشتره و دسترسی به داده های بدون label راحت تره، دانشمندا خیلی دوست دارن از این روش ها بیشتر استفاده کنن و الگوریتم هایی بسازن که با این روش ها کار کنه ولی همچنان روش های supervised صنعتی تر هستند.
تو این روش ها ما یک عامل هوشمند داریم که قراره یاد بگیره چه جوری یک کاری (که معمولا بر خلاف روش های قبلی که باید یک مقداری رو پیدا میکردیم یا دسته بندی میکردیم، باید در طول زمان یک سری از عملیات رو انجام بده. مثلا بخوایم یک ربات راه بره، یا یک برنامه برای مریض دارو تجویز کنه، یا یک الگوریتم با 1000 دلار برامون سهام بخره) رو انجام بده.
این دفعه دیگه داده ای نداریم (و تو یک سری وقت ها خودمون هم دقیق نمیدونیم چه جوری باید اون کار رو انجام بدیم، مثلا ما دقیقا نمیدونیم چه جوری باید یه ربات به موتور هاش ورودی/خروجی بده که بتونه راه بره) ولی به جاش میتونیم هر وقت ربات کار خوبی کرد بهش بگیم آفرین! و هر وقت کار بدی کرد دعواش میکنیم.
در واقع مدل رو ول میکنیم تو محیط که خودش شروع کنه و تلاش کنه کاری که میخوایم رو انجام بده، هر وقت کار خوبی کرد بهش میگیم آفرین! و هر وقت کار بدی کرد دعواش میکنیم میکنیم. این آفرین (پاداش) و دعوا کردن (تنبیه) به این صورته که هر وقت عامل کار خوبی انجام داد بهش یک عدد مثبت و هر وقت کار بدی کرد بهش عدد منفی یا صفر میدیم. (انگار بهش میگیم برو کار انجام بده، بعد آخرش بهش نمره میدیم) که به این عدده میگیم reward.
توی این روش ها عامل هوشمند ما باید یاد بگیریه که reward خودش رو بیشینه کنه و طبق فرضیه های یادگیری تقویتی اگر درست بهش reward بدیم میتونه کاری که میخوایم رو یاد بگیریه (حالا سوالی که پیش میاد اینه که میشه هر کاری رو با این روش به ربات یا داد؟ جواب این سوال هنوز مشخص نیست و یکی از مسائل باز یادگیری تقویتیه)
تو این روش بخشی از داده های ما برچسب دارن و بخش دیگه ی اونها ندارن. مثلا ممکنه یک گراف داشته باشیم که یک سری از node ها برچسب داشته باشن و یک سری دیگه نداشته باشن و ما باید به تمام node ها برچسب بزنیم.
جدیدا یک سری روش های دیگه رو هم تو این دسته بندی ها اضافه میکنن ولی نمیشه به خیلی از اونها گفت یک دسته ی جدا چند تا از مهم ترین های اون ها یادگیری انتقالی (transfer learning) و یادگیری با نظارت خود یا خود نظارتی (self-supervised learning) هستن.
یادگیری انتقالی (transfer learning) یک روش خیلی پر کاربرده (به خصوص تو deep learning) که جلوتر بیشتر دربارش حرف میزنیم ولی واقعا نمیشه اون رو یک دسته ی جدا فرض کرد.
یادگیری خود نظارتی (self-supervised) هم وقتیه که الگوریتم خودش بتونه برای خودش label تولید کنه! (سوالی که ممکنه پیش بیاد اینه که اگر خودش میتونه label رو تولید کنه چرا باید یاد بگیره؟) این بحث رو فعلا میذاریم کنار تا وقتی به پست های مربوط به NLP و NLU رسیدیم کامل توضیح میدم که داستانش چیه ولی باز هم فعلا بهتره که اون رو یک روش جداگانه در نظر نگیریم. (بیشتر به unsupervised ها میخوره)
تو پست بعدی میریم سراغ اولین الگوریتم ماشین لرنینگ به نام linear regression.