سعی کردم هرچیزی که از جلسات دوره فهمیدم رو به صورت جزوه در بیارم و در این پلتفورم با بقیه به اشتراک بذارم. کل جلسات دوره 23 تاست که سعی میکنم هفتهای دو جلسه رو منتشر کنم. تا جایی که تونستم سعی کردم خوب و کامل بنویسم، اما اگر جایی ایرادی داشت، حتما تو کامنتها بهم بگید تا درستش کنم.
تو این بخش بعد یک دیدن یکسری تعریف و مفهوم، اول با خطای Structural و Approximation آشنا میشیم و بعد مفهوم خطای کلی رو میبینیم که یه جورایی میشه جمع این دوتا خطا و از روی اونا بهدست میاد.
اگر توزیع دادههارو میدونستیم، میتونستیم مجموع مجذورات خطارو روی کل توزیع به دست بیاریم. حالا اون مقدار W که باعث میشه این مقدار خطا کمینه بشه رو میخوایم به دست بیاریم و با *W نشونش میدیم. به عبارتی دیگه، بهترین خط رو از لحاظ تئوری داشته باشیم که از روی توزیع دادهها به دست بیاد (یعنی خطی باشه که سعی کنه expected loss رو حداقل کنه)
این رو مشخص میکنه که چقدر خطی که به دست آوردیم مدل خوبی هست برای دادهها و اگه خط به دست اومده مدل خوبی نباشه مقدار این خطا زیاد میشه.
در این نوع خطا، فرض کنید ما بهترین خط رو در تئوری داشته باشیم (همون *W) و یه خط دیگهای باشه که از روی دادهها به دست بیاد. حالا تفاضل این دو تا خط میاد یه مفهومی به نام Approximation Error رو مشخص میکنه.
از جمع دو خطای approximation و خطای structural بهدست میاد. در واقع میخوایم نشون بدم خطای کلی بین چیزی که در واقعیت وجود داره و چیزی که خودمون حساب کردیم در تعداد N تا سمپل، از جمع دو خطای approximation و خطای structural بهدست میاد.
حالا برای نشون دادن برقرار بودن این رابطه، اومده اول جمله W*TX رو کم و زیاد کرده. بعد اومده توان دوم رو روی دو تا جمله باز کرده (که میشه جمع مجذور جمله اول و جمله دوم + دو برابر حاصلضرب دو جمله). حالا برای اینکه به جوابی که دنبالش بودیم برسیم، باید برای مقدار "دو برابر حاصلضرب دو جمله" به جواب 0 برسیم. چجوری؟ این عبارت رو به شکل زیر بنویسیم و به جواب 0 برسیم.
روشی که تو اسلایدها هم اومده مشابه روش حل ما بوده:
پس تا اینجا دیدیم که خطای کلی میشه:
در ادامه به بررسی حالتهای دیگه از رگرسیون خواهیم پرداخت.
برای پاسخ به این سوال در ابتدا چند مثال ساده را بررسی کنیم.
فرض کنید رابطه بین x و y به شکل زیر باشد:
f(x) = 2(x)^2 + 0.1
حالا میخواهیم با استفاده از روشهای خطی که در جلسه گذشته بررسی کردیم و تغییر فضا، کاری کنیم که مدل غیرخطی در فضای اصلی با یک مدل خطی در یک فضای دیگر برابر شود.
مشخصا مدل خطی در فضای جدید با مدل غیرخطی در فضای اصلی باهم یکی هستند.
دو نوع داده مثبت و منفی داریم. مثبتها داخل یک فضای دایرهای هستند و منفیها خارج از آن قرار گرفتهاند.
با تغییر فضا میتوانیم یک به یک مدل خطی در فضای جدید برسیم.
بهجای اینکه یک بردار X داشته باشیم، میخواهیم روی آن تعدادی تبدیل اعمال کنیم و فضای ویژگی جدیدی بسازیم که در فضای ویژگی جدید دنبال خط بگردیم.
برای مثال در مثال دوم مقدار Phi(X) برابر با ویژگی اول به توان دو و ویژگی دوم به توان دو بود.
اگر بخوایم تمامی منحنیهای درجه دو رو در مثال دوم پوشش بدیم بردار ویژگی به شکل زیر تغییر میکنه:
میخوایم داده رو با استفاده از یه سری تبدیل ببریم به یک فضای جدید و اونجا دنبال یک رگرسیون خطی باشیم براش. با یه مثال ساده ادامه میدیم.
فرض کنید که بردار ویژگیمون فقط یه ویژگی داره. تو این حالت اگر بیایم به جای خط یه چند جملهای درجه m رسم کنیم، مثل این میمونه که فضای ویژگی جدیدمون رو یه فضای m بعدی در نظر گرفتیم. حالا اگر بخوایم تو فضای جدید خط پیدا کنیم باید چه کنیم؟ فضای بردار X رو باید عوض کنیم و ببریمش تو فضای جدید که با بردار 'X نشونش دادیم.
یه چند تا مثال از فضای جدید ببینیم. تو حالتی که خط داریم پیچیدگی نداریم ولی هرچقدر درجه رو افزایش دادیم مدلمون داره پیچیده میشه.
در ادامه جزییات هر کدام را خواهیم دید.
مثل این میمونه که phi(1) رو بعد اول داده، phi(2) رو بعد دوم داده و همینطور الی آخر انتخاب کرده باشیم.
هر phi توانهای مختلف برای x رو نشون میده. مثلا phi(3) نشون دهنده توان سوم x است. برای شهود بهتر شکل توابع پایه هم رسم شده است.
در حالتیکه x دارای d بعد باشد، تعداد جملاتی که داریم خیلی زیاد میشوند. مثلا اگر درجه x رو 2 در نظر بگیریم جملاتی که در بردار ویژگی جدید خواهیم داشت به شکل زیر است:
حالا مشکل چیه؟ تعداد ابعاد فضای جدید به شدت رشد میکنه. ماتریسی که خواهیم داشت ابعادش میشه m+1 در m+1 و مقدار m به شدت رشد میکنه و این باعث میشه دترمینان ماتریس 0 یا نزدیک به 0 بشه و دیگه نتونیم وارون ماتریس رو حساب کنیم.
فرض کنید در فضای یک بعدی یک گاوسی با میانگین و واریانس مشخصی داریم. پایهای که در اینجا در نظر گرفتیم دارای پارامتره. حالا مفهوم این پایه چیه اصلا؟ میگه به x هایی که نزدیک به میانگین (c1) هستن تو فضای تبدیل یافته مقدار زیادی اختصاص بده و هرچی از این نقطه دور تر میشی با یه شدتی مقدار اون نقاط رو تو فضای تبدیل یافته کم کن. میزان اون شدت با واریانس مشخص میشه.
حالا میایم یه سری از این گاوسیها رو در نظر میگیریم بعد هر کدوم رو در یه وزنی ضرب میکنیم. وزنها میتونن حتی منفی باشن.
هر phi هم میتونه به صورت زیر تعریف بشه.
در طول این درس در مورد انتخاب فضای ویژگی صحبتی نمیکنیم و فرضمون این هست که انگار این فضای پایه و تبدیلیافته از قبل انتخاب شده.
همه چیزهایی که تا الان گفتیم تو عکس زیر بهصورت خلاصه اومده. بردار وزن رو از روی بردار تبدیل یافته دادهها و بردار y به دست آوردیم.
حالا برگردیم به بحث ارزیابی مدل و در مورد اون یکمی صحبت کنیم.
مدلی که داریم باید روی نقاط جدید هم خوب عمل کنه و برای این کار میایم یه خطای مدل روی کل توزیع در نظر میگیریم و میخوایم که مقدارش کم باشه. حالا اگر حالتی باشه که مقدار این خطا خیلی زیاد بشه و در عین حال خطایی که رو نمونههای آموزش داریم مقدارش خیلی کم باشه، اصطلاحا میگیم overfitting رخ داده و مدلمون تعمیمپذیریش رو از دست داده. (یعنی مدل روی نمونهها داره خوب عمل میکنه ولی رو نمونههای جدید پیشبینی خوبی نداره)
حالا بریم یه مثال ببینیم. فرض کنید منحنی مطلوبی که داریم برای دادهها به صورت سینوسیه و با رنگ سبز نشونش دادیم. کم کم درجه چند جملهای رو زیاد میکنیم و حالتهای مختلف رو براش بررسی میکنیم. تو عکس پایین از سمت راست، حالتیه که overfitting رخ داده و خطایی که داریم روی سمپلها صفره ولی اختلافی که با منحنی سبز رنگ داریم خیلی زیاده.
حالا تو شکل پایین یه نمودار کشیدیم که به ازای درجه چند جملهای، ریشه دوم خطارو که بهش RMSE میگن رو تو دو حالت، برای نمونههای اصلی و دیتای تست حساب کردیم. وقتی درجه به 9 میرسه انگار یه چند جملهای با درجه 9 داریم که اگه حلش کنیم 10 تا جواب بهمون میده (تعداد نمونههامون هم 10 تاست) پس باعث میشه منحنی کاملا روی دادهها فیت بشه و مقدار خطا روی نمونهها دقیقا بشه 0. در عین حال خطای داده تست مقدارش خیلی زیاد بشه و overfitting رخ بده.
وقتی تعداد نمونهها رو زیاد میکنیم باعث میشه که تا حد خوبی جلوی overfitting گرفته بشه.
هرگاه خطای training ناچیز باشه و همزمان خطای true نزدیک به خطای training باشه. اگه خطای true به خطای train نزدیک باشه، به این معنیه که تعمیمپذیری به درستی داره انجام میشه و اگر خطای training مقدارش ناچیز باشه به این معنیه که از رو دادههای نمونه به خوبی استفاده کرده.
فرض کنید یه سری مدل داریم و دنبال این هستیم که کدوم مدل مناسب تره برامون (تعمیمپذیری مدل بیشتره). چجوری باید این کار رو انجام بدیم اصلا؟ ارزیابی اون مدل به چه صورتی باید باشه؟
سه تا تکنیک مختلف وجود داره که این جلسه دو موردش رو بررسی میکنیم.
میخوایم ببینیم مدلی که رو داده آموزش learn شده حالا چجوری میاد رو دادههای جدید عمل میکنه. برای ارزیابی عملکردش، همون اول میایم کل داده آموزش رو به دو قسمت دادههای train و validation تقسیم میکنیم. بعد از اینکه رو دادههای train مدل learn شد و پارامتراش در اومد، حالا میایم میانگین مجذورات خطا رو روی دادههای validation حساب میکنیم. این خطا همون خطای true هست. حالا اگه این عدد مقدارش کم باشه به این معنیه که مدلمون تعمیمپذیری خوبی داره.
ایرادات این روش:
بخشی از داده train رو از دست میدیم و اگر سایز validation به اندازه کافی زیاد نباشه عددی که بعنوان خطای true بهدست میاد خیلی قابل اعتماد نیست. اگر هم سایز train رو خیلی کم کنیم دادههای زیادی رو از دست دادیم و مدل به خوبی learn نمیشه.
حالا اگر از مجموعه validation برای تنظیم درجه چندجملهای استفاده کنیم، دیگه نمیتونیم ازش برای اندازهگیری خطای true استفاده کنیم. اگر بخوایم خطای true هم داشته باشیم، باید بیایم از اول دادهمون رو به سه قسمت train و validation و test تقسیم کنیم و بعد با استفاده از قسمت test که روش هیچ عملیاتی انجام نشده بیایم و مقدار خطای true رو محاسبه کنیم و ببینیم که تعمیمپذیری به چه صورت هست.
خیلی شبیه روش قبلیه اما با استفاده از میانگینگیری سعی میکنه جوابی که به دست میاد رو دقیقتر بکنه. حالا نحوه کارش اینطوره که انگار میاد هر دفعه دادههای train رو بعد از اینکه شافل کرد، به چند تا بخش مساوی (مثلا k) تقسیم میکنه، بعد تو هر دور یکی از بخشها رو بعنوان مجموعه validation و بقیه بخشهارو (1-k) بعنوان train در نظر میگیره. حالا میاد جوابهای هر مرحله رو تهش ازش میانگین میگیره. این میانگین میتونه نشون دهنده همون خطای true باشه.
حالا چجوری با روش CV بیایم مدل انتخاب کنیم؟ اینطوره که میایم به ازای مدلهای مختلفی که داریم مقدار خطای میانگینی که با روش CV به دست میاد رو حساب میکنیم. بعد مدلی که این مقدار توش از همه کمتر شده رو انتخاب میکنیم.
مثلا فرض کنید چهار تا مدل مختلف داریم و میخوایم ببینیم کدومش بهتره که انتخاب بشه. اومدیم دیتای train رو به 5 بخش تقسیم کردیم و بعد با روش CV میانگین حساب کردیم. اون مدلی انتخاب میشه که میزان خطا توش از همه کمتر باشه.
وقتی سایز دیتای train خیلی کوچیک باشه، به جای اینکه بیاد دیتارو به k بخش تقسیم کنه از هر نمونه استفاده میکنه و هر نمونه رو انگار یه بخش در نظر میگیره.
به این صورته که میایم به تابع هزینهمون یه ترم جدید با یه ضریب اضافه میکنیم تا به کمک اون جلوگیری کنیم از overfitting. الان کلا میخوایم چیکار کنیم؟ میخوایم هم مقدار جمله اول رو در کمترین حالت نگه داریم هم مقدار بردار وزن رو کم کنیم تا جایی که میشه تا اون جمله دوم هم مقدارش کم بمونه. یعنی اگه دو تا مدل باشن که مقدار تابع هزینه توشون یکسان بشه، مدلی رو انتخاب میکنه که وزن کمتری داره.
حالا ببینیم چجوری میاد محاسبات انجام میده و به اون مقدار برای W میرسه.
رابطه زیر هم نشون میده که چجوری مشتق WTW حساب میشه.
حالا این لاندا اثرش اینجا به چه صورته؟ برای اینکه جواب این سوال رو بدیم بریم یه مثال ببینیم. یه مثال داشتیم که 10 تا نمونه داشت و یه سینوسی ازش رد میشد و جواب مطلوب بود، همون مثال رو اینجا بررسی میکنیم. همونطور که از جدول پایین مشخصه، اگه بیایم قدرمطلق ضرایب رو در نظر بگیریم ضرایب w همینطور دارن رفته رفته بزرگ و بزرگتر میشن. حالا چرا اینجوری بزرگ میشن؟ برمیگرده به معکوس ماتریس و دترمینان. برای محاسبه معکوس ماتریس مقدار 1 بر روی دترمینان رو باید حساب کنیم و حالا وقتی مقدار دترمینان نزدیک به صفر بشه باعث میشه که معکوس ماتریس عدد بزرگتری داشته باشه.
حالا این لاندا اینجا چجوری اثر میذاره؟ با جمع کردن مقدار لاندا این تضمین به وجود میاد که قطر اصلی ماتریس قطعا مقدارش غیر صفره و در این صورت دترمینان هیچوقت صفر نمیشه و ماتریس معکوس پذیر میشه و همین باعث میشه که مقدار معکوس ماتریس خیلی مقدار بزرگی نشه مقدارش.
وقتی لاندارو بزرگ انتخاب میکنیم داریم به وزن انتخاب شده اهمیت بیشتری میدیم و اگر خیلی کوچیک انتخابش کنیم تابع هزینه به همون حالت اولیهش برمیگرده.
اگر جایی ایراد یا مشکلی بود، حتما بهم بگید تا تصحیحش کنم.