AliFallahi
AliFallahi
خواندن ۸ دقیقه·۴ سال پیش

گراف محاسباتی (Computational Graph) و محاسبه مشتق ضمنی در شبکه های عصبی عمیق

در این مطلب به بررسی گراف محاسباتی (کامپیوتیشنال گراف | Computational Graph) و کاربرد آن در عملیات انتشار رو به جلو (فُروارد پروپگیشن | Forward Propagation) و همچنین روش پس انتشار یا انتشار رو به عقب (بک وارد پروپگیشن | Backward Propagation) می پردازیم. همچنین برای محاسبه مشتق از قانون زنجیر در دیفرانسیل، نیز استفاده می کنیم.

آموزش قانون زنجیر دیفرانسیل در گراف محاسباتی (Computational Graph) در شبکه های عصبی عمیق
آموزش قانون زنجیر دیفرانسیل در گراف محاسباتی (Computational Graph) در شبکه های عصبی عمیق


انتشار رو به جلو (Forward Propagation)

گراف محاسباتی (Computational Graph) در شبکه های عصبی عمیق
گراف محاسباتی (Computational Graph) در شبکه های عصبی عمیق

در این شکل، اگر از سمت چپ به راست، معادلات را انجام دهیم خواهیم داشت:

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 رسیدیم.


انتشار رو به عقب (Backward Propagation)

در شبکه های عصبی عمیق، روال کلی انجام کار به این صورت است که ما داده های ورودی را به سیستم می دهیم، با مقادیر اولیه که به صورت تصادفی انتخاب شده اند، پارامترها را مقدار دهی می کنیم و سپس شبکه عملیات فروارد پروپگیشن را انجام می دهد. جواب نهایی مورد ارزیابی قرار می گیرد و میزان خطای شبکه محاسبه می شود، سپس برخلاف Forward Propagation، اینبار رو به عقب حرکت می کنیم (Backward Propagation) و پارامترها را اصلاح می کنیم. با پارامترهای آپدیت شده مجدد، مدل اجرا می شود (Forward Propagation) و به جواب پایانی می رسیم. جواب را مورد ارزیابی قرار داده و میزان خطای شبکه را محاسبه می کنیم. Backward Propagation و اصلاح پارامترها را انجام داده و مجدد شبکه را اجرا می کنیم. این مراحل، تا زمانی که قانع شویم مدل دارای دقت کافی در انجام وظیفه تعیین شده است می شود.

به تابعی که با استفاده از آن میزان خطای شبکه را محاسبه می کنیم، تابع هزینه (لاس فانکشن | Loss Function) گفته می شود. برای به روزرسانی پارامترها متناسب با خروجی تابع هزینه نیز از الگوریتم گرادیان کاهشی (گردین دیسنت | Gradient descent) استفاده می کنیم.

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

اما برای انجام Backward Propagation ما نیاز داریم تا ارتباط بین نتیجه نهایی شبکه (گراف محاسباتی) و ورودی ها و نتایج میانی شبکه را به دست بیاوریم. منظور از این ارتباط، مشتق ضمنی تابع J نسبت به پارامتر موردنظر است (یا به بیان ساده تر شیب خط J در نقطه مورد نظر).

به مشتق در زبان انگلیسی، Derivative (دِری وِتیو) یا شیب خط Slop (اِسلُپ) گفته می شود.


گراف ارایه شده را در نظر بگیرید.

Backward Propagationمحاسبه مشتق ضمنی در
Backward Propagationمحاسبه مشتق ضمنی در

اگر بخواهیم خط 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

این رابطه بر روی نمودار به صورت زیر محاسبه می شود. (بر روی قسمت موردنظر از شکل قبل زوم شده است.)

Derivative وزش مشتق
Derivative وزش مشتق

شیب خط در نقظه مورد نظر (مشتق خط) که با رنگ سبز نشان داده شده است برابر است با تقسیم ارتفاع مثلث ساخته شده (خط آبی) بر قاعده یا عرض مثلث ساخته شده (خط قرمز).

این مفهوم را به صورت کسر زیر نشان می دهیم.

مجدد گراف را به خاطر بیاورید.

فروارد پروپگیشن در شبکه های عصبی
فروارد پروپگیشن در شبکه های عصبی

قانون زنجیر در دیفرانسیل

اگر بخواهیم مشتق 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 نسبت به هر یک از موارد موجود در گراف محاسباتی را به دست بیاوریم.

بکوارد پروپگیشن در شبکه های عصبی
بکوارد پروپگیشن در شبکه های عصبی

مشتق j نسب به u

مشتق j نسبت به b

مقدار 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 نسبت به c

مشابه به مشتق j نسبت به b برای محاسبه مشتق j نسبت به c خواهیم داشت:

راهنمای تعریف متغیر در کدنویسی محاسبه مشتق

در مبحث مطرح شده، j خروجی نهایی شبکه است که به آن Final output می گوییم. پس در هریک از کسرهای dj بر روی هر یک از متغیرهای غیرپایانی گراف مثل dv، du، da، db، dc منظور ما کسر زیر است.

که به صورت خلاصه نوشته می شود

به دلیل اینکه تعریف کامل کسر در نام متغیر دشوار است، در کدنویسی مشتق های ضمنی بالا را به صورت dv، du، da، db، dc نشان می دهیم. در واقع تنها به ذکر کسر مربوطه اکتفا می کنیم.

هریک از متغیرهای ذکر شده، دارای مفهوم زیر هستند





شبکه های عصبی
آنچنان رفتم كه خود می خواستم
شاید از این پست‌ها خوشتان بیاید