آموزش شبکه عصبی پیشخور ( Feedforward Neural Network )

در این سری از آموزش شبکه عصبی قصد داریم به شبکه های عصبی پیشخور ، که به آن ها Deep Feedforward Networks یا Multi-layer Perceptrons ( پرسپترون چند لایه ) نیز گفته می شود، بپردازیم.

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

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

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

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

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

تابع تصمیم گیری از مجموعه ای از نمونه های دارای برچسب آموزش می بیند ، که به آن “داده آموزشی” و به روند یادگیری تابع تصمیم گیری، “آموزش” گفته می شود.

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

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

۱- درک اصطلاحات تخصصی شبکه عصبی

دیاگرام پرسپترون چند لایه
دیاگرام پرسپترون چند لایه

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

در حالت کلی، می توانیم چندین لایه پنهان داشته باشیم. هر گره در هر لایه، نشانگر یک نورون است که می توان آن را به عنوان یک واحد پردازش در شبکه عصبی در نظر گرفت.

۱-۱- نورون چیست؟

دیاگرام نورون های شبکه عصبی
دیاگرام نورون های شبکه عصبی

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

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

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

۲-۱- توابع فعالساز

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

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

این تابع، ورودی ( محورx ) را به مقادیر بین ۰ و ۱ نگاشت می دهد.

تابع سیگموئید
تابع سیگموئید
  • Tanh

این تابه شبیه تابع سیگموئید است اما ورودی را به بازه مقادیر بین ۱- و ۱ می برد.

تابع Tanh
تابع Tanh
  • Rectified Linear Unit (ReLU)

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

تابع ReLU
تابع ReLU

توابع دیگری مانند Unit Step function, leaky ReLU, Noisy ReLU, Exponential LU  و غیره نیز وجود دارند، که هر یک مزایا و معایب خاص خود را دارند.

۳-۱- لایه ورودی

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

۴-۱- لایه خروجی

لایه خروجی لایه ای است که نتایج و پیش بینی ها را ارائه می دهد. تابع فعالسازی که در این لایه مورد استفاده قرار می گیرد برای مسائل مختلف متفاوت است.

به عنوان مثال برای یک مسئله کلاسه بندی باینری ، خروجی باید یا ۰ یا ۱ باشد. بنابراین ، از یک تابع فعالساز سیگموئید استفاده می شود و برای یک مسئله طبقه بندی چند کلاسه ، از تابع فعالساز Softmax (که یک تعمیم یافته سیگموئید برای چندین کلاس است) استفاده می شود.

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

۵-۱- لایه پنهان

یک شبکه Feedforward یک سری توابع را به ورودی اعمال می کند. با داشتن چندین لایه پنهان ، می توانیم توابع پیچیده را با توابع ساده تر پشت سر هم محاسبه کنیم.

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

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

سوالی که ممکن است بپرسید این است که دقیقاً چند لایه در شبکه باعث عمیق تر شدن آن می شود؟ ولی پاسخ درستی برای این پرسش وجود ندارد. به طور کلی، شبکه های عمیق تر می توانند عملکردهای پیچیده تری را بیاموزند.

۶-۱- نحوه یادگیری شبکه

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

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

۲- چرا از لایه های پنهان استفاده می کنیم؟

نمونه ای از TensorFlow Playground

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

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

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

۱-۲- بدون لایه پنهان

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

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

خروجی خطی TensorFlow Playground
خروجی خطی TensorFlow Playground

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

خروجی دایره ای TensorFlow Playground
خروجی دایره ای TensorFlow Playground

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

خروجی دایره ای صحیح TensorFlow Playground
خروجی دایره ای صحیح TensorFlow Playground

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

خروجی سهمی TensorFlow Playground
خروجی سهمی TensorFlow Playground

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

خروجی سهمی صحیح TensorFlow Playground
خروجی سهمی صحیح TensorFlow Playground

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

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

۲-۲- افزودن یک لایه پنهان

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

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

خروجی غیر خطی صحیح TensorFlow Playground
خروجی غیر خطی صحیح TensorFlow Playground

۳- منظم سازی

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

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

بیش برازش داده های خطی
بیش برازش داده های خطی

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

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

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

با اعمال برخی محدودیت ها در مقادیر وزن ، می توان این مشکل را برطرف کرد (مثلا اینکه اجازه ندهید وزن ها خیلی زیاد شوند). این فرآیند منظم سازی ( Regularization ) نامیده می شود. ما محدودیت هایی را برای سایر پارامترهای شبکه اعمال می کنیم.

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

خروجی Regularization
خروجی Regularization

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

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

بیشتر بخوانید :

منبع Learn OpenCV

درباره‌ی امیر اقتدائی

همچنین ببینید

تشخیص اشیا با داده های اندک برای کاربرد سنجش از راه دور

تشخیص اشیا با داده های اندک برای کاربرد سنجش از راه دور

تشخیص اشیا یک مساله قدیمی در زمینه سنجش از راه دور و بینایی رایانه ای …

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

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