شبکه عصبی mlp
شبکه عصبی MLP یا پرسپتون چند لایه، یکی از سادهترین شبکههای عصبی است که برای اولین بار توسط فرانک روزنبلات معرفی شد. در این پست به تشریح این شبکه پرداخته و نحوه آموزش دیدن این شبکه با استفاده از الگوریتم پس انتشار خطا یا backpropagation را با یک مثال عددی آموزش خواهم داد. با من همراه باشید…
شبکه عصبی MLP چیست؟
شبکه عصبی MLP یا پرسپترون چندلایه، یکی از سادهترین و پرکاربردترین انواع شبکههای عصبی است که برای انجام وظایفی مانند طبقهبندی و رگرسیون بهکار میرود. این شبکه از سه بخش اصلی تشکیل شده است: لایه ورودی (Input Layer)، لایههای پنهان (Hidden Layers) و لایه خروجی (Output Layer). هسته اصلی MLP نورونهای مصنوعی هستند که هرکدام از طریق وزنها و بایاسها با نورونهای لایههای دیگر مرتبط هستند. با استفاده از توابع فعالسازی غیرخطی، MLP قادر به مدلسازی مسائل پیچیده و غیرخطی است و کاربردهای متنوعی مانند تشخیص الگو، تحلیل دادهها و پردازش تصویر دارد.
یادآوری یادگیری نورون مصنوعی
قبل از اینکه وارد بحث شبکه عصبی mlp شویم، مطالب دو جلسه قبل را مرور کوتاهی خواهیم کرد. در دو جلسه قبل ساختار نورون مصنوعی و الگوریتم یادگیری نورون مصنوعی را بررسی کردیم. گفتیم که یک نورون مصنوعی از ورودیها، خروجیها، وزنها، بایاسها و تابع فعالساز تشکیل شده است. وزنها و بایاسها به صورت تصادفی مقداردهی میشوند.
ورودیها در وزنها ضرب میشوند، مقادیر به دست آمده و بایاس با هم جمع میشوند. نتیجه از تابع فعالساز عبور میکند و خروجی نورون را تشکیل میدهد. اما گفتیم که با مقداردهی وزنها به صورت تصادفی، نتیجه معمولا افتضاح است! بنابراین نیاز است که وزنها تغییر کنند. تغییر وزنها باید به شکلی انجام شود که خروجیهای نورون به خروجیهای واقعی نزدیک باشند.
به فرآیند تغییر وزنهای نورون برای رسیدن به خروجی مطلوب، یادگیری نورون گفته میشود. گفتیم که برای بررسی عملکرد نورون از یک تابع اتلاف استفاده میکنیم. هدف از یادگیری نورون این است که مقدار اتلاف صفر شود. یا حداقل نزدیک به صفر شود! برای این کار از یک الگوریتم بهینهسازی استفاده میشود. وظیفه الگوریتم بهینهسازی این است که وزنهایی که تابع اتلاف را مینیمم میکنند را پیدا کند. فرآیند یادگیری شبکه عصبی در شکل زیر نشان داده شده است.
شبکه عصبی پرسپترون
قبل از پیدایش شبکه عصبی mlp ، در سال 1958 فرانک روزنبلات یک شبکه عصبی به نام پرسپترون ابداع کرد. روزنبلات یک لایهای از نورونها را تشکیل داد و شبکه حاصل را پرسپترون نامید. اما پرسپترون روزنبلات نیز مشکلات فراوانی داشت. مینسکی و پپرت در سال 1969 کتابی به نام پرسپترون نوشتند. آنها تمامی تواناییها و مشکلات پرسپترون را در این کتاب مورد بررسی قرار دادن. مینسکی و پپرت در کتاب خود ثابت کردند که پرسپترون فقط مسائلی را میتواند حل کند که به صورت خطی تفکیکپذیر باشند. همین امر باعث شد تا محققان از حوزه شبکه عصبی نا امید شوند! ساختار پرسپترون در شکل زیر نشان داده شده است:
مشاهده میکنیدکه وزنها به صورت wi,j تغییر داده شدهاند. wi,j یعنی وزن مربوط به اتصال ورودی i به نورون j . پس i شماره ورودی و j شماره نورون را نشان میدهد. با این تغییر، روابطی که برای نورون گفتیم نیز به شکل زیر تغییر خواهند کرد:
اگر تمایل دارید تاریخچه دقیقتری از پرسپترون بدانید به پست «پرسپترون چیست» مراجعه کنید. در این پست ما مطالب جالبی را درباره تاریخچه پرسپترون تهیه کردهایم. پیشنهاد میکنیم حتما این پست را مطالعه کنید.
حل مسئله xor با شبکه عصبی mlp
در جلسه قبل گفتیم که Minsky و Papert کتابی به نام perceptrons نوشتند. آنها در این کتاب ضعفهای جدی پرسپترون را برشمردند. آنها بیان کردند که پرسپترون قادر به حل برخی مسائل پیش پا افتاده نیست. یکی از این مسائل، مسئله XOR است. پرسپترون قادر به حل مسئله XOR نیست. زیرا آنها فقط میتوانند مسائلی که به صورت خطی تفکیکپذیر هستند را حل کنند. و مسئله XOR خطی نیست! به شکل زیر دقت کنید:
نمیتوان با یک خط مربعها را از مثلثها جدا کرد، درست است؟ بنابراین پرسپترون نمیتواند این مسئله را حل کند. با این حال بعدها مشخص شد که با چسباندن چند پرسپترون پشت هم، یکسری از مسائل قابل حل خواهند شد. از جمله مسئله XOR. به شبکهای که از چسباندن چند پرسپترون به هم ساخته میشود یک پرسپترون چند لایه ، multilayer perceptron یا به اختصار mlp گفته میشود. مثلا شبکه mlp زیر میتواند مسئله XOR را حل کند:
اتصالات خاکستری وزن یک دارند. اما از کجا بفهمیم که چنین شبکهای مسئله XOR را حل میکند. خب بهتر است قلم و کاغذ بردارید و محاسبه کنید!
مشاهده میکنید که خروجی نشان میدهد که شبکه عصبی mlp که ما تعریف کردیم، درواقع یک بلوک XOR است. نکته جالب این است که Y1، یک گیت and و Y2 یک گیت or است. (اگر متوجه نشدید که چرا اینگونه است به خروجی های آنها دقت کنید.) یعنی دو نورون Y1 و Y2، ورودیها را به فضای جدیدی بردند، طوری که تفکیک دادهها راحت است. یعنی شکل 1 به صورت زیر تغییر میکند:
مشاهده میکنید که نورونهای Y1 و Y2 ورودیها را طوری تغییر دادند که مسئله به صورت خطی قابل حل است! اما این وزنهایی که ما برای شبکه عصبی mlp درنظر گرفتیم از کجا آمدند؟ شبکه عصبی mlp که طراحی میکنیم، خودش باید این وزنها را یاد بگیرد. فرآیند یادگیری چگونه است؟ پاسخ را در بخشهای بعدی خواهید یافت. با هوسم همراه باشید …
جواب در متن
شبکه عصبی پرسپترون چند لایه
در بخش قبل نحوه حل مسئله XOR با شبکه عصبی mlp را بررسی کردیم. در این بخش میخواهیم نحوه نمایش یک شبکه عصبی پرسپترون چندلایه را نشان دهیم. سپس رابطه میان شبکه عصبی mlp و شبکه عصبی عمیق را خواهیم گفت. همچنین چند اصطلاحی که در این حوزه وجود دارد را معرفی خواهیم کرد.
گفتیم یک شبکه عصبی پرسپترون چندلایه از پشت هم قرار دادن چند پرسپترون حاصل خواهد شد. یعنی ما در چنین شبکهای چند لایه از نورونها را خواهیم داشت. شبکه زیر یک نمونه از یک شبکه عصبی پرسپترون چند لایه است:
مشاهده میکنید که یک لایه خروجی و یک لایه ورودی داریم. همچنین دو لایه از نورونها بین لایههای ورودی و خروجی وجود دارد. به لایههایی که بین لایه ورودی و خروجی قرار دارند، لایه پنهان (Hidden Layer) گفته میشود. معمولا به لایههایی که نزدیک به لایه ورودی باشند، لایههای پایین گفته میشود. همچنین به لایههایی که نزدیک به لایه خروجی هستند، لایههای بالا گفته میشود. به جز خروجی، هر لایه یک بایاس دارد.
شبکهای که تعداد زیادی لایه پنهان داشته باشد شبکه عصبی عمیق (Deep Neural Network) گفته میشود. در دهه 90 میلادی به شبکههایی که بیش از دو نورون داشت، شبکه عصبی عمیق گفته میشد. اما امروزه شبکههای عصبی وجود دارند که صدها لایه دارند. بنابراین برای واژه عمیق تعریف دقیقی وجود ندارد. امروزه معمولا همه شبکههای عصبی را عمیق میخوانند، حتی آنهایی که عمیق نیستند!
آموزش شبکه عصبی پرسپترون چند لایه
یکی از مهمترین ویژگیهایی که یک شبکه عصبی باید داشته باشد، توانایی یادگیری است. یعنی بر اساس یک الگوریتمِ یادگیری مشخص، وزنها تغییر کنند. تا آنجا که میزان اتلاف شبکه مینیمم شود. ما فرآیند یادگیری را برای یک نورون مصنوعی در جلسه یک توضیح دادیم. بیایید این فرآیند را مرور کنیم. گفتیم که برای آموزش یک نورون مصنوعی یک تابع اتلاف و یک الگوریتم بهینهسازی نیاز داریم. الگوریتم بهینه سازی را گرادیان کاهشی و تابع اتلاف را MSE در نظر گرفتیم. آنگاه گفتیم که در یک فرآیند تکراری و مطابق با معادلات زیر، وزنها تغییر میکنند. تکرار تا زمانی ادامه مییابد که تابع اتلاف مینیمم شود:
ما در جلسه اول مثالی حل کردیم. در این مثال فرآیندی که در معادله بالا آورده شده را با انتخاب نرخ یادگیری مناسب و وزندهی اولیه انجام دادیم. دیدیم که اگر این فرآیند را ادامه دهیم، به نتیجه مطلوبمان که یادگیری نورون است خواهیم رسید. اما آیا همین فرآیند را میتوانیم برای یک شبکه عصبی mlp نیز انجام دهیم؟ اگر کمی دقت کنید متوجه خواهید شد که برای لایه آخر به راحتی میتوانیم از معادله 1 برای آموزش وزنها استفاده کنیم. اما برای لایههای قبلتر چه؟ آیا وزن آنها را هم به همین شکل میتوان آموزش داد؟ اگر جوابتان بله است، بگویید ببینم، مقدار yt یا برچسب برای لایههای قبلتر چه هست؟ مگر برای لایههای میانی هم برچسب داریم؟ پس نمیتوان با این فرآیند یک شبکه عصبی mlp را آموزش داد. پس چاره چیست؟ پاسخ این سوال در بخش بعدی آورده شده است.
الگوریتم پس انتشار خطا
سالها محققان تقلا میکردند که روشی برای آموزش شبکه عصبی mlp پیدا کنند. تا اینکه در سال 1986، David Rumelhart ، Geoffrey Hinton و Ronald Williams مقالهای منتشر کردند که راه حلی برای آموزش شبکه عصبی پرسپترون چند لایه ارائه کرده بود. آنها در مقاله خود الگوریتم یادگیری پس انتشار خطا ( backpropagation ) را معرفی کردند. این الگوریتم امروزه کماکان برای آموزش شبکههای عصبی چند لایه مورد استفاده قرار میگیرد. اما الگوریتم پس انتشار خطا چیست؟ اگر بخواهم ساده بگویم، پس انتشار خطا همان الگوریتم گرادیان کاهشی است. با این تفاوت که تکنیکی بهینه برای محاسبه اتوماتیک گرادیان دارد.
الگوریتم پس انتشار خطا در دو مسیر forward و backward در شبکه حرکت میکند. و میتواند مقدار گرادیان خطا را نسبت به هر پارامترِ شبکه (هر وزن یا بایاس محاسبه کند). به این ترتیب الگوریتم پس انتشار خطا میتواند تعیین کند که مقدار هر وزن در یک شبکه عصبی mlp چقدر باید تغییر کند. و به این ترتیب مسئله آموزش وزنهای میانی در mlp چند لایه حل میشود.
عملکرد الگوریتم backpropagation به صورت خلاصه در ادامه آورده شده است. این الگوریتم ابتدا در مسیر forward یک پیشبینی انجام میدهد و خطا را محاسبه میکند. سپس مقدار خطا در جهت backward حرکت میکند. برای هر اتصال یک گرادیانِ خطا محاسبه میشود. سپس مقدار هر وزن در جهت کاهش خطا تغییر میکنند.
نکته در سال 1986 که این مقاله منتشر شد، از تابع فعالسازی پله استفاده میشد. و خبری از توابع فعالسازی که امروزه استفاده میشوند، مثل ReLU، نبود. برای اینکه الگوریتم پس انتشار خطا به درستی کار کند نیاز بود تابع فعالسازی مشتقپذیر باشد. از این رو از توابع فعالسازی مانند سیگموید و … استفاده شد.اگر هنوز الگوریتم پس انتشار خطا برایتان مبهم است اصلا نگران نباشید. در بخش بعد یک مثال عددی آوردیم که به صورت کامل فرآیند پس انتشار نشان داده شده است. پس یک قلم و کاغذ بردارید و آماده باشید…
مثال عددی از الگوریتم پس انتشار خطا
در این بخش برای فهم بهتر الگوریتم پس انتشار خطا، میخواهیم یک مثال حل کنیم. در اینجا ما یک شبکه عصبی mlp واقعی را نیاوردیم. بلکه برای اینکه مسئله کمی سادهتر شود یک گراف آوردیم. این گراف شامل گرههایی است که یک عمل خاص را انجام میدهد.
همانطور که مشاهده میکنید، این گراف 5 ورودی دارد. این ورودیها منجر به خروجی yp میشوند. این خروجی منجر به اتلاف E میشود. حالا میخواهیم بدانیم مقدار j چقدر باید تغییر کند که اتلاف مینیمم شود. طبق الگوریتم گرادیان کاهشی داریم:
خب ما که مقدار E/∂j∂ را نداریم. آن را چطور محاسبه کنیم. راه حل این مسئله استفاده از مشتق زنجیرهای است. یعنی:
حالا تک تک این مشتقها را محاسبه کرده و نتیجه را به دست میآوریم. محاسبات این مشتقها به صورت زیر است:
سپس نتایج به دست آمده را طبق معادله 3 در هم ضرب میکنیم. درواقع میتوانیم بگوییم که رفتار هر گره در مسیر backward متفاوت است. در واقع میتوان گفت که گراف بالا در مسیر backward به شکل زیر تغییر میکند:
به همین ترتیب میتوانیم مقدار تغییر بقیه پارامترها را هم مشخص کنیم.
منابع آموزش یادگیری عمیق
در فهرست زیر، تعدادی از منابع خوب آموزش یادگیری عمیق را معرفی کردهایم.
- کتاب Hands on Machine Learning
- کتاب Pattern Recognition and Machine Learning
- کتاب Neural Networks for Pattern Recognition
- کتاب شبکه عصبی Haykin
در این پست شبکه عصبی mlp را معرفی کردیم. الگوریتم پس انتشار خطا را بررسی کرده و یک مثال عددی آوردیم. امیدوارم این آموزش مورد توجه شما قرار گرفته باشد. نظرات و سوالات خود را پایین 👇 برایمان کامنت کنید. حتما سوالات شما پاسخ داده خواهد شد.
مطالب زیر را حتما مطالعه کنید
شبکه ترنسفورمر
مدل MobileLLM
یادگیری عمیق چیست
آموزش یادگیری عمیق رایگان
شبکه عصبی کانولوشن
آیا GPU من برای یادگیری عمیق مناسب است؟
31 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
سلام وقت بخیر. ممنون از توضیحات عالی و کامل شما. وقتی که پرسپترون چندلایه در محیط متلب اجرا شد ایا میتوان مشخص کرد که کدام یک از نتایج به دست امده مربوط به صحت سنجی یا اموزش بوده است؟
سلام
ما با ابزارهای شبکه عصبی در متلب آشنایی نداریم. این آموزش متمرکز بر تئوری شبکه عصبی MLP هست.
موفق باشید 🌹🙏
سلام و عرض خدا قوت
لطفا بفرمایید در حل مسله XOR از چه تابع فعال سازی استفاده شده
سپاسگزارم
ضمنا از همه محتوای اموزشی شما استفاده کردم و یک نسخه بک اپ گرفتم
بسیار عالی و مناسب است
سعی دارم با درک این مطالب وارد دوره های بالاتر شما شوم
سلام و عرض ادب
از تابع فعال ساز step: اگر مقدار بزرگتر از صفر بود یک اگر کمتر مساوی صفر بود صفر.
براتون آرزوی بهترین رخدادها رو دارم. شما عالی هستید.
salam
besiar ali va kholaseh tozih dadid moteskakeram
عالی دمتون گرم ممنون
با سلام
میخواستم بدونم در حل مسئله xor از چه تابع فعالسازی استفاده کردید
ممنون
آموزش و نكاتي كه توي اين دوره گفتيد عالي بود
خدا خيرتون بده
و ببخشید میشه لطفا یه مثال Mlp برای الگوریتم( و نه گراف) پس انتشار خطا معرفی کنید و توضیح بدید؟
سلام. چقدر روان و سلیس بیان کرده بودید؛ دست مریزاد!
میشه لطفا حل یک معادله دیفرانسیل ، به کمک شبکه مصنوعی رو هم توضیح بدید؟
خیلی ممنونم از این آموزش
میشه جواب تمرین 2 را بفرمایید؟
ضرب در صفر میشن؟
سلام
جواب تمرین 2:
جواب علامت سوال بالای ab/x و علامت سوال پایینی cd/x می شود.
سلام
خیلی خیلی ممنون بابت این آموزش بسیار مفید
فقط توی جدول ستون outputسطر سوم یکی از یک ها باید صفر باشه، البته در جواب نهایی فرقی نداره,
ببخشید آخرین صفر سطر سوم از ستون output باید یک باشه
سلام شما به جواب تمرین 2 رسیدین؟؟
سلام . نزدیک یک ماه میشه که فقط دارم همین یه پست رو دوره میکنم و خیلی کمک کرده تشکر میکنم . برخی جزئیات که اشاره کردید رو جایی ندیده بودم و دنبالش بودم . منتهی الان با لایه های مخفی یه مشکل دارم . فرض کنید مثلا 2 لایه مخفی داریم اولی با 4 نورون و دومی با 3 نورون. و هر لایه نورون هاش هر تابع فعالسازی هم که میخوان داشته باشن. مقدار اولیه همه وزن ها 1 هست. خب ورودی های این 4 نورون لایه اول مخفی دقیقا مثل همه . یعنی همه ی ورودی های ما(لایه اول) بعد از ضرب شدن در وزن مربوطشون سیگما میشن و وارد نورون های لایه مخفی میشن . تابع فعالسازی یکسانی هم دارن . در نتیجه خروجی این 4 نورون هم دقیقا مثل هم میشه . حتی اگر با گرادیان کاهشی ادامه بدیم و وزن هارو آپدیت کنیم باز هم در این حالت میبینیم که وزن هایی که لایه های مخفی رو به هم وصل میکنن یا وزن هایی که اخرین لایه مخفی رو به نورون خروجی وصل میکنن همشون عین هم هستن . این طبیعیه ؟ یعنی شبکه عصبی طوریه که این وزن هایی که لایه های مخفی رو به هم وصل میکنن همیشه مقدار یکسان دارند ؟ تشکر.
سلام
از اینکه این آموزش براتون مفید بوده خوشحالیم.
به صورت خیلی کوتاه بگم که خیر، طبیعی نیست. اصولا ما تعداد نورون در هر لایه از شبکه عصبی MLP رو زیاد میکنیم تا بتونیم خروجی متنوع و متفاوتی داشته باشیم. پس، یکسان بودن خروجیها طبیعی نیست.
اما، مشکل از فرضهای شماست. شما شبکه رو در یک حالت غیرطبیعی قرار دادید و خب شبکه هم بهتون خروجی غیرطبیعی داده. ما وزنهای نورونها رو یکسان درنظر نمیگیریم، درحالیکه شما اینجا این وزنها رو برابر با 1 درنظر گرفتید. ما برای وزنها مقادیر تصادفی با توزیع مشخصی درنظر میگیریم که بتونیم به جواب مطلوب برسیم. ضمن اینکه، نمیتونیم هر مقدار تصادفی رو برای وزنها درنظر بگیریم. اتفاقا، مطالعات زیادی در زمینه مقداردهی اولیه بهینه برای وزنها انجام شده.
بسیار متشکرم از اینکه اینقدر به سرعت جواب دادید . عجب . تصور من این بود که وزن ها با توجه به داده های آموزشی خودکار به حالت مناسب تغییر میابند. حالا وزن اولیه هر چیزی میخواد باشه . بسیار عالی تشکر. متوجه شدم .
بسیار عالی .تشکر
مصطفی جان سلام
ممنونم که با راهنمایی خود مرا با این سایت پر محتوا اشنا کردی
سپاس بیکران
خیلی هم خوب موفق باشید
سلام
ممنون از شما برای کامنت 🌹🙏
سلام و درود
بسیار عالی
سلام
سپاس 🌹🙏
سلام خدا قوت ممنون از آموزشهای عالی تون انشا الله که موفق باشید. اگر لطف کنید و عنوان رفرنسها را کامل بصورت نام کتاب و نویسنده اعلام کنید خیلی عالی میشه چون در این زمینه انتشارات تقریبا همنام خیلی هست یافتن مرجعی که مد نظر شما بوده تقریبا امکان نداره.البته بعضیاش که مشخصه مثل کتاب هایکن یا هاگان . . . ممنونم ازتون
سلام سید عزیز،
رفرنسهایی که در آخر پست معرفی کردیم، همراه با لینک هست. روی هرکدوم از رفرنسها که کلیک کنید، به سایت فروش کتاب منتقل میشید. در اونجا میتونید اطلاعات دقیق کتابها رو مشاهده کنید.
موفق باشید 🌹🙏
سلام . بسیار عالی و کامل اگر ممکنه منابع رو ارسال کنید . سپاس
سلام
سپاس. منابع را در لینک زیر قرار دادیم. امیدواریم لذت ببرید 😉
https://howsam.org/machine-learning-books
عالی بود. زیبا و کامل
سپاس 🌹