هنگام آموزش شبکه های عصبی عمیق ، کاهش نرخ یادگیری با پیشرفت آموزش اغلب مفید است. این کار را می توان با استفاده از برنامه های نرخ یادگیری از پیش تعریف شده یا روش های نرخ یادگیری تطبیقی انجام داد. در این مقاله ، من با استفاده از برنامه های مختلف نرخ یادگیری و روش های نرخ یادگیری تطبیقی برای مقایسه عملکرد مدل آنها ، یک شبکه عصبی حلقوی را در CIFAR-10 آموزش می دهم.
برنامه های نرخ یادگیری
برنامه های نرخ یادگیری به دنبال تنظیم نرخ یادگیری در طول آموزش با کاهش نرخ یادگیری با توجه به یک برنامه از پیش تعریف شده است. برنامه های نرخ یادگیری مشترک شامل پوسیدگی مبتنی بر زمان ، پوسیدگی مرحله و پوسیدگی نمایی است. برای اهداف مصور ، من با استفاده از الگوریتم بهینه سازی شیب تصادفی (SGD) با برنامه های مختلف نرخ یادگیری برای مقایسه عملکرد ، یک شبکه عصبی حلقوی آموزش دیده در CIFAR-10 ایجاد می کنم.
نرخ یادگیری مداوم
نرخ یادگیری مداوم برنامه پیش فرض نرخ یادگیری در SGD Optimizer در KERAS است. حرکت و نرخ پوسیدگی هر دو به طور پیش فرض روی صفر تنظیم می شوند. انتخاب نرخ یادگیری مناسب دشوار است. با آزمایش با دامنه نرخ یادگیری در مثال ما ، LR = 0. 1 عملکرد خوب نسبی را برای شروع نشان می دهد. این می تواند به عنوان یک پایه برای ما باشد تا بتوانیم استراتژی های مختلف نرخ یادگیری را آزمایش کنیم.
پوسیدگی مبتنی بر زمان
شکل ریاضی پوسیدگی مبتنی بر زمان LR = LR0/(1+KT) است که LR ، K آنها هایپرپارامتری هستند و T تعداد تکرار است. با نگاهی به کد منبع Keras ، SGD Optimizer آرگومان های پوسیدگی و LR را می گیرد و میزان یادگیری را با یک عامل کاهش دهنده در هر دوره به روز می کند.
حرکت یکی دیگر از استدلالهای SGD بهینه ساز است که می توانیم برای دستیابی به همگرایی سریعتر تغییر شکل دهیم. بر خلاف SGD کلاسیک ، روش حرکت به وکتور پارامتر کمک می کند تا سرعت را در هر جهت با نزول شیب ثابت ایجاد کند تا از نوسانات جلوگیری شود. یک انتخاب معمولی از حرکت بین 0. 5 تا 0. 9 است.
SGD Optimizer همچنین دارای استدلالی به نام Nesterov است که به طور پیش فرض روی کاذب تنظیم شده است. Nesterov Momentum نسخه متفاوتی از روش حرکت است که دارای ضمانت های همگرا نظری قوی تر برای توابع محدب است. در عمل ، کمی بهتر از حرکت استاندارد کار می کند.
در KERA ها ، ما می توانیم با تعیین نرخ یادگیری اولیه ، میزان پوسیدگی و حرکت در SGD بهینه ساز پوسیدگی مبتنی بر زمان را اجرا کنیم.
پوسیدگی
برنامه کاهش گامها نرخ یادگیری را هر چند دوره یک بار کاهش میدهد. شکل ریاضی فروپاشی پله ای به شرح زیر است:
یک راه معمولی کاهش نرخ یادگیری به نصف در هر 10 دوره است. برای پیادهسازی این در Keras، میتوانیم یک تابع واپاشی مرحله تعریف کنیم و از LearningRateScheduler callback استفاده کنیم تا تابع واپاشی گام را به عنوان آرگومان بگیریم و نرخهای یادگیری بهروز شده را برای استفاده در بهینهساز SGD برگردانیم.
به عنوان یک انحراف، یک فراخوان مجموعه ای از توابع است که در مراحل معینی از روند آموزشی اعمال می شود. میتوانیم از callbacks برای مشاهده وضعیتهای داخلی و آمار مدل در طول آموزش استفاده کنیم. در مثال ما، ما یک callback سفارشی را با گسترش کلاس پایه keras. callbacks. Callback برای ثبت تاریخچه از دست دادن و نرخ یادگیری در طول مراحل آموزشی ایجاد می کنیم.
با کنار هم قرار دادن همه چیز، میتوانیم فهرستی از تماسهای برگشتی متشکل از LearningRateScheduler و پاسخ به تماس سفارشیمان را برای تناسب با مدل ارسال کنیم. سپس میتوانیم با دسترسی به loss_history. lr و loss_history. losses، زمانبندی نرخ یادگیری و تاریخچه ضرر را تجسم کنیم.
فروپاشی نمایی
یکی دیگر از برنامه های رایج، زوال نمایی است. شکل ریاضی lr = lr0 * e^(−kt) دارد که lr، k فراپارامترها هستند و t عدد تکرار است. به طور مشابه، میتوانیم این را با تعریف تابع واپاشی نمایی پیادهسازی کنیم و آن را به LearningRateScheduler ارسال کنیم. در واقع، با استفاده از این رویکرد، میتوان هر زمانبندی فروپاشی سفارشی را در Keras پیادهسازی کرد. تنها تفاوت در تعریف یک تابع واپاشی سفارشی متفاوت است.
اجازه دهید اکنون دقت مدل را با استفاده از برنامه های مختلف نرخ یادگیری در مثال خود مقایسه کنیم.
روشهای نرخ یادگیری تطبیقی
چالش استفاده از زمانبندی نرخ یادگیری این است که فراپارامترهای آنها باید از قبل تعریف شوند و به شدت به نوع مدل و مسئله بستگی دارند. مشکل دیگر این است که نرخ یادگیری یکسان برای همه به روز رسانی پارامترها اعمال می شود. اگر داده های کمی داریم، ممکن است بخواهیم به جای آن پارامترها را در ابعاد مختلف به روز کنیم.
الگوریتمهای نزولی گرادیان تطبیقی مانند Adagrad، Adadelta، RMSprop، Adam، جایگزینی برای SGD کلاسیک ارائه میدهند. این روشهای نرخ یادگیری هر پارامتر، رویکرد اکتشافی را بدون نیاز به کار پرهزینه در تنظیم فراپارامترها برای زمانبندی نرخ یادگیری به صورت دستی ارائه میکنند.
به طور خلاصه ، ADAGRAD به روزرسانی های بزرگتر را برای پارامترهای پراکنده تر و به روزرسانی های کوچکتر برای پارامترهای کم پراکنده انجام می دهد. این عملکرد با داده های پراکنده و آموزش شبکه عصبی در مقیاس بزرگ عملکرد خوبی دارد. با این حال ، میزان یادگیری یکنواخت آن معمولاً بسیار پرخاشگر است و هنگام آموزش شبکه های عصبی عمیق ، یادگیری را خیلی زود متوقف می کند. Adadelta گسترش Adagrad است که به دنبال کاهش میزان یادگیری تهاجمی و یکنواخت آن است. RMSProp روش ADAGRAD را به روشی بسیار ساده در تلاش برای کاهش میزان یادگیری تهاجمی و یکنواخت خود تنظیم می کند. آدم به روزرسانی بهینه ساز RMSProp است که مانند RMSProp با حرکت است.
در KERA ها ، ما می توانیم این الگوریتم های یادگیری تطبیقی را به راحتی با استفاده از بهینه سازهای مربوطه پیاده سازی کنیم. معمولاً توصیه می شود که بیش از حد پارامترهای این بهینه سازها را در مقادیر پیش فرض خود (به جز LR گاهی اوقات) بگذارید.
بگذارید اکنون با استفاده از روشهای مختلف نرخ یادگیری تطبیقی ، عملکرد مدل را بررسی کنیم. در مثال ما ، Adadelta بهترین دقت مدل را در بین سایر روشهای نرخ یادگیری تطبیقی ارائه می دهد.
سرانجام ، ما عملکرد تمام برنامه های نرخ یادگیری و روش های نرخ یادگیری تطبیقی را که در مورد آنها بحث کرده ایم مقایسه می کنیم.
نتیجه
در بسیاری از مثالها که من روی آن کار کرده ام ، روشهای نرخ یادگیری تطبیقی عملکرد بهتری نسبت به برنامه های نرخ یادگیری نشان می دهد و آنها در تنظیمات HyperParamater به تلاش بسیار کمتری نیاز دارند. ما همچنین می توانیم از LearningRatesCheduler در KERA استفاده کنیم تا برنامه های نرخ یادگیری سفارشی ایجاد کنیم که مختص مشکل داده ما باشد.
برای خواندن بیشتر ، مقاله Yoshua Bengio توصیه های عملی بسیار خوبی را برای تنظیم میزان یادگیری برای یادگیری عمیق ارائه می دهد ، مانند نحوه تعیین میزان یادگیری اولیه ، اندازه مینی دسته ، تعداد دوره ها و استفاده از توقف زودرس و حرکت.