در این مطلب به بررسی گراف محاسباتی (کامپیوتیشنال گراف | Computational Graph) و کاربرد آن در عملیات انتشار رو به جلو (فُروارد پروپگیشن | Forward Propagation) و همچنین روش پس انتشار یا انتشار رو به عقب (بک وارد پروپگیشن | Backward Propagation) می پردازیم. همچنین برای محاسبه مشتق از قانون زنجیر در دیفرانسیل، نیز استفاده می کنیم.
در این شکل، اگر از سمت چپ به راست، معادلات را انجام دهیم خواهیم داشت:
u = b * c u = 6 * 3 u = 18
v = a + u v = 4 + 18 v = 22
j = 2v j = 2 * 22 j = 44
اگر بخواهیم برای کل این گراف، یک معادله ارایه کنیم خواهیم داشت:
تا اینجا ما عملیات Forward Propagation را انجام دادیم، یعنی با توجه به داده های ورودی (a=4, b=6, c=3) محسابات را انجام دادیم و به جواب پایانی J رسیدیم.
در شبکه های عصبی عمیق، روال کلی انجام کار به این صورت است که ما داده های ورودی را به سیستم می دهیم، با مقادیر اولیه که به صورت تصادفی انتخاب شده اند، پارامترها را مقدار دهی می کنیم و سپس شبکه عملیات فروارد پروپگیشن را انجام می دهد. جواب نهایی مورد ارزیابی قرار می گیرد و میزان خطای شبکه محاسبه می شود، سپس برخلاف Forward Propagation، اینبار رو به عقب حرکت می کنیم (Backward Propagation) و پارامترها را اصلاح می کنیم. با پارامترهای آپدیت شده مجدد، مدل اجرا می شود (Forward Propagation) و به جواب پایانی می رسیم. جواب را مورد ارزیابی قرار داده و میزان خطای شبکه را محاسبه می کنیم. Backward Propagation و اصلاح پارامترها را انجام داده و مجدد شبکه را اجرا می کنیم. این مراحل، تا زمانی که قانع شویم مدل دارای دقت کافی در انجام وظیفه تعیین شده است می شود.
به تابعی که با استفاده از آن میزان خطای شبکه را محاسبه می کنیم، تابع هزینه (لاس فانکشن | Loss Function) گفته می شود. برای به روزرسانی پارامترها متناسب با خروجی تابع هزینه نیز از الگوریتم گرادیان کاهشی (گردین دیسنت | Gradient descent) استفاده می کنیم.
توضیحات مربوط به عملکرد شبکه عصبی، تابع هزینه و الگوریتم گرادیان کاهشی در مطلب مستقل ارایه می شوند.
اما برای انجام Backward Propagation ما نیاز داریم تا ارتباط بین نتیجه نهایی شبکه (گراف محاسباتی) و ورودی ها و نتایج میانی شبکه را به دست بیاوریم. منظور از این ارتباط، مشتق ضمنی تابع J نسبت به پارامتر موردنظر است (یا به بیان ساده تر شیب خط J در نقطه مورد نظر).
به مشتق در زبان انگلیسی، Derivative (دِری وِتیو) یا شیب خط Slop (اِسلُپ) گفته می شود.
گراف ارایه شده را در نظر بگیرید.
اگر بخواهیم خط j=2v را رسم کنیم می توانیم نقاط زیر را خط را پیدا کرده و خط را رسم کنیم.
اگر v = 0 باشد، خروجی 0 می شود.
اگر v = 1 باشد، خروجی 2 می شود.
اگر v = 2 باشد، خروجی 4 می شود.
و اگر مطابق داده های مسئله، v = 22 باشد، j = 2 * 22 خواهد بود و در نتیجه j = 44 می شود.
در شکل زیر مقیاس رعایت نشده است.
گفته شد که j = 2v و اگر v = 20 باشد j = 2 * 20 = 40 می شود. حالا اگر به v مقدار بسیار کمی اضافه کنیم j چه تغییری می کند؟ برای مثال
j = 2 * v
v = 20 j = 2 * 20 = 40
v= 20.001 j = 2 * 20.001 = 40.002
v = 20.002 j = 2 * 20.002 = 40.004
با توجه به محاسبات بالا می توان نتیجه گرفت که اگر v به هر مقداری تغییر کند، j به اندازه 2 برابر آن تغییر می کند.
یا به زبان ریاضی مشتق j نسبت به v برابر به 2 است.
Derivative of j with respect to v is equal to 2
این رابطه بر روی نمودار به صورت زیر محاسبه می شود. (بر روی قسمت موردنظر از شکل قبل زوم شده است.)
شیب خط در نقظه مورد نظر (مشتق خط) که با رنگ سبز نشان داده شده است برابر است با تقسیم ارتفاع مثلث ساخته شده (خط آبی) بر قاعده یا عرض مثلث ساخته شده (خط قرمز).
این مفهوم را به صورت کسر زیر نشان می دهیم.
مجدد گراف را به خاطر بیاورید.
اگر بخواهیم مشتق j را نسبت به a محاسبه کنیم چطور؟
به a مقداری کوچک اضافه می کنیم تا ببینیم j چه تغییری می کند.
v = a + u j = 2 * v
a = 4, u = 18 v = 4 + 18 = 22 j = 2 * 22 = 44
a= 4.0001 v = 4.0001 + 18 = 22.0001 j = 2 * 22.0001 = 44.0002
a= 4.0002 v = 4.0001 + 18 = 22.0002 j = 2 * 22.0002 = 44.0004
با توجه به محاسبات بالا می توان نتیجه گرفت که اگر a به هر مقداری تغییر کند، j به اندازه 2 برابر آن تغییر می کند. پس مشتق j نسبت به a برابر است با 2
همانطور که مشاهده کردید برای محاسبه مشتق j نسبت به a ما نیاز داشتیم که مشتق j نسبت به v را نیز محاسبه کنیم.
a --> v --> j
به این رابطه در دیفرانسیل (Calculus)، قانون زنجیر (Chain rule) گفته می شود.
در فرمول بالا مشتق v به a به صورت زیر محاسبه شده است.
v = a + u
a = 4, u = 18 v = 4 + 18 = 22
a= 4.0001 v = 4.0001 + 18 = 22.0001
a= 4.0002 v = 4.0001 + 18 = 22.0002
هر اندازه که a تغییر کند v نیز به همان اندازه تغییر می کند، پس مشتق v نسبت به a برابر 1 است.
حالا که چگونگی محاسبه مشتق ضمنی نسبت به متغییرهای مختلف و قانون زنجیر را یادگرفتیم می توانیم مشتق j نسبت به هر یک از موارد موجود در گراف محاسباتی را به دست بیاوریم.
مقدار b را به اندازه ای کوچک افزایش می دهیم و تغییرات را بررسی می کنیم.
u=b*c v=a+u j=2*v
b=6, c=3, a=4 u=6*3 =18 v=4+18=22 j=2*22=44
b=6.0001, c=3, a=4 u=6.0001*3 =18.0003 v=4+18.0003=22.0003 j=2*22.0003=44.0006
b=6.0002, c=3, a=4 u=6.0002*3 =18.0006 v=4+18.0006=22.0006 j=2*22.0006=44.0012
هر اندازه که b تغییر کند j به اندازه 6 برابر آن تغییر می کند.
مشابه به مشتق j نسبت به b برای محاسبه مشتق j نسبت به c خواهیم داشت:
در مبحث مطرح شده، j خروجی نهایی شبکه است که به آن Final output می گوییم. پس در هریک از کسرهای dj بر روی هر یک از متغیرهای غیرپایانی گراف مثل dv، du، da، db، dc منظور ما کسر زیر است.
که به صورت خلاصه نوشته می شود
به دلیل اینکه تعریف کامل کسر در نام متغیر دشوار است، در کدنویسی مشتق های ضمنی بالا را به صورت dv، du، da، db، dc نشان می دهیم. در واقع تنها به ذکر کسر مربوطه اکتفا می کنیم.
هریک از متغیرهای ذکر شده، دارای مفهوم زیر هستند