تنسورفلو:چطور loss function خودمون رو بسازیم؟

تابع هزینه چیه؟

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


معروف‌ترین تابع هزینه که واسه خیلی مسائل هم کاربرد داره میانگین مجذور خطاها یا همون Mean Squared Error هست که اینطوری تعریف می‌شه:

mean squared error
mean squared error

اگر نیاز دارید که یه یادآوری درباره تابع هزینه و وظیفه‌ش بخونید، پایین صفحه یه چیزی براتون گذاشتم :)

تعریف و استفاده از تابع هزینه

احتمالن می‌دونید که توی تنسورفلو اینجوری مشخص می‌کنیم که تابع هزینه مدلمون چی باشه:

model.compile(optimizer=&quotsomething&quot, loss=&quotsomething&quot)

حالا بیایم یه تابع هزینه بسازیم و بدیمش به مدلمون:

from numpy import mean
def mean_squared_error(y_true, y_pred):
    squared_error = [(i - j) ** 2 for i, j in  zip(y_true, y_pred)]
    return mean(squared_error)

خب حالا می‌تونیم از این استفاده کنیم. کافیه موقع کامپایل کردن مدلمون اونو به عنوان loss تنظیم کنیم:

model.compile(optimizer=&quotsomething&quot, loss=mean_squared_error)


ساده‌تر از اونی بود که فکرشو می‌کردیم. مگه نه؟ به همین سادگی می‌تونیم بسته به نیازمون هر تابع هزینه‌ای که صلاح دونستیم رو تعریف کنیم و استفاده کنیم.

توی قسمت بعدی از این مجموعه ۲ قسمتی یه ذره عمیق‌تر می شیم و یاد می‌گیریم چطور تابع‌های پارامتریک بنویسیم. همینطور از با استفاده از مزایای برنامه‌نویسی شیء گرا، می‌ریم که از کلاس‌های پایه‌ی تنسورفلو برای نوشتن تابع هزینه‌مون استفاده کنیم.


الان هم وقتشه تا آماده شدن مطلب بعدی دست به کار شید و این نمونه رو امتحان کنید. اگر هم سوال یا ابهامی داشتید بپرسید توی کامنتها. من و یا هرکسی که بلد باشه جواب می ده :)


اگر براتون مفید بود مطلب، با حمایت کردن ازش من رو دلگرم کنید برای تهیه کردن محتوا‌های بعدی. برای این کار می‌تونید از لایک کردن و کامنت کردن نظر و پیشنهاداتون شروع کنید. یا اینکه این مطلب رو با کسایی که فکر می‌کنید بهش احتیاج دارن به اشتراک بذارید. به امید دیدار :)


مرور مختصر تابع هزینه

اگر تازه وارد دنیای یادگیری ماشین شدید، اصلن ازش نترسید. کافیه قدم به قدم بریم جلو. J تابع هزینه ماست. m تعداد نمونه داده‌های ماست. h(x) می‌گه مدل ما برای ورودی x چه خروجی‌ای تولید می‌کنه. y هم می‌گه که اون ورودی در داده‌ی ما چه مقدار واقعی‌ای رو خروجی می‌ده. زیگما هم که می‌گه برای تمام نمونه‌های موجود این اختلاف بین مقدار محاسبه شده و مقدار واقعی رو باید حساب کنیم (اختلاف رو حساب می‌کنیم، و بعد به توان ۲ می‌رسونیم) و در نهایت تقسیم بر m می‌کنیم تا میانگینشو به دست بیاریم.

پیشنهاد جستجو: اون ضریب ۲ که پشت m نشسته هم یه فوت کوزه‌گریه که می‌تونه بهونه جستجوی خوبی براتون باشه :)

اگر این توضیحات درباره تابع هزینه کافی نبود براتون، پیشنهاد می‌کنم یه نگاهی به این ویکی بندازید: Loss function

تابع هزینه بنویسیم

این دو مجموعه رو در نظر بگیریم:

y_true = [2, 4, 6, 8, 10]

y_pred = [1.9, 4.1, 6, 8.2, 10.1]


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

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

پیشنهاد: یه بار روی کاغذ این رو حساب کنید ببینید به چه عددی می‌رسید. می‌تونه به واضح شدنش کمک کنه. از همون رابطه که بالاتر دیدیم استفاده کنید. مثال: برای اولین نمونه، مقدار واقعی ۲ بوده و مدل ما ۱.۹ پیش‌بینی کرده. پس این دو تا رو از هم کم کنیم، می‌شه ۰.۱ واحد اختلاف. این رو به توان ۲ برسونیم، می‌شه ۰۰.۱ واحد.

پیشنهاد جستجو: چرا اصلا به توان ۲ می‌رسونیم؟ چه سودی داره؟


پس قرار ما شد که توی مطلب بعدی، یه ذره حرفه‌ای تر عمل کنیم و تابع هزینه کامل‌تری بنویسیم.

[وقتی که اون مطلب آماده بشه، لینکش رو اینجا می‌ذارم. الان که هنوز آماده نشده، می‌تونید من رو اینجا دنبال کنید ک هروقت آماده شد خبردار بشید.]