Как бороться с переобучением в задачах CV?

Переобучение (overfitting) — это ситуация, когда модель показывает отличные результаты на обучающих данных, но плохо обобщается на новых, ранее не виденных примерах. В задачах компьютерного зрения (CV) переобучение особенно актуально, поскольку изображения могут иметь множество мелких деталей и легко «запоминаться» моделью. Борьба с переобучением — это систематическое применение различных техник, которые помогают улучшить обобщающую способность модели.

1. Аугментация данных (Data Augmentation)

Позволяет увеличить разнообразие обучающих данных, не меняя их сути.

Техники:

  • Геометрические трансформации: поворот, отражение, сдвиг, масштабирование, обрезка, perspective warp

  • Фотометрические: изменение яркости, контрастности, насыщенности, гамма-коррекция, шум

  • Эластичная деформация (особенно полезна в медицине)

  • Cutout / Random Erasing: случайное замазывание фрагментов изображения

  • MixUp / CutMix: линейное или пространственное смешивание изображений и их меток

Инструменты: Albumentations, torchvision.transforms, Keras ImageDataGenerator

2. Регуляризация

Методы, ограничивающие сложность модели.

L2-регуляризация (weight decay)

Добавляет штраф за большие веса:

Loss=OriginalLoss+λ∑w2\text{Loss} = \text{OriginalLoss} + \lambda \sum w^2

  • Предотвращает чрезмерно «острые» решения.

  • Обычно включается как параметр оптимизатора.

Dropout

  • Случайное "обнуление" нейронов во время обучения с вероятностью p (например, 0.5).

  • Предотвращает избыточную зависимость от отдельных нейронов.

  • Используется в основном в fully-connected слоях, но возможно и в сверточных (SpatialDropout).

Label Smoothing

  • Вместо one-hot метки используется смягчённая:

    • Например, вместо [0, 1, 0] → [0.1, 0.8, 0.1]
  • Делает модель менее уверенной и улучшает обобщение.

3. Контроль за обучением

Early Stopping

  • Прекращение обучения, если метрика на валидации не улучшается в течение N эпох.

  • Требует выделенной валидационной выборки.

  • Помогает избежать переобучения на поздних этапах.

Меньше эпох

  • Иногда модель начинает переобучаться после достижения минимума ошибки.

  • Регулярное логгирование метрик помогает это отследить.

4. Архитектурные приёмы

Простая архитектура

  • Не всегда глубокая и сложная сеть — это лучше.

  • Меньшее количество параметров → ниже риск переобучения.

Батч-нормализация (BatchNorm)

  • Стабилизирует распределение активаций.

  • Улучшает сходимость и даёт лёгкую регуляризацию.

  • Часто заменяет или дополняет Dropout.

5. Больше данных

Собрать больше изображений

  • Идеальный способ предотвратить переобучение — это увеличение размера датасета.

  • Можно использовать веб-краулеры, синтетические данные (SMOTE, GANs), генераторы 3D-рендеров.

Transfer Learning

  • Использование предобученных моделей (например, ResNet, EfficientNet) с дообучением на целевой задаче.

  • Позволяет уменьшить требования к размеру датасета.

  • Возможные режимы:

    • Тонкая настройка (fine-tuning)

    • Фиксация всех слоёв, кроме последнего

6. Кросс-валидация (Cross-validation)

  • Разбиение датасета на несколько частей и обучение на разных подмножествах.

  • Особенно важно при малом объёме данных.

  • K-Fold или StratifiedKFold — для сбалансированного представления классов.

7. Сбалансированные данные

Решение проблемы дисбаланса классов

  • Переобучение может происходить на доминирующих классах.

  • Методы:

    • Oversampling редких классов (копирование, аугментация)

    • Undersampling частых классов

    • Взвешивание loss-функции (class_weight, pos_weight)

    • Focal Loss — фокусирует внимание на сложных примерах

8. Корректная выборка данных

Разделение train/val/test

  • Перекрёстное попадание изображений или похожих картинок (например, разных обрезок одного изображения) может привести к ложному росту метрик.

  • Используйте stratified split, избегайте утечек данных (data leakage).

Учет источников

  • Не смешивайте изображения с разных датчиков/камер без нормализации.

  • Возможно введение domain adaptation при разных распределениях источников.

9. Мониторинг и логгирование

  • Используйте TensorBoard, Weights & Biases, Neptune или аналогичные системы.

  • Отслеживайте:

    • Loss на train/val

    • Метрики (accuracy, mIoU, dice и т. д.)

    • Overfitting gap — разрыв между train и val

10. Выбор правильной loss-функции

  • Некорректный выбор loss может приводить к переобучению.

  • Для задач сегментации, например, лучше использовать Dice Loss или комбинации (0.5 * BCE + 0.5 * Dice).

  • В классификации — Focal Loss при дисбалансе.

11. Ensemble моделей

  • Объединение предсказаний нескольких моделей (или разных эпох одной модели).

  • Типы ансамблей:

    • Бэггинг (Bagging): модели обучаются на разных подвыборках

    • Стекинг (Stacking): используется мета-модель

    • Snapshot Ensembles: ансамбли по лучшим эпохам

Это снижает вариативность и риск переобучения отдельной модели.

12. Использование синтетических данных

  • В задачах, где получить реальные изображения сложно (например, медицина, космос, робототехника), можно использовать:

    • GANs для генерации реалистичных изображений

    • 3D-рендеринг и генерация сцен

    • Домены с шумом или стилевыми трансформациями (style transfer, domain randomization)

Синтетика повышает обобщение за счёт разнообразия.

13. Distillation (дистилляция знаний)

  • Обучение «маленькой» модели (student) на выходах «большой» модели (teacher).

  • Дает меньшую модель с хорошим обобщением.

  • Смягчает уверенность teacher'а, что снижает риск переобучения.

14. Тонкая настройка гиперпараметров

  • Неправильный выбор learning rate, batch size, weight decay и др. может приводить к переобучению.

  • Используйте:

    • Grid Search

    • Random Search

    • Optuna / Hyperopt / Ray Tune

15. Примеры практического обнаружения переобучения

  • Training loss ↓, Validation loss ↑ — признак переобучения

  • **Accuracy на train > 95%, а на test < 70%
    **

  • **Метрики падают после определённой эпохи
    **
  • **Модель слишком уверена (softmax близок к 1.0), но часто ошибается
    **

Переобучение — это не просто "слишком долгое обучение", а сигнал того, что модель запоминает, а не учится. В CV-задачах эффективная борьба с этим включает не только архитектурные меры, но и подходы к данным, метрикам и обучению.