در قسمت قبل از دوره یادگیری ماشین دانشگاه استنفورد به این سوال پاسخ دادیم که تابع هزینه چیست. این تابع را به لحاظ ریاضی بررسی کردیم. حال میخواهیم باهم با مفهوم تابع هزینه بیشتر آشنا شویم.
خلاصهای از آنچه در آموزش جلسه قبل گذشت
در جلسه قبل با تابع فرضیه یا Hypothesis Function آشنا شدیم و دیدیم که فرمول آن به شرح زیر است:
\( \Large h_{\theta}(x) = \theta_{1}x + \theta_{0} \)
در ادامه با دو پارامتری که تابع فرضیه تابعی از آنهاست آشنا شدیم:
\( \Large \theta_{1} , \theta_{0} \)
سپس دیدیم که تابع هزینه تابعی از \( \Large h_{\theta}(x) \) است و فرمول آن به صورت زیر است:
\( \Large J(\theta_{1} , \theta_{0})= \frac{1}{2m} \displaystyle \sum_{i = 1}^{m} (h_{\theta}(x^{(i)})-y^{(i)})^2 \)
و در نهایت هدف نهایی رگرسیون خطی که مینیمم کردن تابع \( \Large J(\theta_{1} , \theta_{0}) \) است را دیدیم:
\( \Large \begin{align}
& minimize \\
& \theta_{1} , \theta_{0}
\end{align} \) \( \LARGE J(\theta_{1} , \theta_{0}) \)
بررسی مفهوم تابع هزینه با سادهسازی تابع فرضیه
برای اینکه بهتر با مفهوم تابع هزینه آشنا شویم، میخواهم با یک مثال ساده این بحث را شروع کنیم. بیایید تابع فرضیه را بسیار ساده در نظر بگیریم. به این صورت که اصلا عرض از مبدأ نداشته باشیم. در چنین حالتی تابع فرضیه به صورت زیر خواهد بود:
\( \Large h_{\theta}(x) = \theta_{1}x \)
در این حالت ضریب \( \Large \theta_{0}=0 \) خواهد بود. حال اگر بخواهیم تابع هزینه را بازنویسی کنیم خواهیم داشت:
\( \Large J(\theta_{1})= \frac{1}{2m} \displaystyle \sum_{i = 1}^{m} (\theta_{1}(x^{(i)})-y^{(i)})^2 \)
پس هدف بهینهسازی ما نیز به حالت زیر درخواهد آمد:
\( \Large \begin{align}
& minimize \\
& \theta_{1}
\end{align} \) \( \LARGE J(\theta_{1} ) \)
اگر بخواهیم نمودار تابع فرضیه \( \Large h_{\theta}(x) = \theta_{1}x \) را به صورت کلی رسم کنیم، مطابق شکل زیر خواهد بود. در این شکل میبینید که خط تابع فرضیه همواره از مبدأ مختصات یعنی نقطه صفر و صفر عبور خواهد کرد.
شکل ۱: تابع فرضیه سادهٔ که متغیر \( \Large \theta_{0} \) آن برابر با صفر است.
حال بیایید حالتهای مختلف دو تابع فرضیه و تابع هزینه را باهم رسم کنیم. نکتهای که باید قبل از رسم این دو تابع به آن دقت کنیم این است که تابع فرضیه یعنی \( \Large h \)، تابعی بر حسب \( \Large x \) است. در تابع فرضیه \( \Large x \) ضریبی از \( \Large \theta_{1} \) است. به بیان دیگر تابع فرضیه تابعی برحسب بزرگی خانه \( \Large (x) \) است.
در مقابل تابع هزینه یعنی \( \Large J \) را داریم. \( \Large J \) تابعی از \( \Large \theta_{1} \) است. برای درک بهتر این دو تابع هر دو را رسم میکنیم.
درک بهتر از مفهوم تابع هزینه و تابع فرضیه
مجموعهٔ آموزشی زیر را در نظر بگیرید که تنها سه نقطه دارد. زوج مرتب این نقاط عبارتند از \( \Large (2,2) , (1,1) \) و \( \Large (3,3) \). متغیر \( \Large \theta_{1} \) را هم برابر با ۱ در نظر میگیریم. در چنین حالتی مطابق با شکل زیر دادههای آموزشی و تابع فرضیه دقیقاً باهم برابر خواهند شد.
شکل ۲: تابع فرضیه که در آن \( \Large \theta_{1} \) برابر با یک است.
حالا که \( \Large \theta_{1}=1 \) است، باید ببینیم که برای \( \Large J \) که تابعی از \( \Large \theta_{1} \) چه اتفاقی میافتد.
رسم تابع هزینه
حتماً تعریف تابع هزینه را به یاد دارید. مجذور تفاضل مجموعهٔ آموزشی و مقادیر پیشبینی شده با تابع فرضیه. پس بیایید مقدار تابع هزینه را باهم محاسبه کنیم. با توجه زوج مرتبهای مجموعهٔ آموزشی که \( \Large (2,2) , (1,1) \) و \( \Large (3,3) \) بودند و مقادیر خروجی تابع \( \Large h_{\theta}(x) \) میتوانیم بنویسیم:
\( \Large \begin{align} J(\theta_{1}) & = \frac{1}{2m} \displaystyle \sum_{i = 1}^{m} (h_{\theta}(x^{(i)})-y^{(i)})^2 \\ & = \frac{1}{2m} \displaystyle \sum_{i = 1}^{m} (\theta_{1} \times x^{(i)} -y^{(i)})^2 \\ & = \frac{1}{2m} (0^{2}+0^{2}+0^{2}) = 0 \\ \end{align} \)
با توجه به آنچه در شکل ۲ دیدیم، نقاط مجموعهٔ آموزشی و تابع فرضیه باهم تطابق کامل داشتند. یعنی \( \Large h_{\theta_{1}}(x^{(i)}) = y^{(i)} \). در نتیجه تفاصل آنها و در نهایت تابع هزینه برابر با صفر خواهد شد. پس به بیان ریاضی میتوان گفت:
\( \Large \theta_1 = 1 \rightarrow J(1) = 0 \)
رسم این تابع به صورت زیر خواهد بود:
شکل ۳: رسم یک نقطه از تابع هزینه
یک مثال دیگر برای مفهوم تابع هزینه
خب اینبار فرض کنیم که مقدار \( \Large \theta_{1} \) برابر با ۰.۵ باشد. با این مقدار تابع فرضیه برابر با \( \Large h_{\theta}(x) = 0.5x \) خواهد شد. اگر در این حالت تابع فرضیه را رسم کنیم به صورت زیر خواهد بود:
شکل ۴: تابع فرضیه به ازای مقدار ۰.۵ برای \( \Large \theta_{1} \)
بیایید برای این حالت مقدار تابع هزینه \( \Large J \) را محاسبه کنیم.
محاسبه مقدار تابع هزینه به ازای \( \Large \theta_{1}=0.5 \)
میخواهم پیش از محاسبه، آنچه که قرار است به صورت فرمولهای ریاضی باهم یاد بگیریم را رسم کنم. در حقیقت میخواهیم باهم اختلاف بین مقدار پیشبینی \( \Large h_{\theta}(x^{(i)}) \) و خروجی \( \Large y^{(i)} \) را روی نمودار ببینیم.
شکل ۵: اختلاف تابع فرضیه و تابع هزینه
در شکل بالا مشاهده میکنید که فلشهای قرمز رنگ اختلاف بین مقادیر خروجی از مجموعهٔ آموزشی \( \Large y^{(i)} \) (ضربدرهای نارنجی) و مقادیر پیشبینی بدست آمده از تابع فرضیه \( \Large h_{\theta}(x^{(i)}) \) است.
حال بیایید مقدار تابع فرضیه را به ازای این مقادیر محاسبه کنیم:
\( \Large \begin{align} J(\theta_{1}) & = \frac{1}{2m} \displaystyle \sum_{i = 1}^{m} (h_{\theta}(x^{(i)})-y^{(i)})^2 \\ & = \frac{1}{2m} \displaystyle \sum_{i = 1}^{m} (\theta_{1} \times x^{(i)} -y^{(i)})^2 \\ & = \frac{1}{2m} ((0.5-1)^{2}+(1-2)^{2}+(1.5-3)^{2}) \\ & = \frac{1}{2 \times 3} (3.5) = \frac{3.5}{6} = 0.58 \\ \end{align} \)
اکنون میدانیم که \( \Large J(0.5) \) برابر با ۰.۵۸ است. اگر این نقطه را هم مانند قبل روی نمودار به صورت یک زوج مرتب رسم کنیم نمودار آن به صورت زیر خواهد بود:
شکل ۶: دومین نقطه به ازای \( \Large \theta_{1}=0.5 \) در تابع هزینه
اینبار شما مقدار تابع هزینه را محاسبه کنید
اینبار شما مقدار تابع هزینه را به ازای \( \Large \theta_{1}=0 \) محاسبه کنید. با توجه به روشی که برای محاسبه تابع هزینه بیان شد، مقدار تابع هزینه را بدست آورید. \( \Large J(0) \) ؟
امیدوارم که پاسخ صحیح را انتخاب کرده باشید. بیایید محاسبات را به ازای \( \Large \theta_{1}=0 \) باهم انجام دهیم. ابتدا نمودار مربوط به اختلاف مقادیر خروجی از مجموعهٔ آموزشی \( \Large y^{(i)} \) (ضربدرهای نارنجی) و مقادیر پیشبینی بدست آمده از تابع فرضیه \( \Large h_{\theta}(x^{(i)}) \) را باهم ببینیم:
شکل ۷: اختلاف بین مقادیر تابع پیشبینی و مجموعهٔ آموزشی به ازای \( \Large \theta_{1}=0 \)
در ادامه محاسبات ریاضی مربوط به تابع هزینه را باهم انجام خواهیم داد:
\( \Large \begin{align} J(\theta_{1}) & = \frac{1}{2m} \displaystyle \sum_{i = 1}^{m} (h_{\theta}(x^{(i)})-y^{(i)})^2 \\ & = \frac{1}{2m} \displaystyle \sum_{i = 1}^{m} (\theta_{1} \times x^{(i)} -y^{(i)})^2 \\ & = \frac{1}{2m} ((1)^{2}+(2)^{2}+(3)^{2}) \\ & = \frac{1}{2 \times 3} (14) \approx 2.3 \\ \end{align} \)
اگر بخواهیم این زوج مرتب را روی نمودار تابع هزینه نمایش دهیم:
شکل ۸: نمودار تابع هزینه به ازای \( \Large \theta_{1}=0 \)
رسم تمامی نقاط تابع هزینه به صورت یکجا
تا به اینجا با محاسبات و نمودارهای تابع فرضیه به ازای مقادیر مختلفی برای متغیر \( \Large \theta_{1} \) آشنا شدید. دیدید که برای هر \( \Large \theta_{1} \) یک مقدار متفاوت برای تابع هزینه \( \Large J(\theta_{1}) \) بدست آمد. در نهایت اگر برای تعداد بسیار زیادی از مقادیر مختلف برای \( \Large \theta_{1} \) این مسئله را حل کنیم و مقادیر مختلف بدست آمده برای \( \Large J(\theta_{1}) \) را رسم کنیم نموداری به صورت زیر بدست خواهد آمد:
شکل ۹: نمودار تابع هزینه \( \Large J(\theta_{1}) \) به ازای مقادیر مختلف برای \( \Large \theta_{1} \)
این نمودار بوسیلهٔ نرمافزار متلب رسم شده است. تمامی فرمولهای ریاضی بالا به صورت کدنویسی شده داخل متلب برده شد و با دو حلقه for تو در تو مقدار سیگما نیز محاسبه گردید. برای آن دسته از علاقمندان به برنامهنویسی در متلب، کد مربوط به نمودار شکل ۹ در پایین قرار داده شده است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | clc clear close all %% Define variables theta = -5:0.5:5; x = [1 2 3]; y = [1 2 3]; m = numel(x); b = ; J = zeros(1,numel(theta)); %% Calculate SIGMA for j = 1:numel(theta) for i = 1:m a = (theta(j)*x(i)-y(i))^2; b = a + b; end J(j) = (1/(2*m))*(b); b = ; end %% Plot the result scatter(theta,J) ylh = ylabel('J(\theta_1)','Rotation',,'fontsize',12); ylh.Position(2) = ylh.Position(2) - abs(ylh.Position(2) * 0.05); ylh.Position(1) = ylh.Position(1) - abs(ylh.Position(1) * 0.1); xlabel('\theta_1','fontsize',12) grid on |
توضیحات کد رسم تابع هزینه
کد بالا به سه بخش کلی تقسیم شده است:
- در بخش اول متغیرهای مختلف تعریف شدهاند. این متغیرها عبارتند از:
- \( \Large \theta_{1} \) از ۵- تا ۵+ با فواصل ۰.۵
- مجموعهٔ آموزشی مطابق با مثال این جلسه از آموزش
- \( \Large m \) تعداد زوج مرتبهای مجموعهٔ آموزشی
- در بخش دوم تابع هزینه \( \Large J(\theta_{1}) \) بوسیلهٔ دو حلقهٔ for تو در تو محاسبه گردید.
- در مرحله آخر رسم تابع هزینه \( \Large J(\theta_{1}) \) بر روی گراف انجام شد.
بهترین مقدار برای تابع هزینه کدام مقدار است؟
تمام صحبتهایی که کردیم برای این بود که به این نقطه برسیم. هدف بهینهسازی برای الگوریتم یادگیری چه بود؟ اینکه ببینم در چه مقداری از \( \Large \theta_{1} \) تابع هزینه \( \Large J(\theta_{1}) \) مینیمم خواهد شد.
اگر به منحنی که در شکل ۹ داشتیم دقت کنید، میبینید که مینیمم مقدار برای تابع هزینه \( \Large J(\theta_{1}) \) در \( \Large \theta_{1}=1 \) اتفاق میافتد. که در واقع بهترین خط برای تطابق تابع فرضیه \( \Large h_{\theta_{1}}(x) \) با دادههای مجموعه آموزشی بود (به شکل ۲ نگاه کنید).
فیلم جلسه ششم از دوره یادگیری ماشین دانشگاه استنفورد
جمعبندی جلسه مفهوم تابع هزینه و موضوع جلسه آینده
در این جلسه چند نقطه مختلف از مجموعهٔ آموزشی را رسم کردیم. در ادامه خطوط مختلف از تابع فرضیه را نسبت به آنها رسم کردیم تا مفهوم تابع هزینه را بهتر درک کنیم.
مقادیر تابع هزینه را به ازای مقادیر مختلف از پارامتر \( \Large \theta_{1} \) محاسبه کردیم و تمامی فرمولها را نیز با هم یادگرفتیم. در نهایت همین کار را در نرمافزار متلب انجام دادیم.
در جلسه آینده از دوره یادگیری ماشین دانشگاه استنفورد به فرمول اصلی مسأله باز خواهیم گشت و تابع فرضیه را با وجود دو پارامتر \( \Large \theta_{1} \) و \( \Large \theta_{0} \) به صورت همزمان بررسی خواهیم کرد.
در صورتیکه که هر سوالی از این مبحث داشتید، آن را در بخش دیدگاهها برای ما بنویسید. ما در توتیک به شما پاسخ خواهیم داد.
به نام خدا
با سلام
ضمن عرض تبریک سال نو خدمت شما . می خواستم بگویم که از مصالعه این بخش و بخش قبلی لذت بردم و مفهوم تابع هزینه را متوجه شدم . سپاسگزارم .
ضمن عرض سلام و احترام
مایه خوشحالی ماست که این آموزشها براتون مفید بوده و تونستید استفاده کنید.
موفق و پیروز باشید