در پی پیشرفتهای اخیر علم هوش مصنوعی با استفاده از قدرت شبکه هایعصبی، این مبحث مورد توجه بسیاری از فعالان حوزهی کامپیوتر قرار گرفته است. در این مقاله قصد داریم با نقش شبکههای عصبی در هوش مصنوعی آشنا شویم و ایدهای که شبکههای عصبی بر اساس آن ساخته شدند و کلیات کار آنها را یاد بگیریم.
شبکههای عصبی کجای علم هوش مصنوعی قرار میگیرند؟
هوش مصنوعی
هوش مصنوعی مفهومی بسیار کلی میباشد که میتواند اکثر کدهایی که برنامه نویسان مینویسند را شامل شود. هر سیستمی که بر اساس برخی قاعدهها (دستورات شرطی اگر آنگاه) کار میکند یک سیستم هوش مصنوعی محسوب میشود. [۱]NPC ها در بازیهای کامپیوتری دارای هوش مصنوعی هستند (حتی اگر فقط چند شرط ساده برای تصمیمگیری به شلیک و عدم شلیک داشته باشند). الگوریتمهای جستجو، سامانههای برنام ریزی و هر سامنهی دیگری که کار هوشمندانهای انجام میدهد ذیل هوش مصنوعی قرار میگیرند.
یادگیری ماشین
سیستمهای دارای هوش مصنوعی گاهی بدون نیاز به آموزش قابل استفاده میباشند. برای مثال الگوریتمهای جستجو صرفا یک کد آمادهی اجرا هستند. گاهی مانند رگرسیون خطی ما یک یا چند پارامتر بدون مقدار مشخص در سیستم خود داریم که نیازمند دادهی آموزشی برای به دست آوردن مقادیر آنها هستیم. رگرسیون خطی بر اساس دادههایی که ورودی و خروجی در آنها مشخص است مقادیر ایده آل برای پارامترها را به دست میآورد. به این بخش از حوزهی هوش مصنوعی یادگیری ماشین گفته میشود.
در شکل بالا یک نمونه از رگرسیون خطی را مشاهده میکنیم که در آن تلاش شده مدلی برای محاسبهی وای از روی اکس ارائه شود. برای انجام این کار در رگرسیون خطی ابتدا y را مساوی ax+b قرار میدهیم. سپس بر اساس دادهها مقادیر ایدهآل a,b را محاسبه میکنیم
شبکه های عصبی
در یادگیری ماشین میتوانیم از هر عبارت ریاضی که ورودیهای مسئله را در آن قرار دهیم و خروجی را برای ما محاسبه کند به عنوان مدل استفاده کنیم و اعداد موجود در آن عبارت ریاضی را بر اساس داده ها تغییر دهیم تا خروجی مدل به خروجی واقعی نزدیک شود. در اینجا دو مسئله دارای اهمیت بسیار زیادی میباشد:
۱. توانایی مدل
هر مدلی توانایی حل هر مسئله ای را ندارد. برای مثال مدل رگرسیون خطی که دارای دو پارامتر a,b بود توانایی حل مسائلی که تابع آنها شبیه به درجه دو باشد را، ندارد. هرچقدر هم دقیق دو پارامتر آن را تنظیم کنیم هیچوقت به نتیجهی مطلوب نخواهیم رسید. پس خروجیهایی که مدل میتواند تولید کند و عملیاتهایی که یک مدل میتواند بر روی ورودی اعمال کند اهمیت زیادی دارد.
۲. سهولت آموزش
از طرف دیگر، سهولت دستیابی به پارامترهای ایدهآل برای مدل نیز حائز اهمیت است. قدرت حل مسئلهی مدل و سهولت آموزش آن، در شبکههای عصبی با ایدهگیری از عصبهای انسان به خوبی حل شده است که در بخش بررسی ایدهی شبکه عصبی مفصل به آن میپردازیم. در این روش در مدل خود، از یک مدلسازی ریاضی عصب، استفاده میکنیم که برابر است با مجموع تمامی ورودیها. هر کدام از ورودیها در یک پارامتر متفاوت ضرب شده و با یک مقدار دیگر که آن هم یکی دیگر از پارامترهای مدل میباش، جمع میشود. در نهایت این مجموع را به یک تابع معمولا غیر خطی میدهیم. در بخش آموزش مدل مقدار پارامتر وزنها (ضریب هر ورودی) و بایاس (مقداری که در نهایت جمع میشود) یادگیری میشوند.
یادگیری عمیق
در شبکههای عصبی هرگاه تعداد لایههای عصب را افزایش دهیم به اصطلاح شبکه را عمیق کردهایم و به آن مدل شبکهی عصبی عمیق گفته میشود و به پروسهی آموزش آن یادگیری عمیق میگوییم. برخلاف شباهت بسیار زیاد آن به شبکه های عصبی عادی چالش های بسیار زیادی مانند محو شدن گرادیان و انفجار گرادیان نسبت به آنها را دارد.
[۱] Non-Playable Character به کاراکترهایی گفته میشود که توسط پلیر کنترل نمیشوند و خود بازی آنها را کنترل میکند.
ایدهی شبکههای عصبی
در عصبهای انسان ارتباط بین عصبها به این شکل میباشد:
- هر عصب تعداد زیادی ورودی و تعداد زیادی خروجی دارد. ورودیهای هر عصب به خروجی تعداد زیادی عصب دیگر متصل است و خروجی هر عصب نیز به ورودی تعداد زیادی عصب دیگر متصل است.
- بر اساس ترکیب شیمیایی بخش ورودی عصبها ورودی هر عصب در یک ضریب ضرب میشود.
- این ورودیها پس از ضرب شدن در ضریب خود با یکدیگر جمع میشوند.
- در صورتی که مجموع به دست آمده به علاوهی یک مقدار مشخص از صفر بیشتر بود، خروجی عصب روشن شده و در غیر این صورت خاموش شده و خروجی نمیدهد.
شبکههای عصبی مصنوعی از همین مسئله ایده گرفتهاند. تعداد زیادی عصب دارای اتصال دارند. در هر عصب ابتدا هرکدام از ورودیها را در ضریب خاص (وزن) ضرب کرده و نتیجه را با هم جمع میکنند سپس یک مقدار (بایاس) به آنها اضافه کرده و نتیجه را به یک تابع (اکتیویشن فانکشن) میدهند.
علت استفاده از یک تابع غیر خطی (Activation function)روی مجموع به دست آمده در هر عصب
در صورت عدم استفاده از تابع غیر خطی عملا شبکه علیرغم هر تعداد عصبی که داشته باشد مانند یک شبکه ی تک عصبه عمل میکند. زیرا میتوان بر اساس تمام پارامترهای یک شبکهی اینچنینی، پارامترهای یک تک عصب که همان کار را معادلسازی کند را، محاسبه نمود.
آموزش شبکهی عصبی
برای آموزش شبکههای عصبی با استفاده از دادهی آموزشی از روش گرادیان نزولی استفاده میشود. در ابتدای کار تمامی پارامترها به صورت تصادفی مقداردهی میشوند. در این روش ما ورودی را به شبکه داده و اختلاف آن با خروجی مطلوب دادهی آموزشی را به دست میآوریم. سپس مشتق این خطا نسبت به هرکدام از پارامترها را به دست آورده و پارامترها را متناسب با مشتقشان کاهش یا افزایش داده، تا خطا کاهش یابد. این عمل میتواند دفعات متعددی انجام شده تا پارامترها به مقدارهای نسبتا ایدهآلی برسند.
در شکل زیر تابع خطا در حالتی که مدل ما دارای دو پارامتر باشد رسم شده است. با هر مقداری از دو پارامتر کافیست مشتق تابع خطا در آن نقطه را حساب کرده و مقادیر آنها را به سمتی که خطا را کاهش میدهد، تغییر دهیم. همانطور که در شکل سمت چپ میبینید هرچقدر چالههای تابع خطا کمتر باشند میتوانیم به نتیجهی مطلوبتری برسیم. ناهمواریهای بسیار زیاد روند رسیدن به نقطهی مطلوب را دشوار کرده و ممکن است ما را از رسیدن به آن نقطه باز دارد.
حل یک مثال ساده
در این قسمت قصد داریم تابع XOR را به عنوان یک مثال ساده با یک شبکه ی عصبی پیادهسازی کنیم.
دو ورودی داریم. قرار است به یک خروجی برسیم. دادههایمان هم چهار حالت XOR میباشند.
۰ XOR 0 = 0
۰ XOR 1 = 1
۱ XOR 0 = 1
۱ XOR 1 = 0
مدل توانا برای حل مسئله
در صورت انتخاب تنها یک عصب برای مدل و تلاش برای حل مسئله با همان یک عصب ناموفق خواهیم بود. این عدم توانایی حل مسئله توسط مدل انتخابی در پروژه های واقعی بسیار زیاد رخ میدهد. کسب تجربه و انجام آزمایش های زیاد بهترین راه جلوگیری از این قبیل مشکلات است.
بر اساس تجربهی قبلی مدلی به این شکل پیاده میکنیم:
لایهی اول دو عصب H۱ و H۲ را داریم که هرکدام هر ورودی را با ضرب کردن در یک وزن خاص دریافت میکنند (W۱ تا W۴) و هر عصب وقتی هر ورودی را ضربدر ضریب خاص آن ورودی کرد، آنها را جمع کرده و با مقدار بایاس (B۱ و B۲۳) جمع میکند. بعد از آن مقدار به دست آمده را به یک اکتیویشن فانکشن میدهد و خروجی آن تابع، خروجی عصب ما میشود. اینجا اکتیویشن فانکشن را تابع استپ فانکشن در نظر میگیریم (هرگاه ورودیش از صفر بیشتر باشد خروجیش یک و در غیر این صورت خروجی آن صفر میباشد).
در لایهی آخر هم یک عصب داریم (Y) که آن هم مشابه دیگر عصب ها ورودی ها را گرفته و در وزن های W۵ وW۶ ضرب میکند و با بایاس B۳ جمع میکند. اکتیویشن فانکشن آن هم باز همان استپ فانکشن میباشد.
آموزش
کاری که در قسمت یادگیری انجام میدهیم یافتن مقدار ایدهآل برای این وزنها (Wها) و بایاس ها (Bها) میباشد. به طوری که وقتی ورودی دادهها را به مدل میدهیم خروجی دادهی آموزشی رو تحویل دهد (خروجی مدل برابر XOR دو ورودی آن باشد).
در نهایت خروجی عصبH۱ اینگونه میشود که اگر:
خروجی یک و در غیر این صورت خروجی صفر خواهد بود.
خروجی عصب Y هم اینگونه محاسبه میشود که اگر:
خروجی یک و در غیر این صورت خروجی صفر میشود.
ابتدا سعی کنید خودتان مقادیری را برای این وزن ها و بایاس ها پیدا کنید. سپس پاسخ را در این زیر مشاهده کنید.
مقادیر ایده آل وزنها و بایاسها
مقادیر وزن و بایاسی که مسئله با آنها حل میشود و مدل، خروجی درستی میدهد، بی نهایت حالت ممکن دارد. در اینجا فقط یکی از آنها آمده است:
W۱=۱
W۲=-۱
W۳=-۱
W۴=۱
B۱ =-۱/۲
B۲ =-۱/۲
W۵ =۱
W۶=۱
B۳=-۱/۲