قراره بخشی از آینده رو من بسازم ? - مهندس مکانیک شریفم - متخصص ML و AI - دارم تلاش میکنم با هوش مصنوعی سرطان رو در انسان ها شکست بدم
Supervised Learning - قسمت دوم
سلام. من امیر داعی هستم و با قسمت چهارم از مجموعه هوش مصنوعی برای همه در خدمتتونم.
امروز میخوام درمورد مبحث مهمی به نام generalization در یادگیری ماشین صحبت کنم. generalization یا توانایی تعمیم دادن به معنی اینه که سیستم یادگیری ماشین بتونه مواردی رو که یادگرفته، برای نمونه های جدید و از قبل دیده نشده استفاده کنه و بتونه اون ها رو به خوبی دسته بندی کنه. در بعضی شرایط یک سیستم ML ممکنه اینقدر ضعیف باشه که حتی داده های train رو هم نتونه به خوبی دسته بندی کنه (نمونه های دیده نشده که هیچ) که به این وضعیت under-fit گفته میشه و در بعضی شرایط دیگه ممکنه سیستم به قدری قوی باشه که داده های train رو به صورت کامل در حافظه اش ضبط کنه و بر روی اون ها دقت خروجی خیلی خوبی (مثلا دقت ۱۰۰درصد) بده، ولی برای نمونه های جدید نمیتونه دقت خوبی رو نشون بده و به عبارتی توانایی تعمیم نداره که به این شرایط over-fit گفته میشه.
منظورم از قوی بودن یک سیستم ML، پتانسیل اون برای یاد گرفتن سیستم های پیچیده تر هست و در اصطلاح فنی به اون ظرفیت یا capacity گفته میشه. هر الگوریتم یادگیری ماشین برای افزایش یا کاهش ظرفیت، یک روند مخصوص به خودش رو داره. مثلا در ANN با افزایش تعداد نورون ها و لایه های پنهان میشه ظرفیت رو افزایش داد و بالعکس (در آینده میگم اینا چی هستن، صبر داشته باشید?).
یک مثلا ساده در مورد ظرفیت و over/under fit رو در متد برازش (قسمت قبل یه اشاره ساده کردم بهش) توضیح میدم. در برازش ظرفیت بر اساس درجه تابعی که نمودار رو بهش فیت میکنیم تعیین میشه. مثلا یک خط ساده، تابع با درجه ۱ رو به شکل ax+b و یک نمودار سهمی، یک تابع با درجه دو به شکل ax^2+bx+c رو برای برازش میطلبه. در این توابع با پیدا کردن مقادیر مناسب برای a,b,c باید نمودار رو فیت کنیم که تعداد این متغیر ها برابر درجه تابع+۱ است.حالا فرض کنید نموداری که میخوایم فیت کنیم، یک سیستم با درجه ۲ هست و فقط ۳ نقطه از اون رو به عنوان نقاط train داریم. با تعیین درجه ۲ به عنوان درجه تابع برازش، ۳ متغیر مجهول برای فیت کردن باید تعیین بشن (a,b,c) و با داشتن ۳ نقطه معلوم این معادله یک جواب یکتا داره (ریاضی اول دبیرستان) و نمودار به خوبی فیت میشه. اگه ظرفیت تابع برازش رو کم کنیم و درجه تابع برازش رو ۱ انتخاب کنیم چی؟ ۲ مجهول و ۳ نقطه معلوم داریم: پاسخ دقیقی برای این معادله نداریم و مقادیر متغیر ها به صورت تقریبی به دست میاد که برای نقاط آموزش و هم سایر نقاط سهمی خطای زیادی داره. این حالت under-fit است. حالا اگه ظرفیت رو افزایش بدیم و درجه تابع رو مثلا ۳ بگیریم چطور؟ با داشتن ۴ مجهول در تابع و ۳ نقطه معلوم از نمودار، بینهایت پاسخ برای مجهول ها داریم که همگی ۳ نقطه train را به خوبی پوشش میدن (با خطای ۰) ولی فقط یکی از این پاسخ هاست که نمودار سهمی اصلی را به درستی پوشش میده و بقیه برای بقیه نقاط سهمی خطای زیادی دارن که به این شرایط over-fit میگیم.
پیدا کردن روی دادن over/under fit همیشه به این سادگی نیست. اگه تعداد نقاطی که برای train داریم کمتر یا بیشتر از درجه سیستم بود چی؟ در توابع دنیای واقعی تقریبا هیچ وقت ما نمیدونیم درجه سیستم چند هست و تعداد پارامتر های ورودی تابع تقریبا هیچ وقت ۱ نیست (توابع از ۲ بعد به بالا هستند). همینطور تو الگوریتم های یادگیری ماشین تنظیم کردن درجه تابع برای فیت کردن هم به این واضحی نیست و مثلا در یک DNN این که بگیم تابعی که فیت شده از چه درجه ای است کار بسیار سختیه. همینطور در کاربرد های واقعی همیشه در اندازه گیری های ما در data point های train مقداری نویز وجود داره که نمیذاره هیچوقت سیستم ML به دقت ۱۰۰٪ برسه (در مناسب ترین ظرفیت و بهترین شرایط) و با کاهش یا افزایش ظرفیت صرفا دقت در دیتا دیده نشده، از این مقدار بهینه کمتر میشه.
عمومی ترین راهی که برای شناسایی under/over fit در پروسه طراحی سیستم ML انجام میشه، تقسیم بندی دیتا هایی که داریم به دو بخش train و test هست. مثلا ۸۰-۹۰ درصد دیتا پوینت هایی که داریم رو به عنوان train بقیه رو به عنوان test انتخاب میکنیم. پروسه یادگیری در ML اکثرا به صورت تکرار یک حلقه هست که با تکرار این حلقه (epoch) خطای سیستم کمتر و کمتر میشه تا به مقدار مدنظر برسه. در هر epoch فقط از دیتا train برای آموزش استفاده میکنیم و در انتهای epoch مقدار خطای سیستم ML رو برای دیتا test محاسبه میکنیم. با مقایسه مقدار خطای train و test و روندی که این خطا در حال تغییر هست (به ازای epochها) میشه over/under fit رو شناسایی کرد. اگه کاهش خطا با افزایش epochها برای هردو صفر یا خیلی کم باشد یا دارای نوسان بسیار زیاد باشد، در این حالت under-fit رخ داده است و اگر مقدار خطای سیستم برای train در حال کاهش و برای test درحال افزایش باشد، در اینصورت over-fit رخ داده است. نمونه ای از نمودار یادگیری در شرایط over-fit رو در شکل زیر میبینید:
راه کار عمومی برای حل مشکل under-fit افزایش ظرفیت ML هست ولی این افزایش ظرفیت برای رسیدن به دقت مدنظر ممکنه به over-fit بیانجامه و برای حل مشکل over-fit باید دوباره ظرفیت رو کم کرد (منطقی نیست) یا تعداد data point ها رو افزایش داد و با افزایش تعداد data pointها ممکنه با ثابت موندن ظرفیت شرایط under-fit دوباره رخ بده و این داستان ادامه دارد ?. پس تعیین ظرفیت و تعداد data-point های مورد نیاز، در یک پروسه به صورت چرخه به دست میاد و برای توابع و اهداف مختلف خیلی متفاوته و واقعا هم کار سختیه.
بیشتر مشکل توسط over-fit به وجود میاد (تا under-fit) چون با حل کردن مسئله under-fit دقت افزایش پیدا میکنه ولی در پروسه افزایش دقت over-fit رخ میده و نمیذاره از یه حدی بیشتر دقت به دست بیاریم (مگر تعداد data point ها رو زیاد کینم). هر الگوریتم ML البته یک ترفندی مخصوص به خودش رو برای کاهش اثر over-fit داره. یک روش early stopping است که در پروسه training نمودار train,test رو رصد میکنیم و جایی که خطای test به جای کاهش شروع به افزایش کرد پروسه آموزش رو متوقف میکنیم (شکل بالا) و از خروجی اون به عنوان سیستم نهایی استفاده میکنیم. در ANN متد های دیگه ای مثل dropout, noise layer, L1/L2 regularization و ... هم برای کاهش اثر over-fit وجود دارن که در آینده بهشون میپردازیم.
در قسمت بعدی وارد حوزه شبکه های عصبی مصنوعی میشیم.
خوشحال میشم به من فیدبک بدید (اعم از خوب و بد) تا بتونم مطالب رو به صورت مفید تری ارائه بدم. آی دی تلگرام: @amir_daaee
منتظر مطالب بعدی من باشید...
مطلبی دیگر از این انتشارات
چگونه اندازه بازار را تخمین بزنیم؟
مطلبی دیگر از این انتشارات
چطوری سرعت کوئری های تحلیلی SQL رو بیش از ۱۰۰۰ برابر افزایش دادم!
مطلبی دیگر از این انتشارات
از هوش مصنوعی استفاده کن و راحت پایتون کد بزن!