من سعی دارم تو یک سری از مطالب پشت سر هم خلاصه ای از کتاب صدصفحه ای یادگیری ماشین نوشته آندری بورکوف رو اینجا بنوسیم. برای اینکه فصل قبل رو بخونید می تونید از لینک زیر استفاده کنید.
تو این فصل در مورد ویژگی های یک الگوریتم یادگیری ماشین قبل از انتخاب برای حل مسال خودمون باید درنظر بگیریمشون، صحبت می کنیم.
اگه فصل های قبل رو مطالعه کرده باشید، احتمالا متوجه شدید که هر الگوریتم یادگیری ماشین دارای سه بخشه:
1- یک تابع هزینه
2- یک معیار بهینه سازی بر اساس تابع هزینه
3- یک روتین بهینه سازی که هدفش ساختن بهترین مدل برای داده های آموزشی بر اساس معیار بهینه سازیه.
یکی از پرکاربردترین الگوریتم های بهینه سازی روش گرادیان دیسنت و یا گرادیان دیسنت تصادفیه. گرادیان دیسنت از یک نقطه تصادفی شروع میکنه و معمولا منجر به رسیدن به جواب بهینه محلی میشه. برای توابع هزینه ای که شکل محدب دارند مثل توابع هزینه الگوریتم های SVM، رگرسیون خطی و لجستیک، یک نقطه بهینه کلی وجود داره که مطمئنیم که گرادیان دیسنت اون رو پیدا خواهد کرد. برای الگوریتمی مثل شبکه عصبی این موضوع برقرار نیست ولی در اکثر مواقع رسیدن به یه جواب بهینه محلی هم می تونه کافی باشه.
برای اینکه نحوه کار گرادینت دیسنت رو یادبگیریم یه مثال رو برای یک رگرسیون خطی استفاده می کنیم. هدف این مساله پیدا کردن یک رابطه خطی بین میزان سرمایه گذاری در تبلیغات و میزان فروش یک شرکته. داده های مرتبط با 200 شرکت جمع آوری شده که نمونه اونرو می تونید تو جدول زیر ببینید.
شکل زیر یه نمودار پراکندگی برای رابطه بین اندازه فروش و هزینه تبلیغات نشون میده.
تابع ما به صورتf(x)=wx+b نوشته میشه که مقدار بهینه w و b رو نمی دونیم. برای این موضوع ما تابع هزینه رو به صورت زیر تعریف می کنیم.
گرادیان دیسنت از تابع هزینه نسبت به مقادیر مجهول مشتق جزیی می گیره که میشه فرمولهای زیر.
گرادیانت دیسنت در اپک های (epoch) مختلف عمل می کنه. هر اپک از یک مجموعه از داده های آزمایشی برای به روز رسانی پارامترها استفاده می کنه. در اپک اول مقدار w و b رو برابر با صفر قرار میدیم و مشتقات جزیی رو محاسبه می کنیم. در هر اپک مقدار پارامترها رو براساس یک نرخ یادگیری آلفا به روز می کنیم.
در اپک بعد ما مشتقات جزیی رو براساس فرمول دو دوباره محاسبه می کنیم و مراحل رو تکرار می کینم. این فرایند آنقدر تکرار میشه تا به شرایط همگرایی برسه. داخل کتاب می تونید کدهای پایتون این روش رو ببینید.
شکل زیر خط رگرسیونی ایجاد شده رو بر اساس تعداد اپک های مختلف نمایش میده.
مشکلاتی که روش گرادیانت دیسنت داره یکی حساسیت بالا به نرخ یادگیری و دیگری سرعت پایین در دیتاست های بزرگه. یکی از راه حل ها، استفاده از Minibatch stochastic gradient descent (minibatch SGD) خواهد بود که سرعت یادگیری رو با استفاده از زیرمجموعه ای از داده ها در هر اپک افزیش میده. تو اینجا می تونید بیشتر در مورد این روش بخونید. خود minibatch SGD چندین آپگرید داره. Adagrad با تغییر آلفا بر اساس هیستوری گرادیان سرعت رو بهبود میده. Momentum با جهت دهی گرادیان از نوسان کردن اون حول نقطه بهینه جلوگیری می کنه. در شبکه های عصبی ورژن های RMSprop و Adam خیلی پرکاربرد هستند.
نکته مهمی که باید در نظر داشته باشید اینه که گرادیان دیسنت و ورژن های مختلف اونها الگوریتم های یادگیری ماشین نیستند بلکه روشهایی برای حل مساله بهینه سازی هستند.
برای استفاده از روشهایی مثل گرادیان دیسنت لازم نیست که این فرمول ها رو خودمون پیاده سازی کنیم. کتابخانه های منبع باز زیادی وجود داره که این روشها رو پیاده سازی کردن. یکی از مهمترین کتابخانه های یادگیری ماشین Scikit-Learn در پایتون هست. لینک های زیر حل دوتا مساله با کمک این روش خواهد بود.
یک مهندس یادگیری ماشین حتما باید با کتابخونه هایی مثل scikit-learn و یا روشهای مشابه آشنایی داشته باشه تا بتونه تو حل مساله ها بهینه عمل کنه. کتاب Hands-on Machine Learning with Scikit-Learn یکی از کتابهای خیلی خوب در این زمینه است که خودم به تازگی شروع به خودندش کردم و به نظرم خیلی جامع کتابخانه های لازم رو بررسی می کنه. اینجا می تونید یه ریویو از کتاب رو بخونید.
هر الگوریتم یادگیری ماشین ویژگی های مختص خودش داره که اون رو از بقیه الگوریتم ها متمایز می کنه.
تو فصل بعد در باره مسائلی که در یک پروژه یادگیری ماشین با اون روبرو میشیم و راه حل هاش صحبت خواهیم کرد.