هانیه مهدوی
هانیه مهدوی
خواندن ۱۱ دقیقه·۳ سال پیش

جزوه دوره یادگیری ماشین دکتر مهدیه سلیمانی - جلسه چهارم - رگرسیون غیرخطی

سعی کردم هرچیزی که از جلسات دوره فهمیدم رو به صورت جزوه در بیارم و در این پلت‌فورم با بقیه به اشتراک بذارم. کل جلسات دوره 23 تاست که سعی می‌کنم هفته‌ای دو جلسه رو منتشر کنم. تا جایی که تونستم سعی کردم خوب و کامل بنویسم، اما اگر جایی ایرادی داشت، حتما تو کامنت‌ها بهم بگید تا درستش کنم.

محتوای این جلسه

  • انواع خطا در مسئله رگرسیون خطی (که از جلسه گذشته باقی‌مونده)
  • تعمیم رگرسیون به حالت‌های غیرخطی و پیچیده‌تر

انواع خطا در مسئله رگرسیون خطی

تو این بخش بعد یک دیدن یک‌سری تعریف و مفهوم، اول با خطای Structural و Approximation آشنا میشیم و بعد مفهوم خطای کلی رو می‌بینیم که یه جورایی میشه جمع این دوتا خطا و از روی اونا به‌دست میاد.

تعریف *W

اگر توزیع داده‌هارو می‌دونستیم، می‌تونستیم مجموع مجذورات خطارو روی کل توزیع به دست بیاریم. حالا اون مقدار W که باعث میشه این مقدار خطا کمینه بشه رو می‌خوایم به دست بیاریم و با *W نشونش میدیم. به عبارتی دیگه، بهترین خط رو از لحاظ تئوری داشته باشیم که از روی توزیع داده‌ها به دست بیاد (یعنی خطی باشه که سعی کنه expected loss رو حداقل کنه)

خطای Structural

این رو مشخص می‌کنه که چقدر خطی که به دست آوردیم مدل خوبی هست برای داده‌ها و اگه خط به دست اومده مدل خوبی نباشه مقدار این خطا زیاد میشه.

خطای Approximation

در این نوع خطا، فرض کنید ما بهترین خط رو در تئوری داشته باشیم (همون *W) و یه خط دیگه‌ای باشه که از روی داده‌ها به دست بیاد. حالا تفاضل این دو تا خط میاد یه مفهومی به نام Approximation Error رو مشخص می‌کنه.

خطای کلی

از جمع دو خطای approximation و خطای structural به‌دست میاد. در واقع می‌خوایم نشون بدم خطای کلی بین چیزی که در واقعیت وجود داره و چیزی که خودمون حساب کردیم در تعداد N تا سمپل، از جمع دو خطای approximation و خطای structural به‌دست میاد.

  • جمله اول داره خطایی رو نشون میده که بابت انتخاب تابع خطی متحمل میشیم. (خطای structural)
  • جمله دوم داره خطایی رو نشون میده که بابت داشتن تعداد محدود N تا سمپل به‌دست اومده. (خطای approximation)

حالا برای نشون دادن برقرار بودن این رابطه، اومده اول جمله W*TX رو کم و زیاد کرده. بعد اومده توان دوم رو روی دو تا جمله باز کرده (که میشه جمع مجذور جمله اول و جمله دوم + دو برابر حاصل‌ضرب دو جمله). حالا برای اینکه به جوابی که دنبالش بودیم برسیم، باید برای مقدار "دو برابر حاصل‌ضرب دو جمله" به جواب 0 برسیم. چجوری؟ این عبارت رو به شکل زیر بنویسیم و به جواب 0 برسیم.

روشی که تو اسلایدها هم اومده مشابه روش حل ما بوده:

پس تا اینجا دیدیم که خطای کلی میشه:

  • خطایی که برای محدود در نظر گرفتن فضای فرضیه متحمل شدیم. (بخش اول)
  • خطایی که بخاطر در اختیار داشتن تعداد محدود نمونه‌های train به‌دست اومده. (بخش دوم)

در ادامه به بررسی حالت‌های دیگه از رگرسیون خواهیم پرداخت.

