→ بازگشت به شبکه‌های پیش‌آموزش‌دیده و یادگیری انتقالی

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

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

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

نگهداری مقادیر در بازه معقول

برای حصول اطمینان از محاسبات عددی پایدارتر، ضروری است که تمامی مقادیر درون شبکه عصبی ما در مقیاس معقولی قرار داشته باشند، که معمولاً بین [-1..1] یا [0..1] است. این یک الزام بسیار سختگیرانه نیست، اما طبیعت محاسبات نقطه شناور به گونه‌ای است که مقادیر با اندازه‌های مختلف نمی‌توانند به طور دقیق با یکدیگر ترکیب شوند. به عنوان مثال، اگر ما 10-10 و 1010 را جمع کنیم، ممکن است فقط 1010 را بدست آوریم، زیرا مقدار کوچک‌تر "به همان مرتبه" مقدار بزرگ‌تر تبدیل می‌شود و در نتیجه مانتیسا از دست می‌رود.

بیشتر توابع فعال‌سازی غیرخطی دارای دامنه‌ای در حدود [-1..1] هستند، لذا منطقی است که تمامی داده‌های ورودی را در بازه [-1..1] یا [0..1] مقیاس‌بندی کنیم.

مقداردهی اولیه وزن‌ها

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

توزیع نرمال N(0,1) گزینه مناسبی نیست، زیرا اگر ورودی‌های ما n باشند، انحراف معیار خروجی n خواهد بود و احتمالاً مقادیر از بازه [0..1] خارج خواهند شد.

مقداردهی‌های اولیه زیر معمولاً استفاده می‌شوند:

  • توزیع یکنواخت -- uniform
  • N(0,1/n) -- gaussian
  • N(0,1/√n_in) تضمین می‌کند که برای ورودی‌های با میانگین صفر و انحراف معیار 1، میانگین و انحراف معیار حفظ خواهد شد.
  • N(0,√2/(n_in+n_out)) -- به اصطلاح مقداردهی اولیه زاویر (glorot)، که کمک می‌کند سیگنال‌ها در دامنه مناسب در طول انتشار پیش و پس حفظ گردند.

نرمال‌سازی دسته‌ای

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

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

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

دراپ اوت

دراپ اوت یک تکنیک جالب است که درصدی از نورون‌های تصادفی را در طول آموزش حذف می‌کند. این تکنیک به عنوان یک لایه با یک پارامتر (درصد نورون‌هایی که باید حذف شوند، معمولاً بین 10 تا 50 درصد) پیاده‌سازی می‌شود و در حین آموزش، برخی عناصر تصادفی از بردار ورودی را صفر کرده و قبل از ارسال به لایه بعدی، آن را پیش‌پردازش می‌کند.

اگرچه ممکن است این ایده عجیب به نظر برسد، می‌توانید تأثیر دراپ اوت را بر آموزش طبقه‌بند ارقام MNIST در نوت‌بوک Dropout.ipynb مشاهده کنید. این روش به تسریع آموزش کمک کرده و به ما امکان می‌دهد که دقت بیشتری را در دوره‌های آموزشی کمتری به دست آوریم.

این اثر را می‌توان به چندین روش تفسیر کرد:

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

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

جلوگیری از بیش‌برازش

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

حتماً اطمینان حاصل کنید که مفهوم بیش‌برازش را که قبلاً معرفی کرده‌ایم، درک کرده‌اید!

چندین روش برای جلوگیری از بیش‌برازش وجود دارد:

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

بهینه‌سازها / الگوریتم‌های آموزشی

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

در یادگیری عمیق، ما از کاهش گرادیان تصادفی (SGD) استفاده می‌کنیم که کاهش گرادیان اجرا شده بر مینی‌دسته‌ها، به‌طور تصادفی انتخاب‌شده از مجموعه آموزشی است. وزن‌ها با استفاده از فرمول زیر تنظیم می‌شوند:

wt+1 = wt - η∇ℒ

مومنتوم

در مومنتوم SGD، ما بخشی از گرادیان را از مراحل قبل حفظ می‌کنیم. این مشابه این است که ما با لختی حرکت می‌کنیم و وقتی به سمت دیگری ضربه می‌زنیم; مسیر ما بلافاصله تغییر نمی‌کند، بلکه بخشی از حرکت اولیه را نگه می‌دارد. در اینجا یک بردار دیگر v معرفی می‌شود تا سرعت را نشان دهد:

vt+1 = γ vt - η∇ℒ

wt+1 = wt+vt+1

در اینجا پارامتر γ نشان‌دهنده میزان توجه ما به لختی است: γ=0 معادل با SGD کلاسیک است; و γ=1 معادله حرکتی خالص می‌باشد.

آدام (Adam)، آداگراد (Adagrad) و غیره

از آنجا که در هر لایه سیگنال‌ها با برخی ماتریس‌ها Wi ضرب می‌شوند، بسته به ||Wi||، گرادیان ممکن است یا کاهش یابد و به 0 نزدیک شود، یا به طرز بی‌نهایتی بالا برود. این جوهر مشکل گرادیان‌های انفجاری/ناپدیدشونده است.

یکی از راه‌حل‌های این مشکل استفاده از تنها جهت گرادیان در معادله و نادیده گرفتن مقدار مطلق آن است، یعنی:

wt+1 = wt - η(∇ℒ/||∇ℒ||), where ||∇ℒ|| = √∑(∇ℒ)2

این الگوریتم آداگراد نامیده می‌شود. الگوریتم‌های دیگری که از همین ایده استفاده می‌کنند شامل RMSProp و آدام هستند.

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

برش گرادیان

برش گرادیان ایده‌ای گسترش یافته‌ای از ایده فوق است. وقتی ||∇ℒ|| ≤ θ، ما گرادیان اولیه را برای بهینه‌سازی وزن در نظر می‌گیریم و زمانی که ||∇ℒ|| > θ گرادیان را بر اساس نُرم آن تقسیم می‌کنیم. در اینجا θ یک پارامتر است، که در اکثر موارد می‌توانیم θ=1 یا θ=10 در نظر بگیریم.

کاهش نرخ یادگیری

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

این امر می‌تواند با ضرب کردن η در یک عدد (مثلاً 0.98) پس از هر دوره آموزشی انجام شود، یا با استفاده از برنامه زمانبندی نرخ یادگیری پیچیده‌تر.

معماری‌های متفاوت شبکه

انتخاب معماری مناسب برای شبکه با توجه به مسئله شما می‌تواند دشوار باشد. معمولاً ما معماری‌ای را انتخاب می‌کنیم که برای کار خاص (یا مشابه) ما آزمایش و تأیید شده است. اینجا یک مرور جامع از معماری‌های شبکه‌های عصبی برای بینایی کامپیوتری وجود دارد.

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

روش مناسب دیگری این است که از معماری‌ای استفاده کنید که به طور خودکار به پیچیدگی مورد نیاز سازگار شود. به نوعی، معمارهای ResNet و Inception خودتنظیم هستند. بیشتر در مورد معماری‌های بینایی کامپیوتری