رفتن به نوشته‌ها

شبکه عصبی پیشرو (فیدفوروارد)

 ۱) یک تشبیه الهام گرفته شده از مغز انسان

همانطور که از اصطلاح شبکه‌های عصبی می‌توان حدس زد، این شبکه‌ها از سازوکار محاسباتی مغز انسان الهام گرفته شده‌اند که در آن هر واحد محاسباتی نورون (Neuron) نامیده می‌شود. در حالی که شباهت بسیار اندکی میان شبکه‌های عصبی مصنوعی (Artificial Neural Networks) و مغز انسان وجود دارد اما اغلب برای سادگی از این تشبیه استفاده می‌شود.

یک نورون در واقعیت (بالا) و یک نورون در شبکه‌های عصبی مصنوعی (پایین)

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

اما چیزی که ما به عنوان نورون در شبکه عصبی مصنوعی تعریف می‌کنیم یک واحد محاسباتی است که ورودی و خروجی آن اعداد هستند. واحد محاسباتی یعنی چی؟ به عکس زیر نگاه کنید:

نورون یک واحد محاسباتی است که ورودی و خروجی آن اعداد هستند.

اون دایره وسط رو میگن نورون! ورودی نورون (\(X_1, X_2, X_3\)) دارای وزن‌های مختص (\(W_1, W_2, W_3\)) به خود هستند. به طوریکه هر نورون، ورودی‌های خود را در وزن‌های مختص‌ به آنها ضرب و نتایج آنها را با یکدیگر جمع (گاهی ماکسیمم) می‌کند. در نهایت یک تابع  \(f\) روی این نتیجه اعمال می‌شود و به خروجی فرستاده می‌شود. اگر بخواهیم یک جور دیگه بگیم چیزی که داره اتفاق میافته مثل زیر خواهد بود:

\(output = f(W_1X_1 + W_2X_2 + W_3X_3)\)

که تابع \(f\) یک تابع پله‌ای (step function) است که به صورت زیر تعریف می‌شود:

معادله ریاضی پرسپترون

در صورتی که جمع ورودی‌ها در وزن‌ها بزرگتر از صفر (یا یک حد آستانه) باشه خروجی تابع ۱ می‌شود و در غیر این صورت ۰ خواهد بود.

مدل بالا اولین بار توسط  Mcculoch and Pitts  در سال ۱۹۴۳ معرفی شد. در واقع آنها ارتباطی بین نورون‌های عصبی در مغز انسان و  گیت‌های منطقی (AND/OR/NOT) با خروجی‌های دودویی (binary) را مطرح کردند.

فرانک روزنبلات (Frank Rosenblatt) در سال ۱۹۵۸ مفهومی به نام پرسپترون (Perceptron) را معرفی کردند. ایده‌ی آقای روزنبلات تقریبا مشابه کار قبلی بود اما چیزی که کار آقای Rosenblatt را متمایز می‌کرد نحوه یادگیری پرسپترون‌ها بود. در واقع مشکل کار Macculoch and Pitts این بود که مدل آنها اصلا قادر به یادگیری نبود. فقط قادر بود گیت‌های AND/OR/NOT رو شبیه‌سازی کنه که در آن زمان به عنوان AI شناخته می‌شد! ولی آقای Rosenblatt الگوریتمی ارائه کردند که به پرسپترون (نورون‌) اجازه می‌داد که یاد بگیرد. ایده الگوریتمش هم به صورت زیر زیر بود:

  1. وزن‌های پرسپترون را با مقدار تصادفی مقدار دهی می‌کنیم.
  2. به ازای نمونه‌های ورودی در دیتاست مقدار خروجی (output) پرسپترون را محاسبه می‌کنیم.
  3. اگر خروجی پرسپترون با برچسب (label) یکسان نبود:
    1. اگر برچسب درست ۱ بود ولی خروجی پرسپترون صفر بود وزنها را افزایش بده
    2. اگر برچسب درست ۰ بود ولی خروخی پرسپترون ۱ بود وزن‌ها را کاهش بده
  4. قسمت‌های ۲ و ۳ را تا وقتی پرسپترون خطایی انجام ندهد تکرار کن.

