نسخه ی نمایشی پس انتشار
$$ \definecolor{input}{RGB}{66, 133, 244} \definecolor{output}{RGB}{219, 68, 55} \definecolor{dinput}{RGB}{244, 180, 0} \definecolor{doutput}{RGB}{15, 157, 88} \definecolor{dweight}{RGB}{102, 0, 255} $$

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

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

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

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

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

گره ها در لایه های مجاور با وزنه \(w_{ij}\)که پارامترهای شبکه هستند به هم متصل می شوند.

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

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

یک تابع فعال سازی رایج، تابع Sigmoid است : \(f(\color{input}x\color{black}) = \frac{1}{1+e^{-\color{input}x}}\).

تابع خطا

هدف یادگیری وزن های شبکه به طور خودکار از داده ها است به طوری که خروجی پیش بینی شده \(\color{output}y_{output}\)نزدیک به هدف \(\color{output}y_{target}\) برای همه ورودی ها \(\color{input}x_{input}\)باشد.

برای اندازه گیری اینکه چقدر از هدف فاصله داریم، از تابع خطا \(E\)استفاده می کنیم. یک تابع خطای رایج \(E(\color{output}y_{output}\color{black},\color{output}y_{target}\color{black}) = \frac{1}{2}(\color{output}y_{output}\color{black} - \color{output}y_{target}\color{black})^2 \)است.

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

ما با مثال ورودی \((\color{input}x_{input}\color{black},\color{output}y_{target}\color{black})\) و به روز رسانی لایه ورودی شبکه شروع می کنیم.

برای ثبات، ورودی را مانند هر گره دیگری اما بدون تابع فعال سازی در نظر می گیریم، بنابراین خروجی آن برابر با ورودی آن است، یعنی \( \color{output}y_1 \color{black} = \color{input} x_{input} \).

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

اکنون اولین لایه پنهان را به روز می کنیم. خروجی \(\color{output}y\) گره های لایه قبل را می گیریم و از وزن ها برای محاسبه ورودی \(\color{input}x\) گره ها در لایه بعدی استفاده می کنیم.
$$ \color{input} x_j \color{black} = $$ $$ \sum_{i\in in(j)} w_{ij}\color{output} y_i\color{black} +b_j$$

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

سپس خروجی گره ها را در اولین لایه پنهان به روز می کنیم. برای این کار از تابع فعال سازی، \( f(x) \)استفاده می کنیم.
$$ \color{output} y \color{black} = f(\color{input} x \color{black})$$

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

با استفاده از این 2 فرمول برای بقیه شبکه پخش می کنیم و خروجی نهایی شبکه را می گیریم.
$$ \color{output} y \color{black} = f(\color{input} x \color{black})$$
$$ \color{input} x_j \color{black} = $$ $$ \sum_{i\in in(j)} w_{ij}\color{output} y_i \color{black} + b_j$$

مشتق خطا

الگوریتم پس انتشار تصمیم می گیرد که پس از مقایسه خروجی پیش بینی شده با خروجی مورد نظر برای یک مثال خاص، چه مقدار به روز رسانی هر وزن شبکه انجام شود. برای این، باید نحوه تغییر خطا را با توجه به هر وزن \(\color{dweight}\frac{dE}{dw_{ij}}\)محاسبه کنیم.
هنگامی که مشتقات خطا را داریم، می توانیم وزن ها را با استفاده از یک قانون به روز رسانی ساده به روز کنیم:
$$w_{ij} = w_{ij} - \alpha \color{dweight}\frac{dE}{dw_{ij}}$$
جایی که \(\alpha\) یک ثابت مثبت است که به آن نرخ یادگیری گفته می شود، که باید آن را به صورت تجربی تنظیم کنیم.

[توجه] قانون به‌روزرسانی بسیار ساده است: اگر هنگام افزایش وزن، خطا کاهش یابد (\(\color{dweight}\frac{dE}{dw_{ij}}\color{black} < 0\))، وزن را افزایش دهید، در غیر این صورت اگر با افزایش وزن خطا بالا رفت (\(\color{dweight}\frac{dE}{dw_{ij}} \color{black} > 0\))، وزن را کاهش دهید. .

مشتقات اضافی

برای کمک به محاسبه \(\color{dweight}\frac{dE}{dw_{ij}}\)، علاوه بر این برای هر گره دو مشتق دیگر ذخیره می کنیم: نحوه تغییر خطا با:
  • کل ورودی گره \(\color{dinput}\frac{dE}{dx}\) و
  • خروجی گره \(\color{doutput}\frac{dE}{dy}\).

انتشار به پشت

بیایید شروع به انتشار مجدد مشتقات خطا کنیم. از آنجایی که خروجی پیش‌بینی‌شده این نمونه ورودی خاص را داریم، می‌توانیم نحوه تغییر خطا با آن خروجی را محاسبه کنیم. با توجه به تابع خطای ما \(E = \frac{1}{2}(\color{output}y_{output}\color{black} - \color{output}y_{target}\color{black})^2\) داریم:
$$ \color{doutput} \frac{\partial E}{\partial y_{output}} \color{black} = \color{output} y_{output} \color{black} - \color{output} y_{target}$$

انتشار به پشت

اکنون که \(\color{doutput} \frac{dE}{dy}\) داریم، می توانیم \(\color{dinput}\frac{dE}{dx}\) را با استفاده از قانون زنجیره ای بدست آوریم.
$$\color{dinput} \frac{\partial E}{\partial x} \color{black} = \frac{dy}{dx}\color{doutput}\frac{\partial E}{\partial y} \color{black} = \frac{d}{dx}f(\color{input}x\color{black})\color{doutput}\frac{\partial E}{\partial y}$$
که در آن \(\frac{d}{dx}f(\color{input}x\color{black}) = f(\color{input}x\color{black})(1 - f(\color{input}x\color{black}))\) زمانی که \(f(\color{input}x\color{black})\) تابع فعال سازی Sigmoid است.

انتشار به پشت

به محض اینکه مشتق خطا را با توجه به کل ورودی یک گره داشته باشیم، می توانیم مشتق خطا را با توجه به وزن هایی که به آن گره وارد می شود، دریافت کنیم.
$$\color{dweight} \frac{\partial E}{\partial w_{ij}} \color{black} = \frac{\partial x_j}{\partial w_{ij}} \color{dinput}\frac{\partial E}{\partial x_j} \color{black} = \color{output}y_i \color{dinput} \frac{\partial E}{\partial x_j}$$

انتشار به پشت

و با استفاده از قانون زنجیره می توانیم \(\frac{dE}{dy}\) را نیز از لایه قبلی دریافت کنیم. ما یک دایره کامل ایجاد کرده ایم.
$$ \color{doutput} \frac{\partial E}{\partial y_i} \color{black} = \sum_{j\in out(i)} \frac{\partial x_j}{\partial y_i} \color{dinput} \frac{\partial E}{\partial x_j} \color{black} = \sum_{j\in out(i)} w_{ij} \color{dinput} \frac{\partial E}{\partial x_j}$$

انتشار به پشت

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

پایان.

محاسبه...