الگوریتم گرادیان نزولی Gradient Descent Algorithm – قسمت هشتم دوره یادگیری ماشین دانشگاه استنفورد

الگوریتم گرادیان نزولی Gradient Descent Algorithm – قسمت هشتم دوره یادگیری ماشین دانشگاه استنفورد

الگوریتم گرادیان نزولی یا Gradient Descent Algorithm از جمله معادله‌هایی است که قصد داریم در سری آموزش‌های دوره یادگیری ماشین دانشگاه استنفورد باهم بیاموزیم.

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

الگوریتم گرادیان نزولی چیست؟

گرادیان نزولی الگوریتمی برای یافتن نقطه مینیمم یک تابع است. گرادیان نزولی یک الگوریتم کلی‌ است و تنها در رگرسیون خطی کاربرد ندارد، بلکه در تمام مباحث یادگیری ماشین می‌توان از آن استفاده کرد. در ادامه از گرادیان نزولی برای به حداقل رساندن توابعی بجز تابع هزینه \( \Large J \) در رگرسیون خطی استفاده خواهیم کرد.

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

برای حل هر مسئله ریاضی، ابتدا باید حکم و فرض مسئله را مشخص کرد. صورت مسئله ما بدین شکل است:

فرض مسئله: \( \Large J(\theta_{1},\theta_{0}) \)

نکته: تابع \( \Large J \)  می‌تواند تابع هزینه رگرسیون خطی یا هر تابع دیگری که می خواهیم به حداقل برسانیم، باشد.

حکم مسئله: الگوریتمی برای به حداقل رساندن تابع  \( \Large J(\theta_{1},\theta_{0}) \)

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

مثلا مسئله ما می‌تواند به شکل زیر باشد:

فرض مسئله:

\( \Large J (\theta_{0}, \theta_{1}, \theta_{2}… \theta_{n}) \)

حکم مسئله:

\( \LARGE J(\theta_{0}, \theta_{1}, \theta_{2}… \theta_{n}) \)  \( \Large \begin{align}
& minimize   \\
& \theta_{1} , \theta_{0}
\end{align} \)

بنابراین تصور کنید، تابع \( \Large J \) را به صورت تابعی برای \( \Large (\theta_{0}, \theta_{1}, \theta_{2}… \theta_{n}) \) دارید و می‌خواهید آن را برای \( \Large \theta_{0} \) به حداقل برسانید. یعنی قصد دارید در تابع \( \Large J \) برای \( \Large \theta_{0}… \theta_{n} \) مقادیر \( \Large \theta_{0}… \theta_{n} \)  را مینیمم کنید. در واقع الگوریتم گرادیان نزولی برای حل اینگونه مسائل کلی‌تر  استفاده می‌شوند، اما به خاطر اختصار و استفاده کمتر از نمادها در این جلسه، فرض می‌کنیم  فقط دو پارامتر داریم.

شروع کار با الگوریتم گرادیان نزولی

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

\( \Large  \theta_{0} = 0 \)  و  \( \Large  \theta_{1} = 1\)

کاری که قصد داریم انجام دهیم این است که \( \Large \theta_{0} \) و\( \Large \theta_{1} \) را به میزان جزیی تغییر می‌دهیم تا تابع هزینه \( \Large J \) کاهش یابد؛ آنقدر این کار را انجام می‌دهیم تا به نقطه مینیمم و یا مینیمم محلی برسیم.

یافتن نقطه مینیمم تابع با کمک نمودار

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

درک مفهوم الگوریتم نزولی با کمک نمودارشکل۱: درک مفهوم الگوریتم نزولی با کمک نمودار

به محورها دقت کنید:

محور افقی: \( \Large \theta_{0} \) و \( \Large \theta_{1} \)

حتما بخوانید:  یادگیری ماشین چیست - قسمت اول از دوره یادگیری ماشین دانشگاه استفورد

محور عمودی: تابع هزینه \( \Large J \)