چگونه مفهوم رگرسیون خطی را که در جلسه گذشته دیدیم، به رگراسیون در حالت‌های پیچیده‌تر و غیرخطی تعمیم دهیم؟

برای پاسخ به این سوال در ابتدا چند مثال ساده را بررسی کنیم.

مثال اول

فرض کنید رابطه بین x و y به شکل زیر باشد:

f(x) = 2(x)^2 + 0.1

حالا می‌خواهیم با استفاده از روش‌های خطی که در جلسه گذشته بررسی کردیم و تغییر فضا، کاری کنیم که مدل غیرخطی در فضای اصلی با یک مدل خطی در یک فضای دیگر برابر شود.

مشخصا مدل خطی در فضای جدید با مدل غیرخطی در فضای اصلی باهم یکی هستند.

مثال دوم

دو نوع داده مثبت و منفی داریم. مثبت‌ها داخل یک فضای دایره‌ای هستند و منفی‌ها خارج از آن قرار گرفته‌اند.

با تغییر فضا می‌توانیم یک به یک مدل خطی در فضای جدید برسیم.

تبدیل روی بردار X

به‌جای اینکه یک بردار X داشته باشیم، می‌خواهیم روی آن تعدادی تبدیل اعمال کنیم و فضای ویژگی جدیدی بسازیم که در فضای ویژگی جدید دنبال خط بگردیم.

برای مثال در مثال دوم مقدار Phi(X) برابر با ویژگی اول به توان دو و ویژگی دوم به توان دو بود.

اگر بخوایم تمامی منحنی‌های درجه دو رو در مثال دوم پوشش بدیم بردار ویژگی به شکل زیر تغییر می‌کنه:

ایده کلی کار

می‌خوایم داده رو با استفاده از یه سری تبدیل ببریم به یک فضای جدید و اونجا دنبال یک رگرسیون خطی باشیم براش. با یه مثال ساده ادامه میدیم.

فرض کنید که بردار ویژگی‌مون فقط یه ویژگی داره. تو این حالت اگر بیایم به جای خط یه چند جمله‌ای درجه m رسم کنیم، مثل این می‌مونه که فضای ویژگی جدیدمون رو یه فضای m بعدی در نظر گرفتیم. حالا اگر بخوایم تو فضای جدید خط پیدا کنیم باید چه کنیم؟ فضای بردار X رو باید عوض کنیم و ببریمش تو فضای جدید که با بردار 'X نشونش دادیم.

یه چند تا مثال از فضای جدید ببینیم. تو حالتی که خط داریم پیچیدگی نداریم ولی هرچقدر درجه رو افزایش دادیم مدلمون داره پیچیده میشه.

توابع انتقال پایه Basis Function

  • مدل خطی
  • مدل چند جمله‌ای
  • مدل گاوسی

در ادامه جزییات هر کدام را خواهیم دید.

مدل خطی

مثل این می‌مونه که 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 رخ داده و مدلمون تعمیم‌پذیریش رو از دست داده. (یعنی مدل روی نمونه‌ها داره خوب عمل می‌کنه ولی رو نمونه‌های جدید پیش‌بینی خوبی نداره)

حالا بریم یه مثال ببینیم. فرض کنید منحنی مطلوبی که داریم برای داده‌ها به صورت سینوسیه و با رنگ سبز نشونش دادیم. کم کم درجه چند جمله‌ای رو زیاد می‌کنیم و حالت‌های مختلف رو براش بررسی می‌کنیم. تو عکس پایین از سمت راست، حالتیه که overfitting رخ داده و خطایی که داریم روی سمپل‌ها صفره ولی اختلافی که با منحنی سبز رنگ داریم خیلی زیاده.

حالا تو شکل پایین یه نمودار کشیدیم که به ازای درجه چند جمله‌ای، ریشه دوم خطارو که بهش RMSE میگن رو تو دو حالت، برای نمونه‌های اصلی و دیتای تست حساب کردیم. وقتی درجه به 9 میرسه انگار یه چند جمله‌ای با درجه 9 داریم که اگه حلش کنیم 10 تا جواب بهمون میده (تعداد نمونه‌هامون هم 10 تاست) پس باعث میشه منحنی کاملا روی داده‌ها فیت بشه و مقدار خطا روی نمونه‌ها دقیقا بشه 0. در عین حال خطای داده تست مقدارش خیلی زیاد بشه و overfitting رخ بده.

