رفتن به نوشته‌ها

فرق بین پارامتر و هایپرپارامتر چیست؟

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

اگر با شبکه‌های عصبی کار کرده‌ باشید احتمالا میدونید که هر شبکه معمولا از یک سری وزن (weight که با w نشان داده میشود) و بایاس (bias که با b نمایش داده میشود) تشکیل شده است. مثلا شبکه عصبی زیر رو در نظر بگیرید:

شما به عنوان طراح شبکه مشخص می‌کنید که این شبکه یک لایه مخفی (hidden layer) با دو نورون، یک لایه خروجی (output layer) با دو نورون و یک لایه ورودی (input layer) با دو نورون داشته باشد. در این شبکه w_1 تا w_8  و b_1 و b_2 به ترتیب وزن‌ها و بایاس شبکه هستند. این موارد (bias و weight) قرار است که مستقیما توسط شبکه یاد گرفته شوند. یعنی وظیفه شبکه است که مقدار مناسب برای این موارد را پیدا کند. مثلا شبکه باید بفهمه که بهترین مقدار برای w_1 مساوی 0.12183 است و شما عملا نقشی در تعیین مقدار آنها ندارید.

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

فکر کنم الان حدس زدید که فرق بین پارامتر و هایپر پارامتر چیه؟ اون مواردی که شبکه قرار است مستقیم یاد بگیره و ما تقریبا در آن نقشی نداریم میگن پارامتر (مثل w, b). اون مواردی که ما خودمان در تعیین‌ مقدار آنها نقش داریم (مثل تعداد لایه‌های مخفی، تعداد نورون‌ها در هرلایه، نرخ یادگیری (learning rate)، نوع تابع فعالیت (activation function)) میگن هایپرپارامتر.

 

اگر با مدل‌های شبکه عصبی کار کرده باشید میدونید که تعیین هایپرپارامترهای شبکه کار سختی (زمانبر) است و یه جورایی به اندازه مهندسی  ویژگی (feature engineering) وقت و هزینه از شما میگیره. بخاطر همین اغلب مقالات از روش‌هایی مثل جستجوی حریصانه یا جستجوی تصادفی (Grid Search و یا Randomize Search) استفاده می‌کنند که خب معایب خودشو داره.

اینکه چطور هایپرپارامترهای شبکه رو به طور اتوماتیک انتخاب کنیم یا به نحوی خود شبکه آنها را یاد بگیرد یکی از زمینه‌های تحقیقاتی چالش برانگیز و در عین حال جذاب محسوب می‌شود. به عبارت دیگر، در هنگام آموزش شبکه عصبی ما به صورت چرخشی (iterative) دائما پارامترهای شبکه (w و b) را با کمک گرادیان آنها رو به روزرسانی می‌کنیم. چرا خب همین کار و برای نرخ یادگیری، تعداد لایه‌ها و … انجام ندیم؟

یکی از مقالاتی که در سال ۲۰۱۶ در این زمنیه به چاپ رسیده DrMAD نام دارد. نویسندگان مقاله ادعا می‌کنند که اولین کار عملی (practical) انجام شده در این زمینه است (قبل از آنها چند نفر دیگر روی همین زمینه کار کردند).

ایده‌ای که مطرح کردند این است که SGD را برای پارامترها اعمال کنند و یک مقدار مناسبی برای آنها (w و b) به دست میارن. سپس گرادیان هایپرپارامترها رو به دست میارند (اصطلاحا اونها هایپرگرادیان نام‌گذاری کرده است) و سپس با کمک این هایپرگرادیان‌ها به روزرسانی را انجام میدهد.

نتیجه‌ای که در این مقاله گرفتند این بوده است که برای بهینه کردن هایپرپارامترها حدود ۴۵ برابر نسبت به روشهای مدرن سریع‌تر است و حدود ۱۰۰ برابر حافظه کمتری لازم دارد. البته نکته‌ای که وجود داره این روش رو فقط روی MNIST تست کردن و روی دادگان دیگه جز کارهای آتی شون زدند.

منتشر شده در آموزشیادگیری عمیقیادگیری ماشین

نظر

  1. عالی بود ممنون.
    مطالب سایت خیلی مفید است.

    • هادیفر هادیفر

      متشکرم 🙂

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

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