Loading [MathJax]/jax/output/HTML-CSS/jax.js
نسخه ی نمایشی پس انتشار

الگوریتم پس انتشار

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

لطفا پایین بروید...

شبکه عصبی ساده

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

گره ها در لایه های مجاور با وزنه wijکه پارامترهای شبکه هستند به هم متصل می شوند.

تابع فعال سازی

هر گره دارای یک ورودی کل x، یک تابع فعال سازی f(x)و یک خروجی y=f(x)است. f(x) باید یک تابع غیر خطی باشد، در غیر این صورت شبکه عصبی تنها قادر به یادگیری مدل های خطی خواهد بود.

یک تابع فعال سازی رایج، تابع Sigmoid است : f(x)=11+ex.

تابع خطا

هدف یادگیری وزن های شبکه به طور خودکار از داده ها است به طوری که خروجی پیش بینی شده youtputنزدیک به هدف ytarget برای همه ورودی ها xinputباشد.

برای اندازه گیری اینکه چقدر از هدف فاصله داریم، از تابع خطا Eاستفاده می کنیم. یک تابع خطای رایج E(youtput,ytarget)=12(youtputytarget)2است.

انتشار رو به جلو

ما با مثال ورودی (xinput,ytarget) و به روز رسانی لایه ورودی شبکه شروع می کنیم.

برای ثبات، ورودی را مانند هر گره دیگری اما بدون تابع فعال سازی در نظر می گیریم، بنابراین خروجی آن برابر با ورودی آن است، یعنی y1=xinput.

انتشار رو به جلو

اکنون اولین لایه پنهان را به روز می کنیم. خروجی y گره های لایه قبل را می گیریم و از وزن ها برای محاسبه ورودی x گره ها در لایه بعدی استفاده می کنیم.
xj=
iin(j)wijyi+bj

انتشار رو به جلو

سپس خروجی گره ها را در اولین لایه پنهان به روز می کنیم. برای این کار از تابع فعال سازی، f(x)استفاده می کنیم.
y=f(x)

انتشار رو به جلو

با استفاده از این 2 فرمول برای بقیه شبکه پخش می کنیم و خروجی نهایی شبکه را می گیریم.
y=f(x)
xj=
iin(j)wijyi+bj

مشتق خطا

الگوریتم پس انتشار تصمیم می گیرد که پس از مقایسه خروجی پیش بینی شده با خروجی مورد نظر برای یک مثال خاص، چه مقدار به روز رسانی هر وزن شبکه انجام شود. برای این، باید نحوه تغییر خطا را با توجه به هر وزن dEdwijمحاسبه کنیم.
هنگامی که مشتقات خطا را داریم، می توانیم وزن ها را با استفاده از یک قانون به روز رسانی ساده به روز کنیم:
wij=wijαdEdwij
جایی که α یک ثابت مثبت است که به آن نرخ یادگیری گفته می شود، که باید آن را به صورت تجربی تنظیم کنیم.

[توجه] قانون به‌روزرسانی بسیار ساده است: اگر هنگام افزایش وزن، خطا کاهش یابد (dEdwij<0)، وزن را افزایش دهید، در غیر این صورت اگر با افزایش وزن خطا بالا رفت (dEdwij>0)، وزن را کاهش دهید. .

مشتقات اضافی

برای کمک به محاسبه dEdwij، علاوه بر این برای هر گره دو مشتق دیگر ذخیره می کنیم: نحوه تغییر خطا با:
  • کل ورودی گره dEdx و
  • خروجی گره dEdy.

انتشار به پشت

بیایید شروع به انتشار مجدد مشتقات خطا کنیم. از آنجایی که خروجی پیش‌بینی‌شده این نمونه ورودی خاص را داریم، می‌توانیم نحوه تغییر خطا با آن خروجی را محاسبه کنیم. با توجه به تابع خطای ما E=12(youtputytarget)2 داریم:
Eyoutput=youtputytarget

انتشار به پشت

اکنون که dEdy داریم، می توانیم dEdx را با استفاده از قانون زنجیره ای بدست آوریم.
Ex=dydxEy=ddxf(x)Ey
که در آن ddxf(x)=f(x)(1f(x)) زمانی که f(x) تابع فعال سازی Sigmoid است.

انتشار به پشت

به محض اینکه مشتق خطا را با توجه به کل ورودی یک گره داشته باشیم، می توانیم مشتق خطا را با توجه به وزن هایی که به آن گره وارد می شود، دریافت کنیم.
Ewij=xjwijExj=yiExj

انتشار به پشت

و با استفاده از قانون زنجیره می توانیم dEdy را نیز از لایه قبلی دریافت کنیم. ما یک دایره کامل ایجاد کرده ایم.
Eyi=jout(i)xjyiExj=jout(i)wijExj

انتشار به پشت

تنها کاری که باید انجام دهید این است که سه فرمول قبلی را تکرار کنید تا زمانی که تمام مشتقات خطا را محاسبه کنیم.

پایان.

1y1xinput2y2x2dE/dy2dE/dx2fw12dE/dw3y3x3dE/dy3dE/dx3fw13dE/dw4y4x4dE/dy4dE/dx4fw24dE/dww34dE/dw5y5x5dE/dy5dE/dx5fw25dE/dww35dE/dw6youtputx6dE/dy6dE/dx6fw46dE/dww56dE/dwEytarget
محاسبه...