Эпохи и переобучение: как понять, когда модель уже научилась

При обучении моделей машинного обучения часто возникает вопрос: сколько эпох нужно? Когда модель уже «поняла» данные, а когда она начинает запоминать их слишком точно (то есть переобучаться)?

В этой статье:

  • Что такое эпоха
  • Как понять, что модель переобучается
  • Сколько эпох нужно
  • Как выбрать и настроить обучение правильно

Что такое эпоха

Эпоха — это один полный проход по всему обучающему набору данных.

Допустим, у вас есть 10 000 примеров, и вы обучаете модель с batch_size=100. Это значит, за одну эпоху модель увидит все примеры по 100 штук за раз — всего 100 шагов.

Когда эпох несколько, модель повторно видит одни и те же данные, чтобы «отточить» предсказания.


Почему не всегда больше — лучше

Модель может начать запоминать примеры, а не учиться на них обобщать. Это называется переобучение.

Признаки:

  • Ошибка на обучении (train loss) продолжает падать
  • Ошибка на валидации (val loss) начинает расти
  • Точность на тренировке высокая, на тесте — низкая

Как отслеживать переобучение

  1. Делите данные на train и validation
  2. После каждой эпохи измеряйте val loss и метрику (например, accuracy)
  3. Стройте графики

Если val loss начинает расти — модель начала переобучаться, даже если train loss ещё падает.


Сколько эпох выбрать

Ответ: зависит от данных, модели и задачи. Но есть ориентиры:

  • Маленькие датасеты → 5–20 эпох
  • Большие датасеты → 2–5 эпох (модель быстро учится)

Что помогает:

  • Early stopping — остановка, когда val loss не улучшается 2–3 эпохи
  • Checkpoints — сохранять лучшую модель по val metric

Пример с EarlyStopping

from transformers import TrainerCallback

class EarlyStop(TrainerCallback):
    def __init__(self, patience=3):
        self.patience = patience
        self.counter = 0
        self.best_loss = float("inf")

    def on_evaluate(self, args, state, control, metrics, **kwargs):
        val_loss = metrics.get("eval_loss")
        if val_loss < self.best_loss:
            self.best_loss = val_loss
            self.counter = 0
        else:
            self.counter += 1
        if self.counter >= self.patience:
            control.should_training_stop = True

Вывод

Обучение — это баланс. Слишком мало эпох — модель не научится. Слишком много — начнёт переобучаться.

Следите за метриками на валидации, сохраняйте лучшие версии и не бойтесь остановиться чуть раньше — это часто даёт лучший результат.