دلایل Overfitting

  • پیچیده کردن مدل
  • تعداد کم داده آموزش

وقتی تعداد نمونه‌ها رو زیاد می‌کنیم باعث میشه که تا حد خوبی جلوی overfitting گرفته بشه.

چگونه ارزیابی کنیم که مدل چقدر قدرت تعمیم داره؟

  • راه‌های practical
  • راه‌های تئوری

چه زمانی عملیات یادگیری به درستی انجام شده؟

هرگاه خطای training ناچیز باشه و همزمان خطای true نزدیک به خطای training باشه. اگه خطای true به خطای train نزدیک باشه، به این معنیه که تعمیم‌پذیری به درستی داره انجام میشه و اگر خطای training مقدارش ناچیز باشه به این معنیه که از رو داده‌های نمونه به خوبی استفاده کرده.

چجوری مدل انتخاب کنیم و اون رو ارزیابی کنیم؟

فرض کنید یه سری مدل داریم و دنبال این هستیم که کدوم مدل مناسب تره برامون (تعمیم‌پذیری مدل بیشتره). چجوری باید این کار رو انجام بدیم اصلا؟ ارزیابی اون مدل به چه صورتی باید باشه؟

سه تا تکنیک مختلف وجود داره که این جلسه دو موردش رو بررسی می‌کنیم.

روش simple hold-out

می‌خوایم ببینیم مدلی که رو داده آموزش learn شده حالا چجوری میاد رو داده‌های جدید عمل می‌کنه. برای ارزیابی عملکردش، همون اول میایم کل داده آموزش رو به دو قسمت داده‌های train و validation تقسیم می‌کنیم. بعد از اینکه رو داده‌های train مدل learn شد و پارامتراش در اومد، حالا میایم میانگین مجذورات خطا رو روی داده‌های validation حساب می‌کنیم. این خطا همون خطای true هست. حالا اگه این عدد مقدارش کم باشه به این معنیه که مدلمون تعمیم‌پذیری خوبی داره.

ایرادات این روش:

بخشی از داده train رو از دست میدیم و اگر سایز validation به اندازه کافی زیاد نباشه عددی که بعنوان خطای true به‌دست میاد خیلی قابل اعتماد نیست. اگر هم سایز train رو خیلی کم کنیم داده‌های زیادی رو از دست دادیم و مدل به خوبی learn نمیشه.

حالا اگر از مجموعه validation برای تنظیم درجه چندجمله‌ای استفاده کنیم، دیگه نمی‌تونیم ازش برای اندازه‌گیری خطای true استفاده کنیم. اگر بخوایم خطای true هم داشته باشیم، باید بیایم از اول داده‌مون رو به سه قسمت train و validation و test تقسیم کنیم و بعد با استفاده از قسمت test که روش هیچ عملیاتی انجام نشده بیایم و مقدار خطای true رو محاسبه کنیم و ببینیم که تعمیم‌پذیری به چه صورت هست.

روش cross-validation

خیلی شبیه روش قبلیه اما با استفاده از میانگین‌گیری سعی می‌کنه جوابی که به دست میاد رو دقیق‌تر بکنه. حالا نحوه کارش اینطوره که انگار میاد هر دفعه داده‌های train رو بعد از اینکه شافل کرد، به چند تا بخش مساوی (مثلا k) تقسیم می‌کنه، بعد تو هر دور یکی از بخش‌ها رو بعنوان مجموعه validation و بقیه بخش‌هارو (1-k) بعنوان train در نظر میگیره. حالا میاد جواب‌های هر مرحله رو تهش ازش میانگین میگیره. این میانگین می‌تونه نشون دهنده همون خطای true باشه.

حالا چجوری با روش CV بیایم مدل انتخاب کنیم؟ اینطوره که میایم به ازای مدل‌های مختلفی که داریم مقدار خطای میانگینی که با روش CV به دست میاد رو حساب می‌کنیم. بعد مدلی که این مقدار توش از همه کمتر شده رو انتخاب می‌کنیم.