آقای Rosenblatt الگوریتم بالا رو روی یک سخت‌افزار خاص  پیاده‌سازی کرد و نشان داد که الگوریتم بالا میتونه عکس‌های ساده ۲۰*۲۰ پیکسل را طبقه‌بندی کند( دقت داشته باشید زبان برنامه‌نویسی c تازه تو سال ۱۹۷۲ آمد و ایشون تو سال ۱۹۵۸ این کار رو ارائه کرده‌اند).

سخت‌افزاری که برای پیاده‌سازی پرسپترون مورد استفاده قرار گرفت
سخت‌افزاری که برای پیاده‌سازی پرسپترون مورد استفاده قرار گرفت (منبع ویکی‌پدیا).

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

عملکرد ضعیف پرسپترون در دسته‌‌بندی‌های غیرخطی

به همین خاطر چیزی نگذشت که در سال ۱۹۶۰ Adaptive Linear Neuron یا adaline توسط Widrow and Hoff معرفی شد. این دو نفر گفتند که تابع پله‌ای (step function) از لحاظ ریاضی مشکلات زیادی برای یادگیری ایجاد می‌کند (یه اشتباه کوچک کنیم یهو از صفر میپره به ۱ و برعکس) بخاطر همین گفتند که تابع f رو تابع همانی (identity) در نظر بگیریم (تابع همانی هرچی به عنوان ورودی بگیرد همان را به عنوان خروجی مید‌هد).

در این صورت مقدار خروجی پرسپترون مقداری پیوسته خواهد شد. در نتیجه، برخلاف تابع پله‌ای (step function) که مشتق‌پذیر نبود در این اینجا تابع ما هم مشتق‌پذیر (به طور دقیق‌تر دیفرانسیل‌پذیر) خواهد شد و امکان استفاده از الگوریتم‌های بهینه‌سازی (optimization) که در حساب دیفرانسیل مطرح شده بود را میداد .

در واقع چیزی که آقایان Widrow & Hoff& Rosenblatt به دست آوردند یک حالتی از رگرسیون خطی (linear regression) بود ولی اون چیزی که بیشتر از همه آنها را به وجد می‌آورد ایده Connectionism بود که میگفت:

Networks of such simple computational units can be vastly more powerful and solve the hard problems of AI

این خوشحالی زیاد طول نکشید و تو سال ۱۹۶۹ دو نفر به نام‌های Marvin Minsky و Seymour Papert کتابی رو منتشر کردند که کاملا پرسپترون‌ها را زیر سوال می‌برد. یکی از انتقادات اصلی که در کتاب مطرح شده بود این بود که پرسپترون‌ها قادر به یادگیری تابع XOR یا به طور کلی‌تر مدل‌های غیرخطی نیستند.

۲) مدل‌های خطی و غیرخطی

برای اینکه مفهوم تابع غیرخطی رو درک کنیم بیایید با یک مثال جلو بریم. فرض کنید تابع XOR رو داریم که اگر این تابع را در دو بعد رسم کنیم به صورت زیر خواهد بود:

تابع Xor در دستگاه کارتزین
تابع xor در دستگاه کارتزین

فرض کنید یک تابع خطی \(f\) میخواهیم بنویسیم که دایره و ضربدر‌ها رو به دو قسمت تقسیم کند (یعنی یک خط بکشیم که یک طرفش دایره‌ها باشند و یک طرفش ضربدرها).  چون مدل ما خطی است در معادله خط \(y = wx+b\) باید مقادیر مناسب برای \(w، b\) پیدا کنیم.

همانطور که در بالا مشاهده می‌کنید ما نمیتونیم همچین مقادیری رو پیدا کنیم که در دایره‌ها و ضربدر‌ها (صفر و یک) را با استفاده از یک خط دسته‌بندی کند. بخاطر همین مجبور هستیم از یک تابع غیرخطی استفاده میکنیم که قدرت بیشتری به ما بدهد. همان معادله خط (پرسپترون) \(xW+b\) رو در نظر بگیرید. فرض کنید مقادیر \(x, W, b\) به صورت زیر است:

\(x_1= \begin{bmatrix} 0 & 0\\ 0 & 1\\ 1 & 0\\ 1 & 1 \end{bmatrix}, W_1 = \begin{bmatrix} 1 & 1\\ 1 & 1 \end{bmatrix}, b_1 = \begin{bmatrix} 0\\ -1 \end{bmatrix}\)

در نتیجه حاصل عبارت بالا به صورت زیر خواهد شد:

\(x_1W_1+b_1 = \begin{bmatrix} 0 & -1\\ 1 & 0\\ 1 & 0\\ 2 & 1 \end{bmatrix}\)

اگر حاصل عبارت بالا را از یک تابع غیرخطی خیلی ساده مثل \(f = max(0,z)\) عبور بدهیم نتیجه چیزی شبیه زیر خواهد شد:

\(max(0, \begin{bmatrix} 0 & -1\\ 1 & 0\\ 1 & 0\\ 2 & 1 \end{bmatrix}) = \begin{bmatrix} 0 & 0\\ 1 & 0\\ 1 & 0\\ 2 & 1 \end{bmatrix}\)

خب بیایید یک بار دیگه فرآیند بالا رو تکرار کنیم یعنی حالا این دفعه خروجی مرحله قبل به عنوان ورودی یک معادله خط دیگر با پارامترهای جدید بدهیم:

\(x_2= \begin{bmatrix} 0 & 0\\ 1 & 0\\ 1 & 0\\ 2 & 1 \end{bmatrix}, W_2 = \begin{bmatrix} 1 & -2 \end{bmatrix}, b_2 = [0]\)

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

\(x_2W_2+b_2 = \begin{bmatrix} 0\\ 1\\ 1\\ 0 \end{bmatrix}\)

همانطور که میبینید به چیزی که میخواستیم رسیدیم و توانستیم معادله XOR را بدست بیاریم. در واقع ما تونستیم با استفاده از یک تابع غیرخطی مثل \(f = max(0,z)\) معادله XOR را حل کنیم.

واضح است در صورتی که ما در مثال بالا از توابع غیرخطی استفاده نمیکردیم مانند این بود که تمام مقادیر \(W\) ها را در یکدیگر ضرب می‌کردیم (به طور دقیق‌تر، ترکیب چندتا تابع خطی یک تابع خطی است):

\(W_1*W_2*x = W_3x\)

در نتیجه برای اینکه قدرت تمایز بین نمونه‌های مختلف (مانند مثال بالا) بدیم مجبوریم از توابع غیرخطی استفاده کنیم.

non-linear function example
مثالی از یک تابع غیرخطی

در واقع Marvin Minsky و Seymour Papert نشان دادند ۱)  با مدل پرسپترون امکان پیاده‌سازی مدل‌های ساده ریاضی مثل XOR که غیرخطی هستند وجود ندارد ۲) نه تنها با یک پرسپترون امکانش نیست بلکه با چندین لایه پرسپترون هم امکانپذیر نیست  ۳) ایراد دیگری که مطرح کردند این بود که  وقتی چندلایه از پرسپترون‌ها داریم چگونه می‌توانیم یادگیری را انجام بدهیم و کتابشون اینقدر انتقادی بود که باعث شد که اصلاحا AI Winter شروع بشه و تا چندسالی کسی سراغ نورون و پرسپترون اینجور چیزا نره!

تا اینکه در سال ۱۹۸۶ Rumelhart , Hinton و Williams پس انتشار (backpropagation) را ارائه کردند (در واقع اون چیزی که Rosenblatt هم معرفی کرده بود یه جورایی backprobagation بود ولی مدل خیلی ساده‌اش! اون چیزی که امروز به عنوان backpropagation تو کتاب‌ها داریم  توسط این سه نفر به طور رسمی معرفی شده).

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

۳) شبکه عصبی پیشرو

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

\(f^*(x) = f^n(…f^2(f^1(x)))\)

