**پس‌انتشار** (انگلیسی: Backpropagation) یا **انتشار معکوس،** روشی در یادگیری عمیق برای آموزش شبکه‌های عصبی پیشخور است (روش‌های مشابهی برای آموزش سایر شبکه‌های عصبی مصنوعی به وجود آمده‌است). در این روش با استفاده از قاعده زنجیره‌ای، گرادیان تابع هزینه برای تک‌تک وزن‌ها محاسبه می‌شود. برای این کار برای محاسبه گرادیان هر لایه نسبت به تابع هزینه، از مشتق جزئی تابع هزینه نسبت به لایه بعدی استفاده می‌شود. در واقع از آخرین لایه (نزدیک‌ترین لایه به خروجی) محاسبه مشتق‌ها شروع می‌شود و تا ابتدای شبکه (نزدیک‌ترین لایه به ورودی‌ها) ادامه پیدا می‌کند.

روش معمول محاسبه گرادیان (محاسبه اثر هر وزن در خروجی هر نمونه) برای شبکه‌های عصبی پیشخور و به خصوص شبکه‌های عمیق بسیار زمان‌بر و در عمل غیرممکن است. با استفاده از روش پس‌انتشار و با کمک قاعده زنجیره‌ای و مشتق جزئی، در محاسبه گرادیان هر لایه از مشتقات لایه‌های جلوتر استفاده می‌شود و زمان اجرا تا حد زیادی کاهش پیدا می‌کند. استفاده از روش پس‌انتشار در کنار روش گرادیان کاهشی تصادفی، امکان اضافه کردن لایه‌های بیش‌تر به مدل به دلیل صرفه‌جویی زمانی به وجود می‌آید. این افزایش تعداد لایه‌ها از سوی دیگر باعث امکان یادگیری الگوهای پیچیده‌تر می‌شود.

ساختار ریاضی الگوریتم
---------------------

محاسبه گرادیان تابع هزینه برای سلول c
برای سلول عصبی c ورودیی که از سلول عصبی p به این سلول وارد می‌شود را با {\displaystyle b\_{pc}} نشان می‌دهیم. وزن این ورودی {\displaystyle w\_{pc}} است و مجموع ضرب ورودی‌ها با وزنهایشان را با {\displaystyle a\_{c}} نمایش می‌دهیم، یعنی {\displaystyle a\_{c}=\sum w\_{pc}\times b\_{pc}}. حال باید بر روی {\displaystyle a\_{c}} یک تابع غیر خطی اعمال کنیم، این تابع را {\displaystyle \theta \_{c}} می‌نامیم و خروجی آن را با {\displaystyle b\_{c}} نمایش می‌دهیم به این معنی که {\displaystyle b\_{c}=\theta \_{c}(a\_{c})}. به همین شکل خروجی‌هایی که از سلول عصبی c خارج شده و به سلول n وارد می‌شوند را با {\displaystyle b\_{cn}} نمایش می‌دهیم و وزن آن را با {\displaystyle w\_{cn}}. اگر تمام وزنهای این شبکه عصبی را در مجموعه‌ای به اسم W بگنجانیم، هدف در واقع یادگیری این وزنهاست. اگر ورودی ما x باشد و خروجی y و خروجی شبکه عصبی ما {\displaystyle h\_{W}(x)}، هدف ما پیدا کردن W است به قسمی که برای همه داده‌ها y و {\displaystyle h\_{W}(x)} به هم خیلی نزدیک شوند. به عبارت دیگر هدف کوچک کردن یک تابع ضرر بر روی تمام داده هاست، اگر داده‌ها را با {\displaystyle (x\_{1},y\_{1}),\cdots ,(x\_{n},y\_{n})} و تابع ضرر را با l نشان دهیم هدف کمینه کردن تابع پایین بر حسب W است:

{\displaystyle Q(W)=\sum \_{i=1}^{n}l\left(h\_{W}(x\_{i}),\,\,y\_{i}\right)}

به عنوان مثال اگر مسئله رگرسیون است برای l می‌توانیم خطای مربعات را در نظر بگیریم و اگر مسئله دسته‌بندی است برای l می‌شود منفی لگاریتم بازنمایی را استفاده کرد.

برای به‌دست آوردن کمینه {\displaystyle Q(W)} می‌توان از روش گرادیان کاهشی استفاده کرد، به این معنی که گرادیان تابع را در حساب کرد و کمی در خلاف جهت آن حرکت کرد و این کار را آنقدر ادامه داد تا تابع ضرر خیلی کوچک شود. روش بازگشت به عقب در واقع روشی برای پیدا کردن گرادیان تابع است.

