شبکه های عصبی : دید کلی برای مبتدیان

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

سعی می کنیم این آموزش را بسیار کوتاه، روان و بدون معادلات ریاضی ارائه کنیم.

شبکه های عصبی به عنوان یک جعبه سیاه

ما در ابتدا با در نظر گرفتن یک شبکه عصبی به عنوان یک جعبه سیاه جادویی، آموزش را شروع خواهیم کرد. شما نمی دانید داخل این جعبه سیاه چیست. تنها چیزی که می دانید این است که یک ورودی و سه خروجی دارد. ورودی یک تصویر است که می تواند اندازه ، رنگ ، نوع و ویژگی های مختلفی داشته باشد. سه خروجی اعدادی بین ۰ تا ۱ هستند. خروجی ها دارای برچسب ” گربه ” ، ” سگ ” و ” سایر ” هستند. مجموع این سه عدد همیشه برابر ۱ خواهد بود.

شبکه عصبی به عنوان جعبه سیاه

درک خروجی شبکه عصبی

این فرآیند جادویی که درون جعبه سیاه انجام می شود، بسیار ساده است. اگر تصویری را وارد جعبه سیاه کنید، سه عدد خروجی دریافت خواهید کرد. یک شبکه عصبی بی عیب و نقص، برای یک گربه خروجی (۰, ۰, ۱) ، برای یک سگ خروجی (۰, ۱, ۰) و  برای هر چیزی غیر از گربه یا سگ خروجی (۱, ۰, ۰) را تولید می کند. در حقیقت ، حتی یک شبکه عصبی کاملاً آموزش دیده هم ، چنین نتایج مطلوبی نخواهد داشت. به عنوان مثال ، اگر تصویر گربه را وارد کنید ، شماره زیر برچسب ” گربه ” می تواند ۰٫۹۷ ، عدد زیر برچسب ” سگ ” می تواند ۰٫۰۱ و عدد زیر برچسب ” سایر ” می تواند ۰٫۰۲ باشد. در واقع، خروجی ها را می توان به عنوان احتمالات تفسیر کرد. این خروجی خاص به این معنی است که جعبه سیاه ” فکر می کند ” به احتمال ۹۷ درصد ، تصویر ورودی متعلق به یک گربه باشد و احتمال این که تصویر متعلق به سگ باشد یا اصلا چیزی تشخیص داده نشود، بسیار کم است. توجه داشته باشید که مجموع اعداد خروجی برابر ۱ هستند.

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

 

درک ورودی شبکه عصبی

اکنون ، شما یک برنامه نویس هستید و فکر می کنید که می توانید از float و double برای نمایش خروجی شبکه عصبی استفاده کنید.

چطور یک تصویر را وارد کنیم؟

تصاویر فقط یک آرایه از اعداد هستند. یک تصویر ۲۵۶ × ۲۵۶ با سه کانال به سادگی آرایه ای از ۱۹۶۶۰۸ = ۲۵۶ × ۲۵۶ × ۳ عدد است. اکثر کتابخانه هایی که برای خواندن تصویر استفاده می کنید ، یک تصویر رنگی ۲۵۶ × ۲۵۶ را در یک بلوک پیوسته از ۱۹۶۶۰۸ عدد از حافظه می خوانند. با این دانش جدید ، می دانیم ورودی کمی پیچیده تر است. در واقع شامل ۱۹۶۶۰۸ عدد است. اجازه دهید جعبه سیاه خود را اصلاح کنیم تا با این شرایط جدید سازگار باشد.

شبکه عصبی ورودی تصویر

احتمالا اکنون به این فکر می کنید که اگر اندازه تصویری ۲۵۶ × ۲۵۶ نباشد ، چه ؟ خب ، شما همیشه می توانید با استفاده از مراحل زیر هر تصویری را به اندازه ۲۵۶ × ۲۵۶ تبدیل کنید.

  1. نسبت ابعاد غیر مربعی : اگر تصویر ورودی مربعی نباشد ، می توانید اندازه تصویر را تغییر دهید تا کوچکتر اندازه ۲۵۶ باشد. سپس اندازه ۲۵۶ × ۲۵۶ پیکسل را از مرکز تصویر برش دهید.
  2. تصویر در مقیاس خاکستری : اگر تصویر ورودی یک تصویر رنگی نیست ، می توانید با کپی کردن تصویر مقیاس خاکستری در هر سه کانال رنگی ، یک تصویر ۳ کاناله ایجاد کنید.

