درک شبکه های عصبی Feedforward

درک شبکه های عصبی Feedforward

در این بخش، ما در مورد شبکه های عصبی feedforward که به عنوان شبکه های feedforward  عمیق و یا Perceptron چند لایه شناخته شده است یاد خواهیم گرفت. که در واقع اساس بسیاری از شبکه های عصبی مهم که اخیراً مورد استفاده قرار گرفته اند می باشند، مانند شبکه های عصبی Convolutional (که به طور گسترده در برنامه های بینایی کامپیوتری مورد استفاده قرار می گیرند)، شبکه های عصبی مجدد (که به طور گسترده در فهم زبان طبیعی و یادگیری ترتیبی مورد استفاده قرار می گیرند) و غیره. ما سعی خواهیم کرد که مفاهیم مهم را در یک شیوه بصری و تعاملی درک کنیم، بدون اینکه وارد ریاضیات درگیر شویم. اگر علاقه مند به غواصی در یادگیری عمیق هستید، اما زمینه های زیادی در آمار و یادگیری ماشین وجود ندارد، این مقاله نقطه شروع کامل است.

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

 

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

1. درک شبکه عصبی

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

1.1 نورون چیست؟

نورون مصنوعی واحد اصلی یک شبکه عصبی است که در زیر تصویر آن نشان داده شده است.

 

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