حال فرض کنیم می‌خواهیم گرادیان تابع {\displaystyle Q(W)} را نسبت به وزن {\displaystyle w\_{pc}} به‌دست بیاوریم. برای این کار نیاز به قاعده زنجیری در مشتق‌گیری داریم. قاعده زنجیری به این شکل کار می‌کند: اگر تابعی داشته باشیم به اسم f که وابسته به سه ورودی u، v و w باشد و هرکدام از این سه ورودی به نوبه خود وابسته به t باشند، مشتق f به t به این شکل محاسبه می‌شود:

{\displaystyle {\frac {\partial f\left(u(t),v(t),w(t)\right)}{\partial t}}={\frac {\partial f}{\partial u}}{\frac {\partial u}{\partial t}}+{\frac {\partial f}{\partial v}}{\frac {\partial v}{\partial t}}+{\frac {\partial f}{\partial w}}{\frac {\partial w}{\partial t}}}

با استفاده از این قاعده زنجیری روش بازگشت به عقب را به این شکل دنبال می‌کنیم:

{\displaystyle \delta \_{c}={\frac {\partial Q}{\partial a\_{c}}}}

{\displaystyle a\_{c}=\sum \_{p}w\_{pc}\times b\_{pc}}

{\displaystyle b\_{c}=\theta \_{c}(a\_{c})}

{\displaystyle \delta \_{c}={\frac {\partial Q}{\partial a\_{c}}}={\frac {\partial Q}{\partial b\_{c}}}{\frac {\partial b\_{c}}{\partial a\_{c}}}={\frac {\partial Q}{\partial b\_{c}}}\times {\acute {\theta }}\_{c}(a\_{c})=\left(\sum \_{n}{\frac {\partial Q}{\partial a\_{n}}}{\frac {\partial a\_{n}}{\partial b\_{c}}}\right)\times {\acute {\theta }}\_{c}(a\_{c})=\left(\sum \_{n}w\_{cn}\delta \_{n}\right)\times {\acute {\theta }}\_{c}(a\_{c})}

{\displaystyle {\frac {\partial Q}{\partial w\_{pc}}}={\frac {\partial Q}{\partial a\_{c}}}{\frac {\partial a\_{c}}{\partial w\_{pc}}}=\delta \_{c}b\_{p}}

همان‌طور که در خط پیشین دیدیم برای به‌دست آوردن گرادیان نسبت به {\displaystyle w\_{pc}} به دو مقدار نیاز داریم ورودی به سلول عصبی {\displaystyle c} از سلول عصبی {\displaystyle p} که همان {\displaystyle b\_{p}} است و راحت به‌دست می‌آید و {\displaystyle \delta \_{c}} که از روش بازگشتی به‌دست می‌آید و بستگی به آن {\displaystyle \delta }‌هایی لابه بعد دارد که سلول {\displaystyle c}به آن‌ها وصل است، به‌طور دقیقتر {\displaystyle \delta \_{c}=\left(\sum \_{n}w\_{cn}\delta \_{n}\right)\times {\acute {\theta }}\_{c}(a\_{c})}.

روش بازگشتی برای به‌دست آوردن {\displaystyle \delta }‌ها به این شکل کار می‌کند که ابتدا {\displaystyle \delta } را برای سلول‌های لایه خروجی حساب می‌کنیم، و بعد لایه‌ها را به نوبت پایین می‌روم و برای هر سلول {\displaystyle \delta } آن را با ترکیت {\displaystyle \delta }‌های لایه‌های بالایی آن طبق فرمول حساب می‌کنیم. محاسبه کردن {\displaystyle \delta } برای لایه خروجی آسان است و مستقیماً با مشتق گرفتن از {\displaystyle Q} به‌دست می‌آید.

شهود
----

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

### پیدا کردن مشتق وزن‌ها نسبت به تابع هزینه

[نمایشی از یک نورون در شبکه عصبی مصنوعی]نمایشی از یک نورون در شبکه عصبی مصنوعی
به کمک قاعده زنجیره‌ای می‌توانیم مشتق تابع هزینه را نسبت به هر یک از وزن‌های شبکه عصبی ({\displaystyle w\_{ij}}) به‌دست بیاوریم:

|  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- |
| {\displaystyle {\frac {\partial E}{\partial w\_{ij}}}={\frac {\partial E}{\partial o\_{j}}}{\frac {\partial o\_{j}}{\partial w\_{ij}}}={\frac {\partial E}{\partial o\_{j}}}{\frac {\partial o\_{j}}{\partial {\text{net}}\_{j}}}{\frac {\partial {\text{net}}\_{j}}{\partial w\_{ij}}}} | 

|  |  |  |
| --- | --- | --- |
|   |   |   |
|   |

 | **(معادله ۱)** |

حال سعی می‌کنیم آخرین کسر سمت راست را ساده کنیم (در {\displaystyle {\text{net}}\_{j}} فقط همان ترکیب خطی خروجی نورون فعلی به {\displaystyle w\_{ij}} وابسته است) :

|  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- |
| {\displaystyle {\frac {\partial {\text{net}}\_{j}}{\partial w\_{ij}}}={\frac {\partial }{\partial w\_{ij}}}\left(\sum \_{k=1}^{n}w\_{kj}o\_{k}\right)={\frac {\partial }{\partial w\_{ij}}}w\_{ij}o\_{i}=o\_{i}.} | 

|  |  |  |
| --- | --- | --- |
|   |   |   |
|   |

 | **(معادله ۲)** |

می‌دانیم مشتق خروجی نورون j نسبت به ورودی‌های آن همان مشتق جزئی نسبت به تابع فعال‌سازی است. در واقع دلیل اصلی این‌که تابع فعال‌سازی باید مشتق‌پذیر باشد، محاسبه همین مشتق است:

|  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- |
| {\displaystyle {\frac {\partial o\_{j}}{\partial {\text{net}}\_{j}}}={\frac {\partial \varphi ({\text{net}}\_{j})}{\partial {\text{net}}\_{j}}}} | 

|  |  |  |
| --- | --- | --- |
|   |   |   |
|   |

 | **(معادله ۳)** |

برای مثال در حالتی که تابع فعال سازی، تابع لجستیک باشد:

{\displaystyle {\frac {\partial o\_{j}}{\partial {\text{net}}\_{j}}}={\frac {\partial }{\partial {\text{net}}\_{j}}}\varphi ({\text{net}}\_{j})=\varphi ({\text{net}}\_{j})(1-\varphi ({\text{net}}\_{j}))=o\_{j}(1-o\_{j})}

حال طبق معادله ۱ یکی یکی بخش‌های مختلف را محاسبه می‌کنیم. کسر اول (مانند آنچه در زیر آمده‌است) با مشخص بودن خروجی و تابع هزینه به راحتی قابل محاسبه است.

|  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- |
| {\displaystyle {\frac {\partial E}{\partial o\_{j}}}={\frac {\partial E}{\partial y}}} | 

|  |  |  |
| --- | --- | --- |
|   |   |   |
|   |

 | **(معادله ۴)** |

برای مثال اگر تابع هزینه همان مربعات خطاها باشد،

{\displaystyle {\frac {\partial E}{\partial o\_{j}}}={\frac {\partial E}{\partial y}}={\frac {\partial }{\partial y}}{\frac {1}{2}}(t-y)^{2}=y-t}

با فرض اینکه E تابعی از همه نورون‌هایی است که از نورون j ام به آن‌ها یال دارد ({\displaystyle L=\{u,v,\dots ,w\}}):

{\displaystyle {\frac {\partial E(o\_{j})}{\partial o\_{j}}}={\frac {\partial E(\mathrm {net} \_{u},{\text{net}}\_{v},\dots ,\mathrm {net} \_{w})}{\partial o\_{j}}}}

حال با گرفتن مشتق نسبت به {\displaystyle o\_{j}} فرم بازگشتی زیر به‌دست می‌آید که همان شکل کلی پس‌انتشار است.

|  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- |
| {\displaystyle {\frac {\partial E}{\partial o\_{j}}}=\sum \_{\ell \in L}\left({\frac {\partial E}{\partial {\text{net}}\_{\ell }}}{\frac {\partial {\text{net}}\_{\ell }}{\partial o\_{j}}}\right)=\sum \_{\ell \in L}\left({\frac {\partial E}{\partial o\_{\ell }}}{\frac {\partial o\_{\ell }}{\partial {\text{net}}\_{\ell }}}{\frac {\partial {\text{net}}\_{\ell }}{\partial o\_{j}}}\right)=\sum \_{\ell \in L}\left({\frac {\partial E}{\partial o\_{\ell }}}{\frac {\partial o\_{\ell }}{\partial {\text{net}}\_{\ell }}}w\_{j\ell }\right)} | 

