شبکه عصبی پرسپترون چند لایه و مسائل غیرخطی
شبکه عصبی پرسپترون چندلایه از سه نوع لایه ورودی، پنهان و خروجی تشکیل شده است. شبکه عصبی MLP از قانون یادگیری پس انتشار خطا برای تنظیم وزنهای سیناپسی خود استفاده میکند. از شبکه عصبی MLP میتوان در مسائل طبقه بندی، رگرسیون و مدلسازی استفاده کرد. در این پست میخواهیم با ساختار این شبکه عصبی و نقش هر لایه در حل مسئله را بررسی کنیم.
مباحثی که در این پست بررسی میکنیم:
- مسئله XOR و خواب زمستانی هوش مصنوعی
- مسئله غیرخطی و شبکه عصبی پرسپترون تک لایه
- قضیه کاور
- شبکه عصبی پرسپترون چندلایه
- نقش لایه ها در شبکه عصبی پرسپترون چند لایه
- نقش لایه ورودی در یک شبکه عصبی چندلایه
- نقش لایههای پنهان در یک شبکه عصبی چندلایه
- نقش لایه خروجی
- بررسی یک سری سوالات رایج
مسئله XOR و خواب زمستانی هوش مصنوعی
در سال 1960 شبکه عصبی تک لایه مطرح شد و میشه گفت تحقیقات هوش مصنوعی از اون زمان استارت زده شد. اون زمان بحث ساخت کامپیوترها خیلی داغ بود و از شبکه های عصبی هم میخواستند برای مدلسازی گیتهای منطقی استفاده کنند. پرسپترون تک لایه به راحتی میتوانست گیتهای منطقی مثل AND و OR را مدلسازی کند. ولی وقتی مسئله گیت منطقی XOR مطرح شد دیگه پرسپترون تک لایه نتونست این گیت رو مدل کنه! و زمستان هوش مصنوعی برای تحقیقات در این حوزه شروع شد! باور منتقدین این بود که تحقیقات در زمینه هوش مصنوعی بیش از حد بزرگنمایی شده و همین هم باعث شد بودجه تحقیقاتی این حوزه به شدت کاهش پیدا کند! حدود 20 سال تحقیقات در این حوزه به کندی پیش رفت! چرا که بودجه بسیار کمی به این حوزه اختصاص داده میشد. اما وقتی شبکه عصبی چند لایه مطرح شد ورق برگشت و تحقیقات در این حوزه جان دوباره ای گرفت! و همینطور که میبینید هر سال به طرفداران این حوزه اضافه میشه و بودجه های هنگفتی هم در این زمینه صرف میشه. و با این سرعتی که رو به جلو میره، معلوم نیست تا چند سال آینده تحقیقات در این حوزه تا چه اندازه پیشرفت بکند!
حال برگردیم به مسئله خودمون و ببینیم چرا یک پرسپترون تک لایه گیت منطقی AND و OR رو میتونه مدل بکند ولی XOR رو نه!
همانطور که میدانیم گیتهای منطقی یک سری ورودی منطقی (0,1) دریافت کرده و خروجی 0 یا یک تولید میکنند. جدول صحبت هر سه گیت AND, OR, XOR در زیر نشان داده شده است.
اگر از دید یک مسئله طبقه بندی به این گیتها توجه کنیم، میبنیم که گیت منطقی AND و OR یک مسئله طبقه بندی دو کلاسه هستند که داده های دو گروه رو میشه با یک مرز خطی جدا کرد!
شبکه عصبی پرسپترون تک لایه، به خاطر ساختار تک لایه ای که دارد فقط میتواند یک مسئله خطی را حل کنید. در این مسئله گیتهای منطقی AND, OR را میتوان با یک تک نورون مدل کرد. و میدانیم که هر نورون رابطه یک خط را میتواند مدل کند، یا در فضای های بالاتر یک فوق صفحه را!
حال از آنجا که داده های دو گروه (0 و 1 ها) در گیتهای منطقی AND, OR به صورت خطی از هم جدا می شوند، یک شبکه عصبی تک لایه میتواند این مسائل را راحت حل کند.
مسئله غیرخطی و شبکه عصبی پرسپترون تک لایه
در مسئله XOR داده های دو گروه به صورت خطی از هم تفکیک نمی شوند و از آنجا که پرسپترون تک لایه فقط قادر به حل مسائل خطی هست در حل مسئله غیرخطی XOR ناتوان است!
قضیه کاور
فضیه کاور میگه که اگر همانند شکل زیر یک داده ای در فضای غیرخطی داشته باشیم، میتوانیم با یک تبدیل غیرخطی داده را به فضای خطی نگاشت دهیم و در فضای جدید مسئله را به صورت خطی حلی کنیم. تنها مسئله ای که اینجا مهم است اینه که تبدیل باید غیرخطی باشد.
شبکه عصبی پرسپترون چندلایه
شبکه عصبی پرسپترون چندلایه از رویکردی مانند رویکرد کاور بهره میگیرد و یک مسئله غیرخطی را حل میکند. شبکه عصبی MLP از چندین لایه تشکیل شده است (لایه ورودی، لایه های پنهان و لایه خروجی). لایه ورودی داده را از فضای خطی یا غیرخطی دریافت میکند، در با کمک لایه های پنهان داده را به فضای خطی نگاشت می دهد، و در لایه آخر تصمیم گیری را انجام میدهد.
نقش هر کدام از لایه ها در ساختار شبکه عصبی پرسپترون چند لایه
نقش لایه ورودی در یک شبکه عصبی چندلایه
لایه ورودی داده را دریافت کرده و وارد شبکه عصبی می کند. این لایه فقط گیت ورودی هست و عملیاتی روی داده انجام نمیدهد.
نقش لایههای پنهان در یک شبکه عصبی چندلایه
لایه های پنهان نقش اساسی در حل مسئله دارند. چرا که این لایه ها نقش تبدیل غیرخطی را بازی میکنند و داده را از فضای غیرخطی به فضای خطی منتقل میکنند. به دلیل اینکه در پروسه آموزش شبکه عصبی، خروجی مطلوب لایه های پنهان مشخص نیست، لایه های پنهان شبکه عصبی نامیده میشوند. هر لایه پنهان از تعدادی نورون تشکیل شده است که تعداد آنها توسط کاربر مشخص میشود و محدودیتی برای این نیست!
هر نورون در این لایه ها، ورودیهای لایه ی قبلی را به صورت وزندار باهم ترکیب کرده و از یک تابع فعالی عبور میدهد تا یک ویژگی جدید از روی ترکیب غیرخطی ورودیها ساخته شود. هر نورون در این لایه یک خروجی تولید میکند به عبارتی یک ویژگی میسازد. خروجی تولید شده توسط نورونها در اون لایه کنار هم یک بردار ویژگی تشکیل میدهند که به عنوان ورودی به لایه بعدی داده میشوند.
نقش لایه خروجی
لایه خروجی، کارش تصمیم گیری هست، برای مثال در یک مسئله طبقه بندی این لایه مرز تصمیم گیری را محاسبه میکند. مرزی که این لایه پیدا میکند یک مرز خطی در فضای ویژگی است، که در واقع معادل همان مرز غیرخطی در فضای اصلی هست.
اگر تابع فعال نورونهای لایه پنهان خطی باشه چه اتفاقی میافته؟
خب همانطور که گفتیم لایه پنهان کارش نگاشت داده از فضای غیرخطی به فضای خطی هست. وقتی توابع فعال نورونهای این لایه ها خطی تعیین شوند، در این صورت عملا نگاشتی اتفاق نمی افته، داده از یک فضای غیرخطی به فضای غیرخطی دیگه ای منتقل میشه و لایه آخر نمیتونه مرز مناسبی برای تفکیک داده ها پیدا کند.
آیا میشه تابع فعال لایه خروجی رو خطی در نظر گرفت؟
از آنجا که لایه خروجی کارش تصمیم گیری هست، به عبارت دیگه، خروجی داده ورودی به شبکه در این لایه تولید می شود، برای همین تابع فعال لایه خروجی کاملا بستگی به رنج خروجی دارد و براساس رنج پاسخ مطلوب، یک تابع فعال مناسب برای آن تعریف میکنیم.
برای همین گاهی موارد نیاز هست که تابع فعال خطی در نظر بگیریم و از این بابت از لحاظ یادگیری شبکه عصبی هیچ مشکلی وجود ندارد!
اگر تابع فعال لایه خروجی مناسب تعریف نشود چه اتفاقی میافتد؟
خب اگر تابع فعال مناسبی تعریف نشود شبکه عصبی هیچ وقت قادر به تولید خروجی مورد نظر نخواهد بود و در نتیجه در پروسه آموزش، شبکه یاد نخواهد گرفت!
برای مثال اگر میخواهیم برای تخمین قیمت خونه از شبکه عصبی استفاده کنیم و بیاییم تابع فعال خروجی را tanh در نظر بگیریم، در نتیجه شبکه نهایت خروجی ای که میتواند تولید کند بین [1,1-] خواهد بود و شبکه در پروسه آموزش هیچ وقت خروجی مطلوب تولید نخواهد کرد و در نتیجه هیچ دیدی برای تنظیم وزنهای خود نخواهد داشت. چرا که هر چی تولید بکنه، با خروجی مطلوب متفاوت خواهد بود و خطای زیادی خواهد داشت!
چه تابع فعالی برای لایه های پنهان شبکه عصبی در نظر بگیریم؟
واقعیت اینه که هیچ قانون مشخصی برای این وجود نداره. باید در مسئله خاص خودتون انواع توابع مختلف رو بررسی کنید و ببینید که با چه تابع فعالی به بهترین عملکرد میرسید و از اون استفاده کنید. ولی برخی طبق تجربه به این رسیده اند که تابع فعال tanh میتونه در اکثر موارد انتخاب مناسبی است. من خودم همیشه، در هر مسئله ای به صورت پیش فرض از tanh استفاده میکنم. ولی برای اینکه بتونم عملکرد رو بهبود بدهم مسائل مختلفی رو چک میکنم که یکی از اینها تغییر توابع فعال در لایه های مختلف شبکه عصبی و تاثیر آنها در عملکرد شبکه عصبی را بررسی میکنم.
از اونجا که هر لایه پنهان هدفش سادهسازی مسئله پیچیده است، آیا میتونیم هرچقدر خواستیم لایه پنهان و نورون برای اونها اضافه کنیم؟
باید به این نکته توجه کنیم که هر نورون یا هر لایه ای که به شبکه عصبی اضافه می شود، باعث میشود که پارامترهای بهینه سازی شبکه عصبی (وزنهای سیناپسی) به صورت تصاعدی افزایش پیدا کنند!
یعنی نیاز به داده بسیار زیادی هست که بتوانیم با کمک آنها این پارامترها را تنظیم کنیم. اگه تعداد از یک حدی بالاتر برود فراهم کردن چنین داده ای عملی نیست! از طرفی هر چقدر مدل ساختار پیچیده ای داشته باشد، احتمال overfitting بالایی خواهد داشت! پس بسته به مسئله و داده ای که داریم، بهتره ساختاری تعریف کنیم که اولا قادر به حل مسئله باشه و از طرفی هم دچار overfitting نشود!
در دوره تخصصی پایتورچ به صورت تخصصی به این مباحث می پردازیم!
ما در دوره پایتورچ سه هدف اصلی داریم:
- یادگیری تئوری و ریاضیات شبکه های عصبی و روشهای بهینه سازی
- یادگیری کار با ابزار پایتورچ به صورت تخصصی
- ساخت dataloader ها اختصاصی برای داده های خودمان
- پیادهسازی شبکه های عصبی با ابزار پایتورچ
- انجام پروژه های عملی
دیدگاه ها