اگر با مفاهیم گراف محاسباتی (کامپیوتیشنال گراف | Computational Graph) و کاربرد آن در عملیات انتشار رو به جلو (فُروارد پروپگیشن | Forward Propagation) و همچنین روش پس انتشار یا انتشار رو به عقب (بک وارد پروپگیشن | Backward Propagation) آشنایی ندارید، پیشنهاد می کنم ابتدا مطلب زیر مطالعه نمایید.
گراف محاسباتی (Computational Graph) و محاسبه مشتق ضمنی در شبکه های عصبی عمیق
شکل زیر گراف محاسباتی برای رگرسیون لجستیک (لجستیک رگرشن | Logistic Regression) را نشان می دهد.
در این شکل پارامترهای w و b به همراه ورودی x به سیستم وارد می شوند. سپس مطابق فرمول داده شده، z محاسبه می شود. در ادامه z به عنوان ورودی به تابع سیگمویید داده می شود. خروجی تابع سیگومئید در متغیر a ریخته می شود. این مقدار می تواند بین صفر تا یک باشد و به معنی احتمال وجود گربه در ورودی داده شده است. مثلا 0.75 یعنی از نظر ماشین، تصویر داده شده، 75% تصویر یک گربه است. در پایان تابع هزینه L با توجه به دو مقدار a و مقدار y میزان خطای شبکه را محاسبه می کند.
این شبکه از نوع یادگیری با ناظر (Supervised Learning) است. در این شکل، y برچسب اصلی ورودی x است.
توضیح بیشتر جمله بالا:
در شبکه های Supervised، داده های ورودی ما برچسب دارند. مثلا ما تعدادی تصویر به شبکه می دهیم و می خواهیم که تصاویری که گربه در آن ها وجود دارد را پیدا کند. نکته مهم این است که خود ما می دانیم کدام تصاویر از گربه ها هستند. y برچسب این تصاویر است و می تواند دارای مقدار 1 به معنی اینکه تصویر گربه است و 0 به این معنی که در آن تصویر گربه وجود ندارد. مثلا در مجموعه داده ای زیر، تنها تصاویر شماره 1 و 3 تصاویر گربه هستند.
در مورد اینکه چرا خروجی تابع سیگومید حتما مقداری بین صفر تا یک است می توانید مطلب زیر را مطالعه نمایید.
تابع سیگمویئد (Sigmoid function) چیست
پس در مرحله آخر گراف ارایه شده، تابع هزینه برای ما اخلاف بین a که مقدار پیش بینی شده برای ورودی x است را با برچسب اصلی آن یعنی y محاسبه می کند.
توضیحات مربوط به تابع هزینه در مطلب مستقل ارایه می شود.
در مطلب "گراف محاسباتی (Computational Graph) و محاسبه مشتق ضمنی در شبکه های عصبی عمیق" توضیح دادیم که در شبکه های عصبی عمیق، روال کلی انجام کار به این صورت است که ما داده های ورودی را به سیستم می دهیم. با مقادیر اولیه که به صورت تصادفی انتخاب شده اند، پارامترها را مقدار دهی می کنیم و سپس شبکه عملیات فروارد پروپگیشن را انجام می دهد. جواب نهایی مورد ارزیابی قرار می گیرد و میزان خطای شبکه محاسبه می شود، سپس برخلاف Forward Propagation، اینبار رو به عقب حرکت می کنیم (Backward Propagation) و پارامترها را اصلاح می کنیم. با پارامترهای آپدیت شده مجدد، مدل اجرا می شود (Forward Propagation) و به جواب پایانی می رسیم. جواب را مورد ارزیابی قرار داده و میزان خطای شبکه را محاسبه می کنیم. Backward Propagation و اصلاح پارامترها را انجام داده و مجدد شبکه را اجرا می کنیم. این مراحل، تا زمانی که قانع شویم مدل دارای دقت کافی در انجام وظیفه تعیین شده است می شود.
واضح است که ما برای بهبود عملکرد شبکه نمی توانیم ورودی x را تغییر دهیم و تنها پارامترهای w و b هستد که می توان آن ها را بهینه نمود. در واقع ما به دنبال بهینه کردن J(w,b) هستیم.
در این قسمت تابع هزینه را به جای L با J نشان می دهیم. Loss function و Cost function هر دو به تابع هزینه ترجمه می شوند. اما loss function میزان خطا را برای یک ورودی اندازه گیری می کند در حالی که cost function میانگین تمام loss function های محاسبه شده برای همه داده های موجود در دیتاست آموزش شبکه است.
The loss function computes the error for a single training example; the cost function is the average of the loss functions of the entire training set.
در این مثال نیز چون ما تنها یک داده ورودی داریم پس از J به معنی تابع هزینه کلی، استفاده می کنیم.
در این شکل محورهای افقی نشان دهنده مقادیر w و b و محور عمودی نشان دهنده مقدار J است. و هدف ما این است که w و b را به گونه ای انتخاب کنیم که J کمترین مقدار ممکن را داشته باشد (در نقطه ای که J کمترین مقدار ممکن را دارد ببنیم چه w و b چه اعدادی هستند.).
شکل بالا مشابه یک کاسه است (Bow shape) و طبیعتا کمترین مقدار J در عمیق ترین جای این کاسه قرار دارد که با فلش قرمز مشخص شده است. به شکل بالا convex (کان وِکس) گفته می شود.این شکل دارای یک مینیم سراسری و کلی است.
روال کلی کار یک شبکه عصبی را با هم مرور می کنیم.
1. داده های ورودی را به سیستم می دهیم.
2. پارامترهای w و b را با مقادیر اولیه تصادفی، مقدار دهی می کنیم و سپس شبکه، عملیات فروارد پروپگیشن را انجام می دهد. شکل زیر نشان می دهد که ما در نتیجه انتخاب w و b به صورت تصادفی به خروجی J رسیده ایم، اما این نتیجه مطلوب ما نیست.
3. جواب نهایی مورد ارزیابی قرار می گیرد و میزان خطای شبکه محاسبه می شود
4. سپس برخلاف Forward Propagation، اینبار رو به عقب حرکت می کنیم (Backward Propagation) و پارامترها را اصلاح می کنیم.
5. با پارامترهای آپدیت شده مجدد، مدل اجرا می شود (Forward Propagation).
مراحل 3 تا 5 به اندازه ای تکرار می شوند که دقت شبکه به میزان مورد تایید ما برسد.
جمع بندی
هدف الگوریتم گرادیان کاهشی پیدا کردن کمینه محلی (local minimum) در توابع مختلف است، مثل تابع J در این مطلب که شکلی کانوکس داشت.
ایده اصلی در الگوریتم گرادیان کاهشی، تکرار گام برداشتن در جهت شیب رو به سمت پایین است.
در این الگوریتم کار با یک نقطه تصادفی روی تابع آغاز میشود و روی جهت منفی از گرادیان تابع حرکت میکند تا به کمینه محلی/سراسری برسد.
دقت کنید که خروجی تابعی که قصد داریم گرادیان کاهشی را بر روی آن اجرا کنیم می تواند شکل ها بسیار متنوعی داشته باشد.