And after all I'm only ordinary man
4. هوش مصنوعی به زبان خیلی ساده: شبکه عصبی مصنوعی2
پیش گفتار
این مقاله در ادامه مقالات زیر می باشد. قبل از مطالعه این قسمت، قسمت سوم رو حتما بخونید.
قسمت اول «هوش مصنوعی به زبان خیلی ساده: یادگیری ماشین»
قسمت دوم «هوش مصنوعی به زبان خیلی ساده: شناسایی الگو»
قسمت سوم «هوش مصنوعی به زبان خیلی ساده: شبکه عصبی مصنوعی1»
شما که این مقاله رو میخونید، اگر یک مهندس هوافضا در ناسا هستید یا در سوپر مارکت احمد آقا کار میکنید. یا اگر استاد تمام در دانشگاه MIT هستید و یا چون شرایط طوری بود که نتونستید دیپلمتون رو به اتمام برسونید، ولی علاقمندید راجع به هوش مصنوعی بدونید، لطفا این مقاله رو طوری بخونید که قراره کلمه به کلمهشو متوجه بشید. اگر غیر این بود، لطفا به من اطلاع بدید. (این متن تا ابد در حال ویرایش هست)
خلاصه قسمت های قبل
در قسمت قبل دیدیم که، شبکه عصبی مصنوعی، یکی از روش های یادگیری ماشین است. که به کامپیوتر قابلیت یادگیری میده. و در حل مسالهی پیشبینی قیمت خونه، با استفاده از کوچک ترین شبکه عصبی (تک نورون)، دیدیم که اگر بتونیم پارامتر های شبکه عصبیمون (w و b) رو به درستی تقریب بزنیم، مدلمون به خوبی روی دادههای آموزشی fit میشه. به بیان دیگه، شبکهمون تجربیات گذشته رو یاد میگیره.
تصور کنید شبکه عصبیمون از هزاران نورون تشکیل شده باشه. قطعا نمیتونیم صدها هزار پارامتر رو به صورت دستی با استفاده از روش قسمت قبل (رسم نمودار) تقریب بزنیم. قرار هست این کار رو کامپیوتر خودش با استفاده از الگوریتم گرادیان کاهشی (Gradient Descent) انجام بده.
مساله (1)
اون روزی رو تصور کنید که، کرونا رو شکست دادیم. دل به طبیعت زدیم و به قلهی کوهی عظیم، صعود کردیم. داشتیم از مناظر بکر لذت میبردیم که ناگهان مه غلیظی، همهجا رو فرا گرفت. طوری که تنها نیممتر جلوتر از خودمون رو میتونیم ببینیم. طبیعتا مه فضای زیبایی خلق کرده. ولی GPS همراهمون نیست. و قبل از اینکه هوا تاریک بشه، باید برگردیم. تنها چیزی که میتونه کمکمون کنه، سنسور ارتفاع سنج ساعت مچیمون هست.
چطوری از قله بریم پایین؟
احتمالا بهترین استراتژی برای برگشتن به پایین کوه (حداقل روی کاغذ) این هست که، یک قدم به جلو برداریم و ارتفاع سنج رو چک کنیم، که ارتفاعمون کاهش پیدا کرد یا خیر. همین کار رو برای عقب، چپ و راست انجام میدیم. و همواره در جهتی حرکت میکنیم که ارتفاعمون بیشترین کاهش رو داشته باشه.
الگورتیم گرادیان کاهشی
در شبکه عصبی مصنوعی، با استفاده از روش بالا، کامپیوتر میتونه پارامتر های شبکه رو تخمین بزنه. با این تفاوت، به جای ارتفاع سنج و استراتژی حرکت، به ترتیب از مفاهیم تابع هزینه و بهینهساز استفاده میکنه. در مساله (2)، به صورت تصویری این مفاهیم رو بررسی خواهیم کرد. قبلش، کمی راجع به مشتق، که قلب این روش هست، صحبت میکنیم.
متشق
به صورت خلاصه با استفاده از مشتق میتونیم شیب خط در هر نقطهای از یک تابع رو محاسبه کنیم. در تصویر زیر، از تابع در نقطههای x1 و x2 و x3، مشتق (شیب خط) نسبت به محور افقی رو محاسبه کردیم.
در نقطهی x1، شیب خط یک عدد مثبت نزدیک به یک هست. و x2 یک عدد منفی نزدیک به صفر و x3، یک عدد مثبت نزدیک به یک هست. (شیب در نقطهای که خط کاملا افقی باشد، صفر، و در نقطه ای که خط کاملا عمودی باشه، بینهایت، میباشد)
نکته کم اهمیت؛ وقتی معادلهمون تک متغیره باشه از واژه مشتق و تو فرمول از d، استفاده میکنیم. و اگر معادلهمون بیشتر از یک متغیر داشته باشه، از واژه گرادیان و تو فرمول از روند (partial) استفاده میکنیم.
تابع هزینه (Loss Function)
این تابع خطای شبکهمون رو در هر لحظه نشون میده. (مثل ارتفاع سنج که ارتفاع رو نشون میداد). و تمام هدف ما اینه که پارامتر های شبکه مون رو جوری انتخاب کنیم که این تابع کمینه (minimize) بشه. به بیان دیگه، پارامتر (w و b) هایی که این تابع رو کمینه کنه، بهترین پارامتر ها هستند که شبکه مون روی داده های آموزشیمون fit میشه.
بهینهساز (Optimizater)
بهینهساز درواقع استراتژی بهروزرسانی پارامترها، در جهت کمینه کردن تابع هزینه رو مشخص میکنه. (تو مثال کوه، استراتژی مون این بود که، در جهتی که ارتفاع کمتر میشه، حرکت کنیم)
مراحل الگوریتم گرادیان کاهشی
- با استفاده از تابع هزینه، خطای شبکهمون رو محاسبه میکنیم.
- از تابع هزینه، نسبت به پارامترها مشتق میگیریم. و شیب خط تابع هزینه، برای پارامترها رو بدست میاریم.
- با استفاده از بهینهساز، پارامترها رو جوری تغییر میدیم که تابع هزینه کاهش پیدا کنه.
- اینکار رو به تعداد دفعاتی که خودمون مشخص کردیم و یا تا زمانی که خطای شبکه از یه حدی کمتر بشه، ادامه میدیم.
برای شهود بیشتر الگوریتم پایین رفتن از قله رو به صورت متناظر با الگوریتم گرادیان کاهشی رو بازنویسی میکنم.
مراحل الگوریتم پایین رفتن از قله
- با استفاده از ارتفاع سنج، ارتفاع کنونی رو چک میکنیم.
- با قدم برداشتن در جهتهای مختلف و چک کردن ارتفاع، شیب کوه رو پیدا میکنیم.
- بر خلاف شیب کوه حرکت میکنیم.
- این کار رو انقدر ادامه میدیم که به پایین کوه برسیم.
مساله (2)
میخوایم با استفاده از شبکه عصبی، به کامپیوتر مفهوم گربه رو یاد بدیم. به این صورت که، به شبکهمون یک عکس میدیم و شبکه در خروجیش بهمون میگه این عکس متعلق به گربه هست یا خیر. (اگر عکس متعلق به گربه بود 1، درغیر این صورت 0، تولید خواهد کرد)
این مساله در هوش مصنوعی به مساله، طبقهبندی یا دستهبندی (Classification) معروف هست. و از اونجایی که کلاسهامون در این مساله دوتاست (گربه و غیر گربه)، اسم دقیق تر مسالهمون، طبقهبندی دودویی (Binary Classification) هست.
بررسی تابع هزینه در مساله (2)
توابع هزینه بسیار زیادی وجود داره. امروزه خیلی از مقالات معتبر در حوزهی یادگیری عمیق، برای معرفی تابع هزینه جدید و موثر تر، چاپ میشه. یکی از معروف ترین و ساده ترین تابع هزینه، تابع MSE هست.
اگر در معادله بالا، کسر 1 بر روی N و همچنین سیگما رو نادیده بگیریم (میانگینگیری، برای نرمال سازی مقدار خطا هست) و به جملهی داخل پرانتز توجه کنیم. y برچسب عکسی هست که وارد شبکه عصبی میشه (در این مساله، اگر عکس گربه بود برابر با 1 و در غیر این صورت برابر با 0 میباشد). هم چنین y hat برابر با مقدار خروجی شبکه عصبیمون هست.
در تصویر زیر، یک عکس گربه به شبکه عصبیمون دادیم (y برابر با 1). شبکه عصبیمون که هنوز به خوبی آموزش ندیده، در خروجی، 0 تولید کرد (یعنی فکر میکنه عکس گربه نیست). وقتی خطای شبکهمون (L) رو با استفاده از تابع هزینهمون، در قسمت سمت راست عکس زیر، محاسبه میکنیم، متوجه میشیم که شبکهمون هنوز به خوبی آموزش ندیده.
لذا پارامترهای شبکه رو جوری تغییر میدیم (جلوتر خواهیم دید چگونه با استفاده از بهینهساز تغییر میدیم) که همانند عکس زیر، وقتی این عکس گربه وارد شبکه میشه، در خروجی 1 تولید کنه. و خطای شبکهمون (L) صفر بشه.
در بین هزاران عکس گربهای که، به شبکهمون میدیم تا شبکهمون آموزش ببینه، هزاران عکس غیر گربه هم میدیم، تا شبکه مفهوم گربه رو، به خوبی یاد بگیره.
در عکس زیر، اینبار عکس غیر گربه وارد شبکه شد. و شبکه به اشتباه فکر کرد عکس متعلق به گربه هست و در خروجی 1 تولید کرد. و وقتی خطای شبکه رو محاسبه کردیم، برابر با 1 شد.
اینبار هم، جوری پارامترهای شبکهمون رو تغییر میدیم، که شبکه در خروجی صفر تولید کنه و همانند عکس زیر، خطا کمینه بشه.
بررسی بهینهساز در مساله (2)
روشهای بهینهسازی متفاوتی وجود داره. یکی از رایجترین روشها، SGD هست.
فرمول بالا برای بهروزرسانی پارامتر w شبکهمون هست. برای بهروزرسانی پارامتر b هم از همین فرمول استفاده میشه (تنها w به b تغییر میکنه). آلفا، یک عدد مثبت و معمولا کوچیک که اصطلاحا، بهش نرخ یادگیری میگن و عبارت روند loss بر روی روند w، مشتق تابع هزینه نسبت به پارمتر w هست.
برای سادگی و بررسی عملکرد فرمول بهینهساز به صورت تصویری، فرض میکنیم شبکه عصبی تنها یک پارامتر w دارد. (اگر شبکهمون 100 ملیون پارامتر داشت، روش همینه)
فرض کنید منحنی تابع هزینهمون همانند منحنی آبیرنگ در تصویر زیر باشه. همونطور که گفتیم، تمام هدفمون اینه که پارامتر های شبکهمون طوری باشه که مقدار تابع هزینه مون رو کمینه کنه. در تصویر زیر محور عمودی مقدار خطای شبکهمون (loss) و محور افقی مقدار پارامتر شبکهمون w هست. همونطور که کاملا واضح هست، مقدار wای که ایموجی خندون انتخاب کرده، مقدار خطای شبکهمون کمینه میکنه. بر عکس wای که، ایموجی ناراحت انتخاب کرده.
احتمالا در ابتدا، قبل از اینکه شبکهمون به خوبی آموزش ببینه، wای همانند تصویر زیر داریم.
در نقطه w، از تابع هزینهمون، مشتق (گرادیان) رو محاسبه میکنیم و شیب خط رو بدست میاریم. در اینجا شیب خط (روند loss بر روی روند w) یک عدد مثبت هست. در قسمت سمت راست تصویر زیر، طبق فرمول بهینهساز، مقدار w، برابر میشه با مقدار خودش، منهای یک عدد مثبت (P برابر است با ضرب مشتق که یک عدد مثبت بود در آلفا که یک عدد مثبت بود). و مقدار w به سمت بهترین w، کاهش پیدا میکنه.
حالا فرض کنید که، wای که در ابتدا داشتیم، همانند تصویر زیر بود:
همانند مثال بالا در نقطه w، از تابع هزینهمون مشتق (گرادیان) رو محاسبه میکنیم و شیب خط رو بدست میآریم. در اینجا شیب خط یک عدد منفی هست. در قسمت سمت راست تصویر زیر، طبق فرمول بهینهساز، مقدار w، برابر میشه با مقدار خودش، بهعلاوه یک عدد مثبت. و مقدار w به سمت بهترین w، افزایش پیدا میکنه.
اگر شبکهمون به خوبی آموزش دید و بهترین w رو کشف کرد. طبق تصویر زیر، مشتق برابر با صفر میشه و مقدار w دیگه تغییر نخواهد کرد. :)
همهی مراحل شبکه عصبی
تصویر زیر، مراحل آموزش شبکه عصبی رو نشون میده. در گام اول، پارامترهای شبکه رو به صورت اتفاقی مقداردهی میکنیم. در گام دوم، خروجی شبکه رو محاسبه میکنیم. در گام سوم، با استفاده از تابع هزینه، خطای شبکه رو محاسبه میکنیم. در گام چهارم، از تابع هزینه نسبت به همه پارامتر ها، گرادیانها (مشتقها) رو محاسبه میکنیم. در گام پنجم و ششم، با استفاده از فرمول بهینهساز، مقدار پارامترها رو بهروزرسانی میکنیم.
خلاصه
1- تابع هزینه، تفاوت میان خروجی شبکه و خروجی مطلوب یک شبکه (خطای شبکه) رو اندازه گیری میکنه.
2- بهینهساز، روش بهروزرسانی پارامترهای شبکهمون، با استفاده از تابع هزینه و مشتق هست.
امیدوارم موضوعاتی که مطرح کردم براتون جالب بوده باشه. و بهم در اصلاح کاستی ها در نظرات کمک کنید.
اگر تمایل به دنبال کردن مطالبام در زمینهی هوش مصنوعی دارید، بجای دنبال کردن اکانت شخصیام، که حاوی مطالب غیر مرتبط با هوش مصنوعی هم هست، انتشارات هوش مصنوعی رو دنبال کنید.
آخرین ویرایش: 1399/1/9
مطلبی دیگر از این انتشارات
2. هوش مصنوعی به زبان خیلی ساده: شناسایی الگو
مطلبی دیگر از این انتشارات
شناسایی چهره در تصویر به زبان خیلی ساده + کد پایتون
مطلبی دیگر از این انتشارات
1. هوش مصنوعی به زبان خیلی ساده: یادگیری ماشین