سعی کردم هرچیزی که از جلسات دوره فهمیدم رو به صورت جزوه در بیارم و در این پلتفورم با بقیه به اشتراک بذارم. کل جلسات دوره 23 تاست که سعی میکنم هفتهای دو جلسه رو منتشر کنم. تا جایی که تونستم سعی کردم خوب و کامل بنویسم، اما اگر جایی ایرادی داشت، حتما تو کامنتها بهم بگید تا درستش کنم.
به صورت کلی در مورد دستهبندهای احتمالاتی صحبت کردیم. برای تصمیمگیری قانون بیز رو معرفی کردیم. به این صورت بود که اگر مسئله دو کلاسه داشته باشیم و شرط p(C1 | x) > P(C2 | x) برقرار باشه، میگیم داده x متعلق به کلاس C1 هست و اگر این شرط برقرار نباشه داده x متعلق به کلاس C2 هست. یعنی تو هر نقطهای که بهمون داده میشه احتمال posterior دو کلاس رو باید محاسبه کنیم، بعد مقدارهارو مقایسه کنیم ببینیم کدوم بیشتره و داده رو به اون کلاس نسبت بدیم. پس قانون تصمیمگیری در کل قانون سادهای بود. حالا برای محاسبه p(C1 | x) و p(C2 | x) میومدیم از قانون بیز استفاده میکردیم:
p(C1 | x) = (p(C1) p(x | C1)) / p(x)
یعنی چی رو مقایسه میکنیم؟ احتمال prior کلاس و حاصل جایگذاری x در توزیع کلاس رو داریم تو کلاس C1 و C2 مقایسه میکنیم.
احتمال prior رو معمولا بلدیم چجوری تخمین بزنیم و سادهست. توزیع کلاسهارو هم به کمک likelihood میتونیم پارامترهاشو تخمین بزنیم. کلا به آسونی میتونستیم تصمیمگیری کنیم.
پس چی چالشی بود؟ اون قسمتی که میخواستیم توزیع کلاسهارو تخمین بزنیم تا بقیه محاسبات رو انجام بدیم.
در ادامه بحث پارامترهایی که تخمین میزنیم به ازای هر توزیع مطرح شد. که دیدیم بعضی وقتا خیلی تعداد پارامترها زیاد میشه و این خوب نیست مخصوصا وقتی که تعداد نمونهها کم باشه. برای حل این مشکلِ تعداد پارامترهای زیاد، اومدیم از Naive Bayes استفاده کردیم. کمک میکرد که تعداد پارامترها به اندازه قابل توجهی کمتر بشه و یا اگر تعداد نمونهها کمه، بتونیم تخمین مناسبتری انجام بدیم.
در آخر یه مثال گسسته دیدیم که اون رو هم یک بار دیگه مرور میکنیم. چه پارامترهایی رو لازم داشتیم تو این مثال تخمین بزنیم برای اینکه از قاتون بیز استفاده کنیم؟ (حالتی رو در نظر بگیرید که فرض Naive Bayes رو نداریم)
تمامی این پارامترها رو باید برای کلاس دوم که H = N هست هم به دست بیاریم.
با زیاد کردن تعداد ویژگیها پارامترهایی که نیاز تخمین دارند به شدت رشد میکنند. اگر به جای 2 تا ویژگی d تا ویژگی در نظر میگرفتیم، تعداد پارامترهایی که نیاز داشتیم به ازای هر کلاس تخمین بزنیم میشد (منظور از ^ توان است):
2^d - 1
حالا اگه فرض Naive Bayes رو داشته باشیم، تعداد پارامترهایی که باید تخمین بزنیم چجوری میشه؟
همین دو پارامتر برای کلاس H = Y کافیه. چرا؟ چون 1منهای این مقادیر برعکسشو بهمون میده (یعنی مثلا دیابت نداشته باشه و تو کلاس افرادی باشه که بیماری قلبی دارن)
حالا پارامتر p(D = Y, S = Y | H = Y) رو چجوری میتونیم حساب کنیم؟ از ضرب همون دو پارامتر بالا به دست میاد:
p(D = Y, S = Y | H = Y) = p(D = Y | H = Y) × p(S = Y | H = Y)
همین تعداد پارامتر رو برای کلاس دوم (H = N) هم باید حساب کنیم.
پس به این ترتیب اگه تو این حالت d تا ویژگی داشته باشیم، تعداد پارامترهای قابل تخمین چندتا میشه به ازای هر کلاس؟ d تا.
حالا اگه تعداد ابعاد خیلی زیاد باشه، ممکنه این روش Naive Bayes خوب نباشه و مشکل پیش بیاد. با یه مثال این مورد رو بررسی میکنیم.
فرض کنید میخوایم اسناد رو به دو دسته اسپم و غیر اسپم دستهبندی کنیم. هر سند رو به صورت یه وکتور M بعدی نشون میدیم. M تعداد واژههای دیکشنری باشه، اگر سند اون واژه رو داره 1 بذاریم، اگر نداره 0 بذاریم.
تعداد واژهها در دیکشنری تو این مثال خیلی زیاده. انگار که ابعاد فضای ویژگیمون خیلی زیاده. حالا ممکنه تعداد نمونههامون خیلی کم باشه. مثلا 100 هزارتا واژه داریم و فقط 200 تا نمونه. اگه بخوایم از روش Naive Bayes استفاده کنیم، مثلا داخل کلاس اسپم، بیایم ببینیم احتمال اینکه تک تک لغات تو اسناد اون کلاس باشن چقدره. مثلا لغت اول دیکشنری رو در نظر بگیرید. میایم احتمال اینکه اون لغت چقدر تو اسناد کلاس اسپم باشه رو در میاریم و همینطور الی آخر برای همه لغات.
از اونجایی که train data خیلی محدوده، ممکنه تعداد زیادی احتمال 0 به وجود بیاد. حالا این مشکل رو چجوری باید حل کنیم؟ میتونیم از MAP استفاده کنیم به جای maximum likelihood تا این مشکل حل بشه.
خب تا اینجا یک دیدگاه رو برای مسائل دستهبندی احتمالاتی دیدیم که بهش روش Generative گفته میشه.
دیدگاه دیگهای وجود داره به اسم Discriminative که در ادامه قصد داریم اون رو بررسی کنیم. میگه بهجای اینکه بیای مقدار posterior رو به روش غیر مستقیم حساب کنی، به صورت مستقیم به دستش بیار. به صورت یه توزیع تخمینش بزن و پارامترهاشو در بیار.
قبل از اینکه این دیدگاه رو شروع کنیم یه بار دیگه دیدگاه Generative رو ببینم که میشه همه نکتههایی که تا الان گفتیم:
حالا فرض کنید مسئله دو کلاسه داریم و احتمال prior برای هر دو کلاس یکسان است. با وجود اینکه تو نمودار سمت چپ سعی کردیم یکم پیچیدگی اضافه کنیم ولی تو نمودار سمت راست که نشون دهنده posterior هست، اون پیچیدگیها دیده نمیشه. شکلش خیلی شبیه تابع سیگموید هست.
از تابع سیگموید برای مدل کردن نمودار posterior استفاده میکنیم. انتخاب خوبیه چون همیشه مقدارش بین 0 تا 1 متغیره.
تو نمودار پایین انگار تابع سیگموید رو در حالت دو متغیره رسم کردیم.
تا اینجا گفتیم برای posterior تو کلاس k ام رابطهای از جنس سیگموید میتونه انتخاب خوبی باشه که تو پایین هم آورده شده هم تو حالت دو کلاسه هم تو حالت چند کلاسه:
رابطه soft-max که بالا آورده شده، کاری که داره میکنه انگار اینطوره که برای کلاسی که مقدار WTX بزرگتر باشه، احتمال بیشتری در نظر میگیره.
خب تا اینجا گفتیم تابع پارامتریکی که در نظر گرفتیم برای دستهبندی به صورت سیگمویده، که یه جورایی داره احتمال تعلق دادهها به کلاسهارو بهمون نشون میده.
میخوایم برای مسئله دو کلاسه احتمال تعلق داده به کلاس اول رو پیدا کنیم. چون دو تا دسته داریم، وقتی احتمال دسته اول رو f(x; w) بگیریم، احتمال دسته دوم 1 منهای اون مقدار میشه. ما الان برای posterior اومدیم یه توزیع پارامتری در نظر گرفتیم. فقط مونده تخمین زدن پارامترهای این توزیع. پارامترهامون میشه مبدا سیگموید و ضریبی که داره برای باز یا بستهتر شدن تابع.
چجوری تخمین بزنیم؟ پارامترهاشو به کمک maximum likelihood میتونیم بهدست بیاریم، چون نگاه احتمالاتی داریم.
قبلا دیده بودیم برای دستهبندی، اینجوری در نظر گرفته بودیم که اگر مقدار WTX مثبت بشه مثلا میشه دسته اول و اگر منفی بشه میشه دسته دوم. اینجا چون اومدیم از تابع سیگموید استفاده کردیم این مقدار شده 0.5. چجوری به دست اومده؟ تو اسلاید پایین توضیح داده شده. اگر بیایم تابع سیگموید رو به ازای مقدار 0 حساب بکنیم مقدار 0.5 رو بهمون میده. (جایی که احتمال کلاس 1 و 2 باهم یکی میشه)
حالا بریم سراغ تخمین زدن پارامترها به کمک دیدگاه maximum likelihood. توزیعی که داریم برنولیه. اگه تابع سیگموید رو با f نشون بدیم به فرمت زیر میتونیم بنویسمش:
حالا ما میخوایم تابع بالا رو بیشینه کنیم. اگر در یک منفی ضربش کنیم، مثل این میمونه که انگار به تابع هزینه رسیدیم و تابع هزینه رو میخوایم کمینه کنیم.
تا اینجا روی توزیع شرطی کلاسها به شرط دادهها ML گرفتیم، بعد در یک منفی ضرب کردیم و به تابع هزینه رسیدیم که دنبال کمینه کردن اون هستیم. حالا چجوری مینمم رو پیدا کنیم؟ میتونیم مشتق بگیریم نسبت به W و برابر با 0 قرار بدیم. منتها تو این حالت جواب بستهای نداریم پس میتونیم از روش گرادیان کاهشی برای حلش استفاده کنیم. یه مشکلی تو گرادیان کاهشی بود، اونم این بود که ممکن بود کمینه محلی داشته باشیم. اینجا همچین مشکلی وجود نداره. فقط یک کمینه گلوبال داریم که جوابمونه.
اگر از روش SEE (مجذورات خطا) برای بهدستآوردن جواب استفاده میکردیم، به جای اینکه با تابع سیگموید کار کنیم با خود مقدار WTX کار میکنیم که باعث میشه مشکلاتی که در جلسات گذشته راجع بهش بحث کردیم به وجود بیاد. (مثلا اینکه مقدار پنالتی خیلی زیاد بشه) ولی خب با تابع سیگموید این مشکل حل میشه.
حالا بریم تابع هزینه رو بیشتر بررسی کنیم. اگر تابع هزینه رو فقط در یک نقطه بررسی کنیم، بهمون تابع loss رو میده. فرض کنیم فقط دو دسته داریم، اگر y مقدارش 1 بشه جمله اول فعال میشه و اگر مقدارش 0 بشه جمله دوم فعال میشه.
حالا حالتی رو در نظر بگیریم که داده باید به کلاس 1 انتساب داده بشه ببینیم تابع loss چی رو دقیقا نشون میده. مقدار سیگموید همواره بین 0 تا 1 هست. اگر ازش لگاریتم بگیریم، نمودارش شبیه شکل زیر میشه:
حالا اگر مقدار WT رو در X ضرب کنیم، باعث میشه به نمودار زیر برسیم:
از اونجایی که یه منفی قبلش وجود داره، پس باید نسبت به محور افقی قرینه بشه که معادل میشه با نمودار زیر:
حالا این نمودار آخر که همون نمودار loss هست تو حالتی که داده باید به دسته y=1 انتساب داده میشده داره چیو بهمون نشون میده؟ داره میگه اگه نمونه به کلاس 1 متعلق باشه، حتی اگه نمونهای باشه که تو دسته مثبتها باشه بازم براش یه جریمهای در نظر میگیریم. اگر نمونه به اندازه قابل توجهی سمت مثبتها باشه خیلی سریع این پنالتی کم میشه و مقدارش به صفر نزدیک میشه، ولی اگر خیلی نزدیک به مرز باشه مقدار پنالتی براش زیاده همچنان. انگار میخواد خط رو از جایی رد کنه که نقاط نزدیک بهش نباشن. یعنی مرزی که در نظر میگیره با نمونهها تا حد خوبی بینشون فاصله باشه. (یعنی دیگه نمیاد فقط تو دسته درست بودن رو بررسی کنه، دوری نزدیکی از مرز هم براش مهمه)
حالا بریم حالت چند کلاسه رو بررسی کنیم. میخوایم مقدار posterior رو تو کلاسهای مختلف بررسی کنیم، مقدار posterior تو هر کلاس بیشتر شد، داده رو به همون کلاس نسبت بدیم.
تابع زیر رو بعنوان posterior در نظر گرفتیم، حالا میخوایم پارامترهاشو تخمین بزنیم به کمک maximum likelihood.
تابعی که در نظر گرفتیم همون soft-max هست:
حالا بریم سراغ maximum likelihood و پارامترهارو تخمین بزنیم. ماکسیمم کردن ML معادله با مینیمم کردن تابع هزینه. توزیعی که پایین آورده شده همون توزیع چند جملهای هست. y رو به صورت یک بردار در نظر گرفتیم و با شیوه one-hot نمایش دادیم.
حالا میخوایم تابع هزینه رو حداقل کنیم. اگه از گرادیان کاهشی استفاده کنیم به رابطه زیر میرسیم. بردار پارامتر مربوط به همه کلاسها داره همزمان باهم آپدیت میشه.
رگرسیون لاجیستیک یک دستهبند خطی هست. چون تابع سیگموید حول یک خط بود و روی خط مقدار 0.5 داشت.
تو دیدگاه discriminative اومدیم برای posterior یک توزیع بهصورت مستقیم مدل کردیم. تو دیدگاه generative توزیع دادهها تو هر دسته رو هم تخمین میزدیم ولی تو دیدگاه discriminative اینطور نیست. برای تخمین هم تعداد پارامترهامون کمتر شده تو دیدگاه discriminative.
اگر جایی ایراد یا مشکلی بود، حتما بهم بگید تا تصحیحش کنم.