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

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

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

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

به این مدل الگوریتم‌ها که با داده‌های بدون برچسب کار می‌کنند، الگوریتم‌های بدون نظارت یا (Unsupervised) گفته می‌شود. الگوریتم‌های ترکیبی هم وجود دارند که هم قسمتی از داده‌های آن‌ها برچسب‌دار و قسمتی دیگر از داده‌های آن‌ها بدون برچسب است که به آن‌ها نیمه نظارتی یا (Semi-Supervised) گفته می‌شود.

حال برگردیم به شبکه‌های عصبی مصنوعی. شبکه‌های عصبی مصنوعی یک سری از مدل‌ها و الگوریتم‌های یادگیری ماشین هستند که غالبا الگوریتم‌های با نظارت یا (Supervised) می‌باشند و در اکثر اوقات برای طبقه‌بندی یا تصمیم‌گیری از آن‌ها استفاده می‌شود. حال سوال اصلی این است که چطور می‌توانیم به کمک شبکه‌های عصبی مصنوعی یادگیری انجام داده و بر اساس آن طبقه‌بندی یا تصمیم‌گیری انجام دهیم؟

فکر میکنم بهترین راه برای توضیح این فرآیند با یک مثال باشه. در ادامه می‌خواهیم فرآیند یادگیری تصاویر اشیای مختلف توسط شبکه عصبی را توضیح دهیم. فرض کنید یک مجموعه داده ۶۰۰۰۰ تایی از عکس‌های ۳۲ در ۳۲ پیکسلی که مربوط به ۱۰ دسته یا کلاس مختلف است داریم. تصویر زیر نمونه‌ای از این مجموعه داده می‌باشد.

برای اینکه این داده‌ها را به صورت عددی تبدیل کنیم باید مقدار عددی پیکسل‌های هر عکس را ذخیره کنیم. عکس‌های رنگی توسط سه لایه سبز و آبی و قرمز (RGB) ساخته‌ می‌شوند. پس برای هر عکس رنگی ۳۲x۳۲ پیکسلی ما ۳ عکس ۳۲x۳۲ داریم که هر کدام از یک لایه رنگ تشکیل می‌شود.

علاوه بر این هر کانال عکس‌های RGB اگر ۸ بیتی باشند برای هر پیکسل عددی بین صفر تا ۲۵۵ خواهد بود که این عدد میزان اندازه و قدرت رنگ را مشخص می‌کند. پس با توجه به چیزهایی که در مورد عکس‌های رنگی گفته شد می‌توان هر عکس رنگی RGB که هر پیکسل کانال‌های آن ۸ بیتی باشد را می‌توان به صورت عددی به صورت زیر نشان داد.

خب پس می‌توان هر عکس رنگی را به صورت برداری از اعداد ۰ تا ۲۵۵ نشان داد. خب اگر به مجموعه داده خود بر گردیم، ما عکس‌های رنگی ۳۲x۳۲ داریم. هر عکس رنگی دارای ۳۲ ضربدر ۳۲ که برابر با ۱۰۲۴ پیکسل است. هر پیکسل خود شامل سه عدد مربوط به کانال قرمز و آبی و سبز می‌باشد. بنابراین در کل ۱۰۲۴ * ۳ برابر با ۳۰۷۲ است عدد داریم که نشان‌گر یک عکس رنگی ما است. از طرفی برچسبی که به هر داده اختصاص می‌دهیم را می‌توان با عددی بین ۱ تا ۱۰ نشان داد. به این صورت که برای مثال به عکس‌های هواپیما برچسب ۱، به عکس‌های اتومبیل برچسب ۲، به عکس‌های پرنده‌ها برچسب ۳ و الی آخر اختصاص می‌دهیم.

پس هر عکس شامل ۳۰۷۲ مقدار برای اطلاعات عکس و یک مقدار برای برچسب دارد. پس هر عکس دارای ۳۰۷۳ مقدار است. برای هر کدام از ۶۰۰۰۰ داده‌ای که داریم این ۳۰۷۳ مقدار را خواهیم داشت. تا به اینجا در مورد مجموعه داده نمونه و ویژگی‌های اون و نحوه‌ی آماده‌سازی اون صحبت کردیم. از اینجا به بعد باید شروع به ساختن شبکه عصبی است. هدف از این کار یادگیری عکس‌های این ۱۰ کلاس است به طوری که بعد از یادگیری اگر یک عکس جدید از این ۱۰ کلاس به شبکه وارد کنیم، بتواند مشخص کند این عکس وارد شده مربوط به کدام دسته یا کلاس می‌باشد.

شبکه‌های عصبی از چندین لایه نرون تشکیل شده است که هر لایه آن وظایف خاص خودش را دارد.

لایه ورودی وظیفه دریافت داده را دارد. معمولا تعداد نرون‌های آن برابر با تعداد ویژگی ورودی می‌باشد. اگر اندازه‌ی هر پیکسل عکس را یک ویژگی عکس در نظر بگیریم، پس هر عکس ما شامل ۳۰۷۲ ویژگی می‌باشد. بنابراین شبکه‌ی عصبی که طراحی می‌کنیم باید ۳۰۷۲ نرون به عنوان لایه ورودی داشته باشد. هر نرون ورودی با یک وزنی که در مقدار آن ضرب می‌شود به لایه‌های بعدی می‌رود. حال سوال این است که فرآیند یادگیری به چه صورت است؟

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

بعد از فرآیند آموزش شبکه با داده‌های آموزش، وزن‌های شبکه به گونه‌ای مقداردهی شده‌اند که با بیشترین دقت بتوانند یک عکس را به عنوان ورودی دریافت کرده و کلاس آن عکس را مشخص کنند. وزن‌ها باید به گونه‌ای تنظیم شوند که قابلیت تعمیم‌پذیری شبکه بالا باشد. یعنی اگر عکس‌های جدیدی از ۱۰ کلاس آموزش دبده شده به آن بدهیم بتواند با دقت خوبی کلاس آن را مشخص کند. یکی از کار‌های مهمی که طراحان شبکه عصبی انجام می‌دهند طراحی معماری شبکه است. معماری شبکه به صورت ساده به تعداد نرون‌ها، تعداد لایه‌های مخفی یا میانی و تعداد نرون‌های خروجی است. تعداد نرون‌های ورودی معمولا بع تعداد ابعاد ویژگی داده است. در این مثال برای خروجی می‌توان ۱۰ نرون( تعداد کلاس‌ها) در نظر گرفت. هر نرون خروجی را به یک کلاس اختصاص می‌دهیم. زمانی که هر عکس را به عنوان ورودی وارد می‌کنیم سعی می‌کنیم وزن‌ها طوری تنظیم شوند که خروجی نرون مربوط به کلاس عکس مقدار نزدیک به یک و بقیه نرون‌های خروجی مقداری نزدیک به صفر داشته باشند. به این ترتیب بعد از اینکه شبکه آموزش دید، با وارد کردن یک عکس جدید به عنوان ورودی انتظار داریم از ۱۰ نرون خروجی یک نرون دارای مقدار نزدیک به یک و بقیه نرون‌ها دارای مقادیری نزدیک به صفر داشته باشند. کلاسی که مربوط به نرون با مقدار مزدیک به یک است، کلاس عکس ورودی را مشخص می‌کند.

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