|  |  |  |
| --- | --- | --- |
|   |   |   |
|   |

 | **(معادله ۵)** |

با استفاده از معادله ۱ تا ۵ و حذف بخش‌های مشترک، می‌توانیم مشتق E را نسبت به وزن دلخواه {\displaystyle w\_{ij}} محاسبه کنیم.

{\displaystyle {\frac {\partial E}{\partial w\_{ij}}}={\frac {\partial E}{\partial o\_{j}}}{\frac {\partial o\_{j}}{\partial {\text{net}}\_{j}}}{\frac {\partial {\text{net}}\_{j}}{\partial w\_{ij}}}={\frac {\partial E}{\partial o\_{j}}}{\frac {\partial o\_{j}}{\partial {\text{net}}\_{j}}}o\_{i}}
{\displaystyle {\frac {\partial E}{\partial w\_{ij}}}=o\_{i}\delta \_{j}}
که در آن تابع دلتا به صورت زیر است:

{\displaystyle \delta \_{j}={\frac {\partial E}{\partial o\_{j}}}{\frac {\partial o\_{j}}{\partial {\text{net}}\_{j}}}={\begin{cases}{\frac {\partial L(o\_{j},t)}{\partial o\_{j}}}{\frac {d\varphi ({\text{net}}\_{j})}{d{\text{net}}\_{j}}}&{\text{if }}j{\text{ is an output neuron,}}\\(\sum \_{\ell \in L}w\_{j\ell }\delta \_{\ell }){\frac {d\varphi ({\text{net}}\_{j})}{d{\text{net}}\_{j}}}&{\text{if }}j{\text{ is an inner neuron.}}\end{cases}}}

برای مثال اگر \varphi تابع لجستیک باشد:

{\displaystyle \delta \_{j}={\frac {\partial E}{\partial o\_{j}}}{\frac {\partial o\_{j}}{\partial {\text{net}}\_{j}}}={\begin{cases}(o\_{j}-t\_{j})o\_{j}(1-o\_{j})&{\text{if }}j{\text{ is an output neuron,}}\\(\sum \_{\ell \in L}w\_{j\ell }\delta \_{\ell })o\_{j}(1-o\_{j})&{\text{if }}j{\text{ is an inner neuron.}}\end{cases}}} در نهایت فرم تغییرات وزن به صورت زیر است:

{\displaystyle \Delta w\_{ij}=-\eta {\frac {\partial E}{\partial w\_{ij}}}=-\eta o\_{i}\delta \_{j}}

جستارهای وابسته
---------------

* شبکه عصبی مصنوعی
* شبکه عصبی
* آدابوست
* بیش‌برازش
* گرادیان کاهشی تصادفی
* قاعده زنجیری

منابع
-----

1. ↑  مقایسه دو الگوریتم پس انتشار خطا و ژنتیک در یادگیری شبکه عصبی برای پیش‌بینی سری زمانی آشوبگونه. زهرا عربسرخی، محمدرضا اصغری اسکویی
2. ↑  «Build with AI | DeepAI». *DeepAI*. بایگانی‌شده از اصلی در ۱۷ اکتبر ۲۰۱۸. دریافت‌شده در ۲۰۱۸-۱۰-۲۴.
3. ↑  A. Nielsen, Michael (2015). "Neural Networks and Deep Learning" (به انگلیسی). Archived from the original on 22 October 2018. Retrieved 23 October 2018. `{{cite journal}}`: Cite journal requires `|journal=` (help)
4. ↑  A. Nielsen, Michael (2015). "Neural Networks and Deep Learning" (به انگلیسی). Archived from the original on 22 October 2018. Retrieved 23 October 2018. `{{cite journal}}`: Cite journal requires `|journal=` (help)
5. ↑  Russell, Stuart; results, search (2009-12-11). *Artificial Intelligence: A Modern Approach* (به انگلیسی) (3 ed.). Boston Columbus Indianapolis New York San Francisco Upper Saddle River Amsterdam, Cape Town Dubai London Madrid Milan Munich Paris Montreal Toronto Delhi Mexico City Sao Paulo Sydney Hong Kong Seoul Singapore Taipei Tokyo: Pearson. p. 578.