نحوه تنظیم پارامترهای شبکه عصبی در پروژه های عملی


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

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

نکته: این توضیحات برای شبکه های عصبی با قانون یادگیری نظارتی هست(مسائل طبقه بندی یا رگرسیون).

در این مقاله، میخواهیم به این سوال ساده جواب دهیم: چیکار کنیم شبکه عصبی در پروژه ما درست کار کنه؟ یا چه عواملی میتوانند علمکرد شبکه را تحت تاثیر قرار دهند!

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

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

 

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

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

محدب یا نامحدب

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

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

دلیل اول: تعیین لیبلهای نامناسب برای پایگاه داده

یکی از دلایلی که ممکن است باعث شود شبکه عصبی در پروژه ما خوب کار نکند تعریف نامناسب لیبلها است! در خیلی از موارد، ما همان ابتدای کار لیبلهای مناسبی برای شبکه عصبی تعریف نمی‌کنیم، و بعدش با یک سری لیبلهای نامناسب شبکه را آموزش میدهیم! بعدش میبنیم که شبکه عصبی اصلا درست کار نمیکنه و بعدش شروع میکنیم به تغییر پارامترهای مختلف شبکه یا تغییر ساختار آن! اگر لیبل مناسب نباشد، هیچ راهی وجود نداره که شبکه درست کار کنه! اگر لیبل مناسب نباشد، شما از شبکه عصبی میخواهید لیبلی تولید کند که از لحاظ فنی شبکه توان تولید چنین خروجی ندارد!

خب چطور لیبل مناسب برای شبکه عصبی انتخاب کنیم؟

به تابع فعال نورونهای لایه خروجی شبکه نگاه کنید و براساس آن لیبل تعریف کنید. برای مثال اگر تابع فعال نورونهای لایه خروجی tanh باشد:

تابع فعال tanh

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

  • لیبل کلاس یک: +1
  • لیبل کلاس دو: -1

در چندکلاسه هم همین روال هست. مقادیر یک و منفی یک در نظر میگیرم!

برای مثال اگر تابع فعال نورونهای لایه خروجی شبکه عصبی tanh باشد شما نمی‌توانید لیبل 2 برای داده ها در نظر بگیرید، اگر 2 در نظر بگیرید شبکه هیچ وقت خروجی 2 تولید نخواهد کرد و در نتیجه یاد نخواهد گرفت.

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

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

دلیل دوم: پایگاه داده نامناسب

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

ویژگی های بد

خب چطور میشه متوجه شد که داده مناسب هست یا نه؟

  • راه اول: تحلیل تفکیک پذیری داده به صورت چشمی

اگر تعداد ویژگی ها 3 یا کمتر از 3 باشد، میتوانیم در فضای دو بعدی یا سه بعدی داده های هر گروه را با رنگ متفاوتی رسم کنیم، و میزان تفکیک پذیری آنها را بررسی کنیم! در این حالت چون تعداد ویژگی ها کم هست، میتوان به صورت چشمی از تفکیک پذیری داده اطمینان پیدا کرد!

  • راه دوم: استفاده از سایر مدلها

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

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

ولی اگه هیچ کدام از مدلها خوب عمل نکردند، به این نتیجه میرسم که مشکل از شبکه عصبی نیست و پایگاه داده مناسب نیست!  اگر استخراج ویژگی را خودم انجام داده باشم، میرم سراغ استخراج ویژگی‌های مناسب تر!

معمولا  از مدلهایی مثل KNN، LDA ، TREE و SVM برای طبقه بند استفاده میکنم.

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

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

 

دلیل سوم: مقدار دهی نامناسب وزنهای اولیه نورونها

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

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

 

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

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

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

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

برخی موارد با بررسی MSE(میانگین مربعات خطا)  فکر میکنیم که شبکه به حالت پایدار رسیده و روند آموزش را تمام می‌کنیم، خودم یادمه در یک پروژه ای تعداد تکرار آموزش را 100 گذاشته بودم و میدیدم که مقدار MSE شبکه بعد تکرار پنجاه یک مقدار ثابتی میرسد و این برداشت رو میکردم که شبکه نیازی به تکرار آموزش بیشتر ندارد. و تعداد 100 مناسبه است. یادمه یکبار شانسی تعداد تکرار آموزش را 2000 گذاشتم و در عین ناباوری دیدم که میزان MSE بعد تکرار 500 یهو کمتر شد! برای همین پیشنهادم اینه که تعداد تکرارهای آموزش را برای یکبار هم که شده خیلی بزرگ در نظر بگیرید و ببینید چه اتفاقی میافتد!

 

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

دلیل پنجم: نرمال نبودن ویژگی ها

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

رابطه نرمال کردن داده

با اینکار اهمیت همه ویژگی ها برای شبکه عصبی یکسان میشود و از طرفی رنج مقدار ویژگی ها کوچک میشوند و همه اینا تاثیر مثبتی در یادگیری شبکه عصبی می گذارند.

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

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

شبکه عصبی چندلایه

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

 

نکته اول: اینو به خاطر داشته باشید، وقتی ساختار شبکه تغییر میدهید، سایر پارامترها مثل نرخ یادگیری هم تحت تاثیر قرار میگیرند و باید آنها را نیز تغییر دهید. یعنی اگر یک نرخ یادگیری برای شبکه عصبی دو لایه مناسب باشد، لزوما برای سه لایه هم مناسب نیست!

 

نکته دوم: حتی اگر شبکه شما خوب کار میکند، برای رسیدن به جواب بهینه تر، عوامل تاثیر گذاری که توضیح دادیم را بررسی کنید. با تعیین مناسب پارامترهای شبکه عصبی، میتوانید نتیجه را مطلوب تر هم بکنید!

 



در دوره جامع شبکه‌های عصبی، تمام موارد با جزئیات کامل آموزش داده شده اند. اگر دنبال یادگیری تخصصی شبکه های عصبی هستید حتما دوره را نگاه کنید. این دوره اولین دوره ی تخصصی در ایران هست که در آن تمامی شبکه های عصبی به صورت مرحله به مرحله پیاده سازی شده اند! در این دوره، در ابتدا تئوری شبکه های عصبی طبق کتاب مرجع Simon Heykins آموزش داده می شوند و سپس به صورت مرحله به مرحله پیاده سازی می شوند. در ادامه برای درک بهتر شبکه ها چندین مثال ساده انجام می شود . و در نهایت چندین پروژه عملی با شبکه عصبی انجام می شود تا هم با کاربرد عملی شبکه عصبی و هم با چالشهای انجام پروژه های عملی آشنا شوید.

موفق باشید


دیدگاه ها

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

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

code