در تمرین قبلی دیدید که فقط افزودن لایههای پنهان به شبکه ما برای نمایش غیرخطیها کافی نیست. عملیات خطی انجام شده بر روی عملیات خطی همچنان خطی هستند.
چگونه می توان یک شبکه عصبی را برای یادگیری روابط غیرخطی بین مقادیر پیکربندی کرد؟ ما به راهی برای درج عملیات ریاضی غیرخطی در یک مدل نیاز داریم.
اگر این تا حدودی آشنا به نظر می رسد، به این دلیل است که ما در واقع عملیات ریاضی غیرخطی را در خروجی یک مدل خطی در اوایل دوره اعمال کرده ایم. در ماژول رگرسیون لجستیک ، ما یک مدل رگرسیون خطی را برای خروجی یک مقدار پیوسته از 0 تا 1 (نماینده یک احتمال) با عبور خروجی مدل از طریق یک تابع سیگموید تطبیق دادیم.
ما می توانیم همین اصل را برای شبکه عصبی خود اعمال کنیم. بیایید مدل خود را از تمرین 2 قبلاً بررسی کنیم، اما این بار، قبل از خروجی مقدار هر گره، ابتدا تابع sigmoid را اعمال می کنیم:
سعی کنید محاسبات هر گره را با کلیک کردن روی >| انجام دهید دکمه (در سمت راست دکمه پخش). عملیات ریاضی انجام شده برای محاسبه هر گره را در پانل محاسبات زیر نمودار مرور کنید. توجه داشته باشید که خروجی هر گره اکنون تبدیل سیگموئیدی از ترکیب خطی گرهها در لایه قبلی است و مقادیر خروجی همگی بین 0 و 1 فشرده میشوند.
در اینجا، سیگموئید به عنوان یک تابع فعال سازی برای شبکه عصبی عمل می کند، تبدیل غیرخطی مقدار خروجی یک نورون قبل از اینکه مقدار به عنوان ورودی به محاسبات لایه بعدی شبکه عصبی ارسال شود.
اکنون که یک تابع فعال سازی اضافه کرده ایم، افزودن لایه ها تاثیر بیشتری دارد. انباشتن غیرخطی ها روی غیرخطی ها به ما اجازه می دهد تا روابط بسیار پیچیده ای را بین ورودی ها و خروجی های پیش بینی شده مدل کنیم. به طور خلاصه، هر لایه به طور موثر در حال یادگیری یک تابع پیچیده تر و سطح بالاتر از ورودی های خام است. اگر میخواهید شهود بیشتری در مورد نحوه کارکرد این کار ایجاد کنید، به پست وبلاگ عالی کریس اولاه مراجعه کنید.
توابع فعال سازی رایج
سه تابع ریاضی که معمولاً به عنوان توابع فعال سازی استفاده می شوند عبارتند از sigmoid، tanh و ReLU.
تابع sigmoid (در بالا مورد بحث قرار گرفت) تبدیل زیر را در ورودی $x$ انجام می دهد و مقدار خروجی بین 0 و 1 تولید می کند:
\[F(x)=\frac{1} {1+e^{-x}}\]
در اینجا نموداری از این تابع آورده شده است:
![شکل 4. نمودار تابع سیگموئید: منحنی s شکل که به صورت مجانبی به محور x با نزدیک شدن x به بی نهایت منفی و 1 با نزدیک شدن x به بی نهایت نزدیک می شود.](https://developers.google.cn/static/machine-learning/crash-course/neural-networks/images/sigmoid.png?hl=fa)
تابع tanh (مخفف "مماس هایپربولیک") ورودی $x$ را برای تولید یک مقدار خروجی بین -1 و 1 تبدیل می کند:
\[F(x)=tanh(x)\]
در اینجا نموداری از این تابع آورده شده است:
![شکل 5. نمودار تابع tanh: منحنی s شکل کمی تندتر از تابع سیگموئید، که به صورت مجانبی به -1 با نزدیک شدن x به بی نهایت منفی و 1 با نزدیک شدن x به بی نهایت نزدیک می شود.](https://developers.google.cn/static/machine-learning/crash-course/neural-networks/images/tanh.png?hl=fa)
تابع فعال سازی واحد خطی اصلاح شده (یا به اختصار ReLU ) خروجی را با استفاده از الگوریتم زیر تبدیل می کند:
- اگر مقدار ورودی $x$ کمتر از 0 باشد، 0 را برگردانید.
- اگر مقدار ورودی $x$ بزرگتر یا مساوی 0 باشد، مقدار ورودی را برگردانید.
ReLU را می توان با استفاده از تابع max() به صورت ریاضی نشان داد:
در اینجا نموداری از این تابع آورده شده است:
![شکل 6. نمودار تابع ReLU: یک خط افقی در امتداد محور x از بینهایت منفی تا 0، که به یک خط مورب تبدیل می شود که به سمت بالا و به سمت راست با شیب 1 (y=x) از 0 تا بینهایت تبدیل می شود.](https://developers.google.cn/static/machine-learning/crash-course/neural-networks/images/relu.png?hl=fa)
ReLU اغلب به عنوان یک تابع فعال سازی کمی بهتر از یک تابع صاف مانند سیگموئید یا tanh عمل می کند، زیرا در طول آموزش شبکه عصبی کمتر در معرض مشکل گرادیان ناپدید کننده است. محاسبه ReLU نیز بسیار ساده تر از این توابع است.
سایر عملکردهای فعال سازی
در عمل، هر تابع ریاضی می تواند به عنوان یک تابع فعال سازی عمل کند. فرض کنید که \(\sigma\) عملکرد فعال سازی ما را نشان می دهد. مقدار یک گره در شبکه با فرمول زیر بدست می آید:
Keras برای بسیاری از عملکردهای فعال سازی پشتیبانی خارج از جعبه ارائه می دهد. با این حال، ما همچنان توصیه می کنیم با ReLU شروع کنید.
خلاصه
ویدئوی زیر خلاصه ای از همه چیزهایی را که تاکنون در مورد نحوه ساخت شبکه های عصبی آموخته اید ارائه می دهد:
اکنون مدل ما تمام مؤلفههای استانداردی را دارد که مردم معمولاً وقتی به یک شبکه عصبی اشاره میکنند منظور میکنند:
- مجموعه ای از گره ها، مشابه نورون ها، که در لایه ها سازماندهی شده اند.
- مجموعه ای از وزن ها که نشان دهنده ارتباط بین هر لایه شبکه عصبی و لایه زیر آن است. لایه زیر ممکن است یک لایه شبکه عصبی دیگر یا نوع دیگری از لایه باشد.
- مجموعه ای از سوگیری ها، یکی برای هر گره.
- یک تابع فعال سازی که خروجی هر گره را در یک لایه تبدیل می کند. لایه های مختلف ممکن است عملکردهای فعال سازی متفاوتی داشته باشند.
یک هشدار: شبکههای عصبی لزوماً همیشه بهتر از تلاقی ویژگیها نیستند، اما شبکههای عصبی یک جایگزین انعطافپذیر ارائه میدهند که در بسیاری از موارد به خوبی کار میکند.