1.2 توابع فعال سازی

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

  • Sigmoid

    این تابع ورودی (محور x ) را به مقادیر بین 0 و 1 تبدیل می کند.

     

  • Tanh

    این تابع مشابه sigmoid است اما ورودی را به مقادیر بین -1 و 1 می برد.

  • (Rectified Linear Unit (ReLU

این تابع اجازه می دهد که فقط مقادیر مثبت از طریق آن عبور کنند. مقادیر منفی به صفر می رسند.

توابع دیگر هم مانند تابع پله واحد ، ReLU نشتی، ReLU نویزی ، LU  نمایی و غیره وجود دارند که هر کدام مزایا و معایبی دارند.

1.3 لایه ورودی

این لایه اول یک شبکه عصبی است. که برای ارائه داده های ورودی یا ویژگی های به شبکه استفاده می شود.

1.4 لایه خروجی

این لایه  عملیات پیش بینی را انجام می دهد. در این لایه  از توابع فعال سازی استفاده می کنیم که برای هر مسئله متفاوت است . برای یک مسئله طبقه بندی باینری، ما می خواهیم که خروجی 0 یا 1 باشد. بنابراین، یک تابع فعال سازی sigmoid استفاده می کنیم. برای یک مسئله طبقه بندی چند کلاسه، از Softmax (به عنوان یک تعمیم از sigmoid برای  مسائل چند کلاسه) استفاده می شود. برای یک مسئله رگرسیون، که در آن خروجی یک کلاس از پیش تعریف شده نیست، ما می توانیم به سادگی از یک واحد خطی استفاده کنیم.

1.5. لایه پنهان

در یک شبکه feedforward مجموعه ای از توابع را به ورودی اعمال می کنیم. با داشتن چندین لایه پنهان، می توانیم توابع پیچیده را با توابع ساده ی مرحله ای محاسبه کنیم. فرض کنید ما می خواهیم توان 7 یک  عدد  را محاسبه کنیم، اما می خواهیم همه چیز را ساده نگه داریم . شما می توانید توابع ساده تر مانند مرتبه دوم و سوم را برای محاسبه توابع مرتبه بالاتر استفاده کنید. به طور مشابه، شما می توانید توابع خیلی پیچیده تری را با این اثر آبشاری محاسبه کنید.اکثر واحد های مخفی در این مسئله از  ReLU به عنوان تابع فعال سازی استفاده می کنند.

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

1.6 شبکه چگونه یاد می گیرد؟

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

2. چرا از لایه های مخفی استفاده کنیم؟

برای درک اهمیت لایه های پنهان، سعی خواهیم کرد که مسئله طبقه بندی باینری بدون لایه های پنهان حل شود. برای این، از پلت فرم تعاملی Google، playground.tensorflow.org استفاده خواهیم کرد که یک برنامه تحت وب است که شما می توانید شبکه های عصبی ارسالی ساده ایجاد کنید و اثرات آموزش را در زمان واقعی ببینید. شما می توانید با تغییر تعداد لایه های پنهان، تعداد واحدها در یک لایه مخفی، نوع تابع فعال سازی، نوع داده ها، نرخ یادگیری، پارامترهای تنظیم و غیره بازی کنید. در زیر یک تصویر از صفحه وب نشان داده شده است.

 

در بالای صفحه، می توانید داده ها را انتخاب کرده و روی کلید اجرا جهت شروع عمیلات آموزش کلیک کنید. این به شما مرز تصمیم گیری و منحنی های loss را در گوشه بالا سمت راست نشان می دهد.

 

2.1 بدون لایه پنهان

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

با این حال، اگر شما اول داده را انتخاب کنید قادر به یادگیری مرز تصمیم گیری دایره ای نیست.

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

در حال حاضر، اگر دومین داده را انتخاب کنید، همان تنظیمات نمی تواند مرز تصمیم مناسب را یاد بگیرد.

به نظر می رسد که مرز تصمیم گیری یک بخش مخروطی است (مثل یک قاعده یا هیبرالی). بنابراین، اگر ضرب ویژگی ها (یعنی X1X2) را دخالت دهیم، نورون قادر است مرز تصمیم گیری مورد نظر را یاد بگیرد.

از آزمایش فوق، ما موارد زیر را مشاهده کردیم:

با استفاده از یک نورون تنها می توانیم مرز تصمیم گیری خطی را یاد بگیریم
باید تغییراتی در ویژگی ها  (مانند مربع ویژگی ها یا ضرب ویژگی ها) ایجاد کنیم. این مرحله می تواند برای داده هایی استفاده شود که به راحتی قابل دیدن نیستند.

2.2 اضافه کردن یک لایه پنهان

با اضافه کردن یک لایه مخفی ، می تواند تمام سه مرز تصمیم گیری را یاد بگیرند. یک شبکه عصبی با یک لایه مخفی تنها با توابع فعال سازی غیرخطی، به عنوان یک تابع تقریب پذیری جهانی (یعنی قادر به یادگیری هر تابع) در نظر گرفته می شود. با این حال، تعداد واحد در لایه پنهان ثابت نیست. نتیجه اضافه کردن یک لایه پنهان تنها با 3 نورون در زیر نشان داده شده است:

3. منظم سازی

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

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

loss در مرحله آموزش کاهش می یابد، اما از loss در مرحله تست افزایش می یابد. همچنین شما می توانید ببینید که بعضی از وزن ها بسیار بزرگ شده اند (اتصالات بسیار ضخیم یا شما می توانید وزن را ببینید اگر شما بالای اتصالات شناور). این را می توان با قرار دادن برخی از محدودیت ها در ارزش های وزن (مانند اجازه نمی دهد که وزن بسیار بالا). این اصلاحیه نامیده می شود. ما محدودیت های دیگر پارامترهای شبکه را اعمال می کنیم. به طور معنی داری، به طور کامل اطلاعات آموزشی را به حساب نمی آوریم و می خواهیم که شبکه ها مرزهای تصمیم “خوب” را بیاموزند. من تنظیم L2 را به این پیکربندی فوق اضافه کرده ام و خروجی در زیر نشان داده شده است.

پس از تنظیم L2، مرز تصمیم گیری توسط شبکه آموزش داده می شود، نرمتر و شبیه به مواردی است که نویزی وجود ندارد. تاثیر regularization  را می توان از منحنی های loss و مقادیر وزن ها دید.

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

نظر دهید

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