بهبود مدل و جلوگیری از Overfitting

بهبود مدل و جلوگیری از Overfitting


اگر دقت مدل در ابتدا مقدار کمی داشته باشد؛ اما خیلی سریع به دقت مطلوب برسد، یا اگر val_accuracy در ابتدا پایین باشد ولی بعد از چند epoch به 100 درصد برسد و یا اگر افت شدید loss مشهود باشد، مدل شما دچار بیش برازش شده (Overfitting) است. این یعنی مدل شما داده های آموزشی را حفظ کرده و به جای یادگیری کلی(Generalization)، صرفاً روی همان داده ها تنظیم شده است. در نتیجه، در دنیای واقعی و روی داده های جدید، عملکرد خوبی نخواهد داشت؛ در ادامه راهکارهای پیشنهادی را بررسی خواهیم کرد:


راهکارهای پیشنهادی برای بهبود مدل

  • افزایش داده‌های آموزشی (Augmentation Data): اگر مجموعه داده شما کوچک است، می توانید از Augmentation Data مانند چرخش، کشیدگی، نویز، تغییر کنتراست استفاده کنید.
  • افزایش Dropout:Dropout یک تکنیک Regularization است که برای جلوگیری از Overfitting در مدل های عمیق استفاده می شود. افزایش مقدار آن می تواند به بهبود عمومی سازی (Generalization)مدل کمک کند، اما مقدار آن باید با دقت تنظیم شود. در مدل های پیچیده، شبکه تمایل دارد تا الگوهای خاصی از داده های آموزشی را حفظ کند، به جای اینکه الگوهای کلی و عمومی را یاد بگیرد. این موضوع باعث می شود که عملکرد مدل روی داده های تست و دنیای واقعی ضعیف شود. افزایش Dropout باعث می شود که نورون های تصادفی غیرفعال شوند و وابستگی بیش از حد مدل به برخی ویژگی ها کاهش یابد. اگر مدل در هر بار آموزش تنها به تعداد محدودی از نورون ها وابسته شود، در زمان تست نمی تواند همان عملکرد را بازتولید کند. Dropout این مشکل را کاهش می دهد. با افزایش Dropout، مدل وابستگی به نورون های خاص را کم می کند و مجبور می شود که ویژگیهای کلی تری از داده ها را یاد بگیرد. مقدار Dropout نباید بیش ازحد زیاد باشد، زیرا ممکن است باعث کم آموزی (Underfitting)شود. برای لایه های CNN مقدار 0.3 الی 0.4، برای لایه های LSTM مقدار 0.4 الی 0.5 و برای لایه های Dense مقدار 0.3 استفاده می شود. هرچند که این مقادیر بهتر است با آزمون و خطا در سورس کد خودتان بدست بیاید.
  • استفاده از Early Stopping:باعث می شود مدل در بهینه ترین نقطه خود متوقف شود. در بسیاری از موارد، مدل در چند epoch اول دقت داده های آموزش را افزایش می دهد و هم زمان دقت داده های اعتبارسنجی نیز بهبود می یابد. اما پس از مدتی، مدل شروع به حفظ ویژگی های خاص مجموعه آموزش می کند و عملکرد آن روی داده های تست کاهش می یابد. وقتی مدل متوجه شود که دقت مجموعه اعتبارسنجی بهبود نمی یابد(و حتی کاهش پیدا می کند)، آموزش را متوقف می کند تا جلوی Overfitting گرفته شود.
  • استفاده از Regularization (L1, L2):در L2، مدل تلاش می کند که وزن های بزرگ را کاهش دهد و آنها را نزدیک به صفر نگه دارد. این باعث می شود مدل عمومی تر (generalizable) باشد و بهتر روی داده های جدید کار کند. از مزایای آن می توان به کاهش پیچیدگی مدل، جلوگیری از overfitting، حفظ همه ویژگی ها(ولی با مقدار کم) اشاره کرد. از طرف دیگر در L1، بعضی از وزن ها کاملا صفر می شوند، یعنی بعضی ویژگی ها حذف می شوند. این روش به انتخاب ویژگی های مهم کمک می کند. از مزایای آن میتوان به کاهش بعد داده ها، حذف ویژگی های کم اهمیت، و جلوگیری از overfitting اشاره کرد. پس می توان گفت که در حالت کلی، L2 برای کاهش پیچیدگی مدل و افزایش تعمیم پذیری بهتر بوده و L1 برای انتخاب ویژگی های مهم و کاهش ابعاد مفید است.در معماری CNN معمولا از L2 استفاده می شود چون مدل های CNN با تعداد ویژگی های زیاد کار می کنند و حذف کامل ویژگی ها ممکن است مشکل ایجاد کند؛ که معمولا در لایه های Dense و Conv2D اضافه می شود.
  • استفاده از Adam: اگر optimizer تان مثلا SGD بود، بد نیست که Adam را هم تست کنید؛ چرا که SGD به روزرسانی وزن ها را با نرخ یادگیری ثابت انجام می دهد. که مشکل اصلی آن، همگرایی کند و حساسیت به نرخ یادگیری است. اما در نقطه مقابل، Adam نرخ یادگیری را برای هر وزن به صورت پویا تنظیم میکند. که مزیت اصلی آن، همگرایی سریعتر و کارایی بهتر در مدل های پیچیده مثل CNN و LSTM است.
  • اضافه کردن Batch Normalization: اضافه کردنBatch Normalization بعد از لایه های کانولوشنی باعث می شود مدل پایدارتر شود؛ بدین صورت که: به تثبیت توزیع ورودی ها در هر لایه کمک می کند و باعث یادگیری سریع تر مدل می شود. بدون Batch Normalization، مدل به مقدار اولیه وزن ها حساسیت بالایی دارد و ممکن است یادگیری خوبی نداشته باشد. نرمال سازی ورودی ها به بهبود پایداری گرادیان کمک کرده و از گیر افتادن در مینیمم های محلی جلوگیری می کند. و در نهایت می توان گفت که مشابه Dropout، تا حدی نقش منظم کننده (Regularizer) را دارد و از بیش برازش جلوگیری می کند. به عنوان یک نکته توجه داشته باشید که Batch Normalization باید بعد از MaxPooling باشد، نه قبل از آن.
  • کاهش Learning Rate: اگر یادگیری خیلی سریع اتفاق می افتد، بهتر است نرخ یادگیری را کاهش دهیم. کاهش بهینه این پارامتر نتیجه های خوبی دارد؛ از جمله: جلوگیری از نوسانات بیش از حد در یادگیری: اگر نرخ یادگیری زیاد باشد، مدل ممکن است به جای همگرایی (convergence) روی مقدار بهینه، نوسان کند و در نقاط مختلف گیر بیفتد. کاهش تدریجی آن کمک می کند تا مدل آرام تر و دقیق تر به مقدار بهینه نزدیک شود. بهبود دقت مدل در اواخر آموزش: اوایل آموزش، نرخ یادگیری بالاتر کمک می کند مدل سریعتر به یک مقدار مناسب برسد، اما در مراحل پایانی، مقدار یادگیری کمتر کمک می کند که مدل روی بهترین نقطه همگرا شده و از نوسانات نهایی جلوگیری کند. جلوگیری از گیر افتادن در مینیمم های محلی ضعیف: در اوایل آموزش، مقدار یادگیری زیاد باعث می شود مدل از مینیمم های محلی ضعیف عبور کند و بعد از آن، مقدار کمتر کمک می کند که در مینیمم سراسری به درستی تثبیت شود.
    روش هایی برای کاهش نرخ یادگیری در طول آموزش:
    ReduceLROnPlateau: اگر مدل روی مقدار مشخصی گیر کند، مقدار یادگیری را کاهش می دهد.
    Exponential Decay: به صورت نمایی مقدار یادگیری را کاهش می دهد.
    Step Decay: هر چند epoch یکبار مقدار یادگیری را کاهش می دهد.
    Cosine Annealing: مقدار یادگیری را بر اساس تابع کسینوس تغییر می دهد.

  • افزایش تعداد فیلترهای Convolutional: افزایش تعداد فیلترها در لایه های Convolutional میتواند قدرت مدل را افزایش دهد، اما باید با دقت تنظیم شود تا از مشکلاتی مانند افزایش بیش از حد پارامترها، زمان پردازش و احتمال بیش برازش جلوگیری شود. تعداد بیشتر فیلترها به مدل این امکان را می دهد که ویژگی های متنوع تری مثل لبه ها، الگوهای کوچک، بافت ها و ویژگی های سطح بالا را یاد بگیرد. با داشتن تعداد فیلتر بیشتر، مدل توانایی یادگیری نمایش های قویتری از داده ها را پیدا می کند که می تواند در بهبود دقت مؤثر باشد. معمولا در لایه های اول تعداد فیلترها کمتر است (مثل 32 یا 64) و در لایه های عمیق تر افزایش پیدا می کند(مثل 128 یا 256).

نویسندگان: علی محرم زاده، علیرضا جعفرنژاد

برای دانلود این PDF روی دکمه زیر کلیک کنید

دانلود PDF