مثلا فرض کنید چهار تا مدل مختلف داریم و می‌خوایم ببینیم کدومش بهتره که انتخاب بشه. اومدیم دیتای train رو به 5 بخش تقسیم کردیم و بعد با روش CV میانگین حساب کردیم. اون مدلی انتخاب میشه که میزان خطا توش از همه کمتر باشه.

وقتی سایز دیتای train خیلی کوچیک باشه، به جای اینکه بیاد دیتارو به k بخش تقسیم کنه از هر نمونه استفاده می‌کنه و هر نمونه رو انگار یه بخش در نظر می‌گیره.

روش regularization

به این صورته که میایم به تابع هزینه‌مون یه ترم جدید با یه ضریب اضافه می‌کنیم تا به کمک اون جلوگیری کنیم از overfitting. الان کلا می‌خوایم چیکار کنیم؟ می‌خوایم هم مقدار جمله اول رو در کمترین حالت نگه داریم هم مقدار بردار وزن رو کم کنیم تا جایی که میشه تا اون جمله دوم هم مقدارش کم بمونه. یعنی اگه دو تا مدل باشن که مقدار تابع هزینه توشون یکسان بشه، مدلی رو انتخاب می‌کنه که وزن کمتری داره.

حالا ببینیم چجوری میاد محاسبات انجام میده و به اون مقدار برای W میرسه.

رابطه زیر هم نشون میده که چجوری مشتق WTW حساب میشه.

حالا این لاندا اثرش اینجا به چه صورته؟ برای اینکه جواب این سوال رو بدیم بریم یه مثال ببینیم. یه مثال داشتیم که 10 تا نمونه داشت و یه سینوسی ازش رد میشد و جواب مطلوب بود، همون مثال رو اینجا بررسی می‌کنیم. همونطور که از جدول پایین مشخصه، اگه بیایم قدرمطلق ضرایب رو در نظر بگیریم ضرایب w همینطور دارن رفته رفته بزرگ و بزرگ‌تر میشن. حالا چرا اینجوری بزرگ میشن؟ برمیگرده به معکوس ماتریس و دترمینان. برای محاسبه معکوس ماتریس مقدار 1 بر روی دترمینان رو باید حساب کنیم و حالا وقتی مقدار دترمینان نزدیک به صفر بشه باعث میشه که معکوس ماتریس عدد بزرگتری داشته باشه.

حالا این لاندا اینجا چجوری اثر می‌ذاره؟ با جمع کردن مقدار لاندا این تضمین به وجود میاد که قطر اصلی ماتریس قطعا مقدارش غیر صفره و در این صورت دترمینان هیچوقت صفر نمیشه و ماتریس معکوس پذیر میشه و همین باعث میشه که مقدار معکوس ماتریس خیلی مقدار بزرگی نشه مقدارش.

وقتی لاندارو بزرگ انتخاب می‌کنیم داریم به وزن انتخاب شده اهمیت بیشتری می‌دیم و اگر خیلی کوچیک انتخابش کنیم تابع هزینه به همون حالت اولیه‌ش برمی‌گرده.

جمع‌بندی مطالب گفته شده

  • بررسی انواع خطا (خطای structural، خطای approximation، خطای کلی)
  • مدل‌های غیرخطی و درجه بالاتر
  • مفهوم overfitting
  • چگونگی ارزیابی تعمیم‌پذیری و انتخاب مدل به کمک روش‌های simple hold-out، cross-validation و regularization

اگر جایی ایراد یا مشکلی بود، حتما بهم بگید تا تصحیحش کنم.

اسلایدهای این جلسه

ویدیو این جلسه

جزوه جلسه قبلی (جلسه سوم)

جزوه جلسه بعدی (جلسه پنجم)

overfittingیادگیری ماشینcross validationregularizationمدل غیرخطی
من هانیه‌ام. مدتیه شروع کردم به تولید محتوا در قالب متن و به زبان فارسی، از روی دوره‌هایی که می‌گذرونم. اگر دوست داشتین برام قهوه بخرید: https://coffeete.ir/honio
شاید از این پست‌ها خوشتان بیاید