در شکل پایین یک نمونه شبکه عصبی پیشرو (feedforward) نشان داده شده است. هر دایره در این شکل یک نورون است که پیکان‌های واردشوند و خارج‌شونده از آن به ترتیب ورودی و خروجی نورون را نمایش می‌دهند. به هر پیکان یک وزن اختصاص یافته است که میزان اهمیت آن پیکان را نشان می‌دهد (وزن‌ها در شکل نمایش داده نشده است). نورون‌ها در لایه‌های پشت‌‌سرهم چیده می‌شوند و جریان اطلاعات در شبکه را مشخص می‌کنند. پایین‌ترین لایه، هیچ پیکان واردشونده‌ای ندارد و به عنوان ورودی (input) شبکه در نظر گرفته می‌شود. از طرف دیگر، بالاترین لایه، هیچ پیکان خارج‌شونده‌ای ندارد و خروجی (output) شبکه نامیده می‌شود. به سایر لایه‌ها اصطلاحا لایه مخفی (hidden) اطلاق می‌شود. علامت سیگمویید (∫) که داخل نورون‌های لایه‌های میانی دیده می‌شود، همان تابع غیرخطی \(f\) است که در بالا به آن اشاره کردیم. این تابع روی مقدار نورون اعمال می‌شود. در این شکل، هر نورون به تمام نورون‌های لایه بعد متصل شده است که به همین دلیل به هر کدام از لایه‌های میانی تماما متصل (fully connected) یا لایه آفین (affine) گفته می‌شود.

هر لایه در شبکه را می‌توان به صورت یک بردار در نظر گرفت. به عنوان مثال در شکل بالا، لایه‌ی ورودی که با رنگ سبز مشخص شده است یک بردار ۴بعدی (\(x\)) را نشان می‌دهد. لایه بالاتر از آن یک بردار ۶بعدی (\(h_1\))، لایه بعدی یک بردار ۵بعدی (\(h_2\)) و در نهایت یک بردار سه بعدی خروجی \(y\) خواهیم داشت.

لایه‌ی تماما متصل (لایه‌های میانی) ضرب ماتریسی \(h=xW\) را پیاده‌سازی می‌کند که در آن وزن متصل از نورون \(i\) در سطر ورودی به \(j\)امین نورون در خروجی با \(W[i,j]\) نشان داده می‌شود. به عبارت دیگه هر دایره با دایره بالایی‌اش با یک وزن \(W_{i,j}\) متصل شده است. بردار حاصل \(h\)، از یک تابع غیرخطی \(g\) عبور داده می‌شوند و به لایه‌ی بعدی فرستاده می‌شوند و این کار برای لایه بعدی تکرار می‌شود.

ساده‌ترین نوع شبکه همانطور که در بالا دیدیم پرسپترون نامیده می‌شود. این شبکه تنها یک لایه دارد و می‌توان را به صورت یک مدل خطی نوشت:

\(NN_{perceptron}(x) = xW + b\)
\(x \in R^{d_{in}}, W \in R^{d_{in}*d_{out}}, b \in R^{d_{out}}\)

که در آن \(W\) ماتریس وزن‌ها و \(b\) عبارت بایاس (bias) گفته می‌شود. عبارت بایاس چیه؟ همانطور که می‌دونید ما معادله خط رو به صورت \(ax+b\) می‌نویسیم که \(a\) شیب خط  و \(b\) عرض از مبدارا مشخص میکردند. پرسپترون همم عملا یک معادله خط را نشان می‌دهد! در معادله خط \(b\) به چه دردی میخورد؟

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

\(NN_{MLP1}(x) = g(xW^1 + b^1)W^2 + b^2\)
\(x \in R^{d_{in}}, W^1 \in R^{d_{in}*d_1}, W^2 \in R^{d_1*d_2}, b^1 \in R^{d_1}, b^2 \in R^{d_2}\)

در این عبارت \(W^1\)  و \(b^1\) وزن و بایاس برای تبدیل خطی در مرحله (لایه) اول، \(g\) یک تابع غیرخطی که به صورت عنصر-محور (elment wise) اعمال می‌شود و \(W^2\) و \(b^2\) وزن و عبارت بایاس برای دومین تبدیل خطی هستند.