علاوه بر این، معمولاً از ترفند های مختلفی برای تبدیل تصویر به یک تصویر مشخص ( به عنوان مثال ۲۵۶ ×  ۲۵۶ ) استفاده می شود ، اما از آنجا که قول دادیم این آموزش ساده باشد، به این ترفند ها نمی پردازیم. نکته مهمی که باید به آن توجه شود این است که هر تصویر می تواند به یک تصویر با اندازه ثابت تبدیل شود حتی اگر با برش زدن و تغییر اندازه تصویر ، بخشی از اطلاعاتی تصویر را از دست بدهیم.

آموزش یک شبکه عصبی به چه معناست؟

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

آموزش شبکه عصبی به معنای یافتن تنظیمات ( یا وزن های ) مناسب است.

تنظیم وزن های شبکه عصبی

چگونه یک شبکه عصبی را آموزش دهیم؟

اگر این جعبه سیاه جادویی را داشته باشید اما تنظیمات درست دکمه ها را ندانید ، عملاً یک جعبه بی فایده و بدردنخور خواهید داشت.

خبر خوب این است که با ” آموزش ” شبکه عصبی می توانید تنظیمات درست دکمه ها را پیدا کنید.

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

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

بنابراین ، برای آموزش شبکه عصبی ، به سه چیز نیاز داریم :

  1. داده های آموزشی : شامل هزاران تصویر از هر کلاس و میزان خروجی مورد انتظار. به عنوان مثال ، برای تمام تصاویر گربه ها در این مجموعه داده ، خروجی مورد انتظار، معادل (۰, ۰, ۱) است.
  2. تابع هزینه : باید بدانیم آیا تنظیم فعلی بهتر از تنظیم دکمه قبلی است یا خیر. یک تابع هزینه ، مجموع خطا های ایجاد شده توسط شبکه عصبی در مورد تمام تصاویر مجموعه آموزشی است. به عنوان مثال ، یک تابع هزینه متداول ، مجموع مربع خطا ها (SSE) نامیده می شود. اگر خروجی مورد انتظار برای یک تصویر، گربه یا  (۰, ۰, ۱) و خروجی شبکه عصبی (۰٫۱۳, ۰٫۵, ۰٫۳۷) باشد ، مربع خطای ساخته شده توسط شبکه عصبی روی این تصویر خاص ۰٫۶۶۳۸ = ۲(۱-۰٫۳۷) + ۲(۰-۰٫۵) + ۲(۰-۰٫۱۳) است. بدین ترتیب ، هزینه کل ، برابر مجموع مربع خطا های همه تصاویر است. هدف از آموزش ، یافتن تنظیمات دکمه است ، بطوریکه که مقدار تابع هزینه را به حداقل برساند.
  3. نحوه بروزرسانی تنظیمات دکمه ها : در نهایت، ما به روشی برای بروزرسانی تنظیمات دکمه ها، مبتنی بر خطایی که در تمام تصاویر آموزش مشاهده می کنیم نیاز خواهیم داشت.

آموزش یک شبکه عصبی با یک دکمه

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

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

با این حال ، شبکه های عصبی دنیای واقعی ، فقط یک دکمه ندارند. به عنوان مثال ، VGG-Net ، یک معماری محبوب شبکه عصبی دارای ۱۳۸ میلیون دکمه است !

آموزش شبکه عصبی با چند دکمه

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

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

گرادیان نزولی

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

نمودار گرادیان نزولی

برای اولین برآورد از W_e ، می توانید یک عدد تصادفی انتخاب کنید.

توجه : اگر از معماری های معروف شبکه عصبی مانند GoogleNet یا VGG-Net استفاده می کنید ، می توانید به جای انتخاب وزن های اولیه تصادفی ، از وزن های آموزش دیده در ImageNet استفاده کنید تا همگرایی بسیار سریع تری داشته باشید.

 

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

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

پس انتشار

یک قطعه از پازل باقی مانده است. با توجه به تنظیمات اولیه دکمه ما ، چگونه می توان گرادیان تابع هزینه را محاسبه کرد؟

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

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

 

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

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

منبع Learn OpenCV

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

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

دوره جامع پردازش تصویر با TensorFlow و Keras

دوره جامع آموزش پردازش تصویر با TensorFlow و Keras

دوره آموزشی جامع پردازش تصویر با TensorFlow و Keras توسط اساتید سایت Learn OpenCV ارائه …

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

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