ارتفاع از سطح همان تابع هزینه \( \Large J \) را نشان می دهد و می‌خواهیم آن را بهینه کنیم. برای این کار باید با  \( \Large \theta_{0} \) و \( \Large \theta_{1} \) در نقطه‌ای خاص شروع کنیم. مقادیری فرضی برای \( \Large \theta_{0} \) و \( \Large \theta_{1} \)  مشخص می‌کنیم. من در تصویر زیر نقطه مد نظرم را با ستاره علامت گذاری کرده‌ام.

یافتن قدم به قدم نقطه مینیمم با گرادیان نزولی

شکل۲: یافتن قدم به قدم نقطه مینیمم

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

اگر بالای تپه بایستید و به اطراف نگاه کنید، می‌بینید که بهترین مسیر برای پایین رفتن این مسیر است:

شکل۳: قدم اول در یافتن نقطه مینیمم

دوباره به اطراف نگاه می کنید و می‌گویید در قدم بعدی در چه جهتی  به سمت پایین بروم؟ اگر قدمی دیگر بردارید در این مسیر خواهید بود:

قدم دوم در یافتن نقطه مینیمم با گرادیان نزولیشکل۴: قدم دوم در یافتن نقطه مینیمم 

همین روند پایین آمدن و یافتن جهت درست را انجام می‌دهید تا در نهایت به مینیمم موضعی برسید. مشابه شکل زیر:

یافتن نقطه مینیمم موضعی با گرادیان نزولینقطه مینیمم با گرادیان نزولیشکل۵:یافتن نقطه مینیمم موضعی اول

معرفی یکی از ویژگی‌های جالب الگوریتم گرادیان نزولی

گرادیان نزولی ویژگی جالبی دارد که باید آن را بررسی کرد. اکنون تصور کنید مطابق شکل گرادیان نزولی را کمی مایل به راست و بالاتر شروع کرده بودیم.

یافتن نقطه مینیمم تابع در نقطه دوم با کمک گرادیان نزولیشکل۶: یافتن نقطه مینیمم تابع در نقطه دوم

همان فرایند بالا را تکرار می‌کنیم. به اطراف نگاه کنید، قدمی کوچک بردارید تا سریع‌تر به پایین برسید.

قدم اول در یافتن نقطه مینیمم از نقطه دومشکل۷: قدم اول در یافتن نقطه مینیمم از نقطه دوم

دوباره جهت حرکت را انتخاب کنید و قدم دوم را بردارید.

قدم دوم در یافتن نقطه مینیمم از نقطه دوم با کمک گرادیان نزولیشکل۸:قدم دوم در یافتن نقطه مینیمم

در نهایت به این نقطه مینیمم محلی می‌رسید:

یافتن نقطه مینیمم موضعی دوم با الگوریتم گرادیان نزولیشکل۹: یافتن نقطه مینیمم موضعی دوم 

همانطور که دیدید اگر فقط کمی از سمت راست شروع می‌کردیم، گرادیان نزولی ما را به دومین مینیمم موضعی در سمت راست می‌برد. اگر از نقطه اول شروع می‌کردید به این نقطه بهینه موضعی می‌رسیدید:

نقطه مینیمم موضعی اول
شکل۱۰: نقطه مینیمم موضعی اول

اما اگر کمی راست‌تر شروع می‌کردید به نقطه بهینه‌ی موضعی کاملا متفاوتی می‌رسیدید:

شکل۱۱: نقطه مینیمم موضعی دوم

این یکی از ویژگی‌های جالب گرادیان نزولی است که در ادامه بیشتر در مورد آن صحبت خواهیم کرد.

محاسبات ریاضی الگوریتم گرادیان نزولی

حال که مفهوم اصلی این الگوریتم را درک کردید زمان آن رسیده که به محاسبات ریاضی آن بپردازیم.

این تعریف الگوریتم گرادیان نزولی است که قرار است به طور مرتب آن را به کار ببریم تا به نقطه مینیمم برسیم:

حتما بخوانید:  گرادیان نزولی برای رگرسیون خطی Gradient Descent For Linear Regression قسمت دهم دوره یادگیری ماشین دانشگاه استنفورد

  \( \Large (For J= 0  ,  J =1) \)  \( \Large \theta_{j}:= \theta_{j}- \alpha \frac {\partial 1}{\partial \theta_{j}} J(\theta_{1},\theta_{0})  \)

جزئیات مهم در مورد الگوریتم گرادیان نزولی

الگوریتم گرادیان نزولی جزئیات زیادی دارد که به چند مورد از آن اشاره می کنیم.

نکته اول

در ابتدا قصد دارم در مورد علامت \( \Large :=   \) صحبت کنیم. از این علامت برای نسبت دادن استفاده می‌کنیم. پس یک عملگر منسوب کننده است. برای مثال در جمله زیر کامپیوتر مقدار \( \Large b \) را می‌گیرد و با مقدار قبلی \( \Large a \) جایگزین می‌کند.

\( \Large a:=b  \)

یعنی مقدار \( \Large a \) را برابر مقدار \( \Large b \) قرار می‌دهیم. به این عمل منسوب کردن گویند. همچنین می‌توانیم عبارت را به این شکل بنویسیم:

\( \Large a:=a+1  \)

منظور این جمله این است که مقدار \( \Large a \) را به علاوه ۱ کن و با مقدار قبلی \( \Large a \) جایگزین کن. در سمت مقابل می‌توانیم عبارت را به این شکل نوشت:

\( \Large a=b  \)

این یک عبارت خبری است و به این معنی است که مقدار \( \Large a \) با \( \Large b \) برابر است. پس در مثال اول که از \( \Large :=  \) استفاده کردیم، منظور یک عملکرد کامپیوتری است. این عملکرد مقدار \( \Large a \) را به یک مقدار جدید تغییر می‌دهد. اما در مثال دوم که از \( \Large =  \) استفاده کردیم، منظورمان این است که مقادیر \( \Large a \) و \( \Large b \) برابر است. اگر خواستیم مقدار \( \Large a \) را بگیریم و یک واحد به آن اضافه کنیم و با مقدار اولیه جایگزین کنیم باید عبارت زیر را استفاده کنیم:

\( \Large a:=a+1  \)

نکته دوم

آلفا در این معادله، عددی است که به آن ( نرخ یادگیری) می‌گوییم. آلفا مشخص می‌کند قدم‌های ما چقدر بزرگ باشد. پس اگر آلفا خیلی بزرگ باشد، گرادیان نزولی گرادیان نزولی خیلی بزرگ خواهد بود. بعدا در مورد اینکه چگونه باید آلفا را تعیین کرد بیشتر توضیح می‌دهیم.

نکته سوم

و در ادامه، این بخش از عبارت که مشتق ما است را بررسی می کنیم:

\( \Large (For J=0 and J=1)\) \( \Large  \frac{\partial 1}{\partial \theta_{j}} J(\theta_{1},\theta_{0})  \)

الان قصد صحبت در این باره را ندارم ولی بعدا مشتق عبارت را می‌گیریم. شاید بعضی از شما با حسابان آشنایی داشته باشید. اما اگر آشنایی ندارید نگران نباشید.

نکته چهارم

یک نکته ظریف دیگر نیز در مورد گرادیان نزولی وجود دارد. در الگوریتم گرادیان نزولی باید مقادیر \( \Large \theta_{0} \) و \( \Large \theta_{1} \) را به صورت پیوسته تغییر دهیم. پس این تغییر برای \( \Large  J=0\) و \( \Large  J=1 \)  صورت می‌گیرد. نکته مهم این است که هر دفعه سمت راست این معادله را برای دو مقدار \( \Large \theta_{0} \) و \( \Large \theta_{1} \) محاسبه می کنیم و در ادامه به صورت همزمان مقادیر \( \Large \theta_{0} \) و \( \Large \theta_{1} \) را آپدیت کرد.

روش درست استفاده از الگوریتم گرادیان نزولی

نکته ای که باید در استفاده از الگوریتم گرادیان نزولی رعایت کرد، این است که باید مقادیر را به صورت همزمان تغییر دهیم. در ادامه روش استفاده صحیح از این الگوریتم و یک روش استفاده نادرست از آن را بررسی می کنیم.

حتما بخوانید:  مفهوم تابع هزینه با دو پارامتر - بخش دوم Intuition of Cost Function II - قسمت هفتم دوره یادگیری ماشین دانشگاه استنفورد

روش صحیح :

\( \Large temp0:= \theta_{0}- \alpha \frac{\partial 1}{\partial \theta_{0}} J(\theta_{1},\theta_{0}) \)

\( \Large temp1:= \theta_{1}- \alpha \frac{\partial 1}{\partial \theta_{1}} J(\theta_{1},\theta_{0}) \)

\( \Large \theta_{0}:=temp0  \)

\( \Large \theta_{1}:=temp1  \)

در این روش ابتدا سمت راست معادله را محاسبه می کنیم، سپس به صورت همزمان آن را در متغیرهای \( \Large temp0  \) و  \( \Large temp1  \) ذخیره می کنیم. در نهایت مقادیر \( \Large \theta_{0} \) و \( \Large \theta_{1} \) به صورت همزمان تغییر خواهند کرد.

روش نادرست :

\( \Large temp0:= \theta_{0}- \alpha \frac{\partial 1}{\partial \theta_{0}} J(\theta_{1},\theta_{0}) \)

\( \Large \theta_{0}:=temp0  \)

\( \Large temp1:= \theta_{1}- \alpha \frac{\partial 1}{\partial \theta_{1}} J(\theta_{1},\theta_{0}) \)

\( \Large \theta_{1}:=temp1  \)

در این روش ابتدا \( \Large \theta_{0} \) را تغییر می دهیم، سپس \( \Large temp1  \) را محاسبه می کنیم و مقدار \( \Large \theta_{1} \) را تغییر می دهیم. در این معادله از مقادیر \( \Large \theta_{0} \) و \( \Large \theta_{1} \) به صورت همزمان استفاده می کنیم. بنابراین باید حتما مقادیر آپدیت شده آن را به کار ببریم. پس از این به بعد زمانی که از الگوریتم گرادیان نزولی استفاده می کنیم منظورمان در حالت تغییر همزمان متغیرها است. اگرچه با استفاده از روش نادرست نیز ممکن است به جواب برسید ولی دیگر گرادیان نزولی نخواهد بود.

اینبار نوبت شما است که گرادیان نزولی را محاسبه کنید

فرض کنید \( \Large \theta_{0}=1 \) و \( \Large \theta_{1}=2 \) و مطابق الگوریتم گرادیان نزولی \( \Large (For J=0  and  J=1)\) \( \Large \theta_{j}:= \theta_{j}+ \sqrt {\theta_{0} \theta_{1} } \)  به طور پیوسته مقادیر \( \Large \theta_{0} \) و \( \Large \theta_{1}\) را آپدیت می کنیم. مقدار \( \Large \theta_{0} \) و \( \Large \theta_{1}\) را بدست آورید؟

گزینه صحیح را انتخاب کنید.

فیلم الگوریتم گرادیان نزولی از دوره یادگیری ماشین دانشگاه استنفورد

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

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

در جلسه آینده الگوریتم گرادیان نزولی را به طور خاص برای تابع هزینه \( \Large J \) در رگرسیون خطی استفاده خواهیم کرد. همچنین بیشتر در مورد مشتقی که در الگوریتم گرادیان نزولی وجود دارد صحبت خواهیم کرد و تمام مطالبی که برای استفاده از گرادیان نزولی نیاز دارید را خواهید آموخت.

۲ دیدگاه در “الگوریتم گرادیان نزولی Gradient Descent Algorithm – قسمت هشتم دوره یادگیری ماشین دانشگاه استنفورد

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.