اگر عبارت بالا را بشکنیم، در واقع \(xW^1+b^1\) یک تبدیل خطی از ورودی \(x\) با ابعاد \(d_{in}\) به \(d_1\) است که تابع \(g\) روی هریک از ابعاد \(d_1\) اعمال می‌شود. نتیجه حاصل به کمک ماتریس \(W^2\) و عبارت بایاس \(b^2\) تبدیل خطی دوم را انجام می‌دهند و یک بردار خروجی با ابعاد \(d_2\) را ایجاد خواهند کرد.

همچنین ما می‌توانیم یک لایه دیگر اضافه کنیم که نتیجه آن یک شبکه چندلایه با پرسپترون با دو لایه مخفی خواهد بود:

\(NN_{MLP2}(x) = (g^2(g1(xW^1+b^1)W^2+b^2))W^3\)

این عبارت را شاید بتوان به صورت تمیزتر با کمک متغیرهای کمکی به صورت زیر نوشت:

\(NN_{MLP2}(x) = y\)
\(h^1 = g^1(xW^1+b^1)\)
\(h^2 = g^2(h^1W^2+b^2)\)
\(y = h^2W^3\)

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

همچنین در بعضی موارد،‌ مانند لایه‌ی آخر در مثال بالا، بردار بایاس با ۰ جایگزین می‌شود. سوال:  آیا در شبکه‌های چندلایه (مثلا ۲۰ لایه)، وجود عبارات بایاس ضرروی است؟ یعنی میشه در یک شبکه با ۲۰ لایه تمام عبارت بایاس رو صفر در نظر گرفت؟ جوابش با خودتون 🙂

۴) انواع توابع غیرخطی

تابع غیرخطی که در بالا به آن اشاره کردیم در حوزه شبکه‌های عصبی به اسم تابع فعالیت (activation function) شناخته می‌شود و میتواند اشکال مختلفی داشته باشد. در حال حاضر یک تئوری قوی برای اینکه از چه نوع تابع غیرخطی استفاده کنیم وجود ندارد و انتخاب تابع غیرخطی مناسب اغلب به صورت تجربی حاصل می‌شود. در ادامه به مرور برخی از توابع غیرخطی متداول در کارهای گذشته مثل: سیگمویید(sigmoid)، تانژانت هیپربولیک (tanh) و یکسوساز (relu) می‌پردازیم:

سیگمویید: تابع فعالیت سیگمویید \(\sigma (x) = \frac{1}{1+e^{-x}}\)، که به آن تابع لجستیک (logistic function) هم اطلاق می‌شود، یک تابع S-شکل است که هر درایه از بردار \(x\) را بین [0,1] تبدیل می‌کند. از شروع شبکه‌های عصبی، تابع سیگمویید یکی از توابع غیرخطی استاندارد در این حوزه بوده است اما در حال حاضر استفاده از این تابع برای لایه‌های داخلی منسوخ شده و اغلب از توابع زیر که دارای عملکرد بهتری هستند استفاده می‌شود.

تانژانت هیپربولیک: تابع فعالیت تانژانت هیپربولیک \(tanh (x) = \frac{e^{2x}-1}{e^{2x}+1}\)، یک تابع S-شکل است که مقادیر بردار \(x\) را به بازه [-1,1] تبدیل می‌کند.

یکسوساز: تابع فعالیت یکسوساز، که به آن یکسوساز خطی واحد (Rectified linear unit) هم اطلاق می‌شود، یک تابع فعالیت بسیار ساده که کار با آن بسیار راحت است و در اغلب موارد نتایج خوبی تولید می‌کند. این تابع هر مقدار x<0 را به 0 تبدیل می‌کند. علیرغم سادگی، این تابع در بسیار از کارها به خوبی عمل می‌کند.

\(ReLU(x) = \left\{\begin{matrix} 0 & x < 0 \\ x & otherwise \end{matrix}\right.\)

برخی از توابع غیرخطی مهم

۵) قدرت شبکه‌های فیدفوروارد

در پژوهش‌های پیشین نشان‌ داده شده است که شبکه‌های عصبی دارای پتانسیل محاسباتی بسیار بالایی هستند. بطوریکه، با تعداد نورون‌های کافی، یک تابع غیرخطی و تنظیم درست وزن‌های شبکه می‌توان طیف وسیعی از توابع ریاضی را تقریب زد و اصطلاحا به آنها Universal approximators گفته میشود.  یعنی چی؟ یعنی اگر یک شبکه عصبی پیشرو داشته باشیم و به تعداد کافی نورون داشته باشد و بتونیم وزن‌های مناسبی برای شبکه پیدا کنیم آنگاه می‌تونیم طیف وسیعی از توابع ریاضی رو تقریب بزنیم.

یادآوری: تقریب یعنی با درصدی از خطا به نتیجه‌ای که تابع اصلی به ما می‌دهد برسیم. حالا شاید بپرسید این تقریب زدن به چه دردی میخورد؟ بسیاری از مسائل ریاضی دارای پیچیدگی از مرتبه نمایی یا بیشتر است (اصلاحا در کلاس NP-Hard هستند). مثلا مساله کوله‌پشتی ۰-۱ یا فروشنده دوره‌گرد رو بخاطر بیارید. در حال حاضر الگوریتمی که بتوان این مسائل را در زمان چندجمله‌ای حل کرد وجود ندارد ولی با کمک یک الگوریتم تقریبی مناسب می‌توان جوابی نزدیک به جواب بهینه (optimal) پیدا کرد.

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

به عبارت دیگه ما می‌تونیم یک شبکه MLP1 داشته باشیم که ۱۰۰ نورون داشته باشه و تسک مورد نظر مارا حل کند ولی همین شبکه MLP1 را میشه به یک شبکه MLP2 تبدیل کرد  (MLP با دولایه مخفی) که لایه اول ۱۱ تا نورون و لایه دوم ۹ نورون داشته باشد و همون دقتی که MLP1 داشتیم به دست بیاوریم. در واقع با ۱/۵ تعداد نورون‌ها دقتی مشابه دست می‌اوریم و علت هم همین است که اغلب از شبکه‌های عمیق استفاده می‌شود.

۶) متفرقه

همانطور که دیدیم خروجی یک شبکه عصبی یک بردار \(d_{out}\) بعدی است. در مواردی که \(d_{out}=1\) است، خروجی شبکه یک مقدار عددی است. این نوع شبکه‌ها‌ می‌توانند برای مسائل رگرسیون (یا امتیازدهی) یا طبقه‌بندی دودویی مورد استفاده قرار گیرند. شبکه‌هایی با \(d_{out}=k>1\) می‌توانند برای مسائل دسته‌بندی (classification) k-تایی، مورد استفاده قرار گیرند.

ماتریس‌ها و عبارت‌های بایاس که برای تعریف تبدیل خطی از آن استفاده می‌کنیم پارامترهای شبکه نامیده می‌شوند.  معمولا مجموعه‌ پارامترهای شبکه را با \(\theta\) نمایش می‌دهیم.

در این قسمت تنها به تئوری شبکه‌های عصبی پیشرو پرداختیم در صورتی که دوست دارید با پیاده‌سازی این شبکه‌ها آشنا بشید می‌تونید اینجا سر بزنید.

منتشر شده در یادگیری عمیقیادگیری ماشین

یک دیدگاه

  1. hosein hosein

    سلام- اگر در هنگام تعلیم یک شبکه چند لایه پرسپترون، مقادیر اولیه وزن ها را برابر مقادیر تصادفی بزرگ انتخاب کنیم ، مقادیر خروجی نورون ها و رویه های تصمیم نورون ها در آغاز تعلیم در چه شرایطی قرار خواهند داشت؟
    و روند تعلیم شبکه و همگرایی آن نسبت به موقعی که وزن های اولیه را مقادیر تصادفی کوچک انتخاب کنیم، چه تفاوتی خواهد داشت.
    لطفا کمی توضیح دهید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *