Epoch

epoch — один проход по обучающему набору

Раздел
Обучение
Обновлено
11.08.26

Epoch, или эпоха, — один проход через весь обучающий набор. Она показывает, сколько раз данные были охвачены тренировкой, но сама по себе ничего не говорит о качестве модели и не равна фиксированному числу обновлений весов.

Коротко

Одна эпоха — один проход через весь обучающий набор. Если в датасете шесть фотографий, а batch size равен двум, обычная эпоха состоит из трёх batches. Обновлений весов при этом может быть три, одно или другое число — это зависит от накопления градиента и устройства тренировки.

Эпоха удобна как календарная единица: по ней строят журнал обучения, запускают проверку и иногда сохраняют промежуточное состояние. Но она не является ступенью качества. Пятая эпоха не обязана быть лучше четвёртой, а одинаковое число эпох в двух проектах ещё не означает одинаковый объём обучения.

Что происходит внутри эпохи

Возьмём шесть фотографий одного кота. Загрузчик данных перемешивает их и собирает по две:

  • batch 1 — первые две фотографии;
  • batch 2 — следующие две;
  • batch 3 — последние две.

Когда тренировка обработала все три группы, завершён один проход по шести примерам — одна эпоха. Перед следующим проходом порядок часто перемешивается заново, поэтому соседние фотографии могут оказаться в других batches.

Для конечного датасета без отбрасывания последней группы число batches обычно считают так:

batches_per_epoch = ceil(число примеров / batch size)

Если примеров семь, а batch size равен двум, получатся четыре группы: три полные и одна с единственным примером. При включённом drop_last неполную группу отбрасывают, и batches останется три. Это небольшая настройка, но она меняет фактическое число примеров, увиденных за эпоху.

Почему batch не всегда равен шагу оптимизатора

Слово step используют в двух смыслах. Иногда так называют обработку одного batch, иногда — момент, когда оптимизатор действительно обновил веса. Без накопления градиента эти события обычно совпадают. С накоплением — уже нет.

Например, те же шесть фотографий идут batches по две:

Накопление градиента Обработано batches Обновлений оптимизатора за эпоху
1 3 3
3 3 1

Во втором случае градиенты от трёх маленьких batches собираются вместе, и только затем происходит одно обновление весов. Поэтому фраза «эпоха состоит из трёх шагов» неполна, пока не ясно, что автор называет шагом.

При обучении на нескольких устройствах появляется ещё один слой. Часто каждое устройство получает свою часть общего batch, а данные датасета распределяются между процессами. В простом случае эффективное число примеров на одно обновление выглядит так:

batch на устройстве × число устройств × накопление градиента

Это полезная оценка, но конкретный фреймворк может по-своему обрабатывать последнюю неполную группу и синхронизацию процессов. Для точного подсчёта надёжнее смотреть журнал тренировки и код загрузчика данных.

Эпоха и объём обучения — не одно и то же

Одна эпоха на десяти изображениях и одна эпоха на десяти тысячах изображений — совсем разная работа. Даже при одинаковом датасете итог меняют batch size, число устройств, накопление градиента и повторение примеров.

Поэтому для сравнения двух запусков полезно знать сразу несколько величин:

  • сколько уникальных примеров входит в набор;
  • сколько примеров фактически просмотрено;
  • сколько batches обработано;
  • сколько обновлений сделал оптимизатор;
  • какой learning rate использовался;
  • были ли повторы, взвешенная выборка или отбрасывание последнего batch.

Число эпох без этого контекста похоже на фразу «я прошёл пять кругов» без длины круга.

Когда определение становится условным

Фраза «полный проход по датасету» хорошо описывает обычный конечный набор, но не любую систему загрузки данных.

  • Потоковый датасет может не иметь известного конца. Тогда границу эпохи задают числом batches или обновлений.
  • Бесконечно повторяющийся источник сам не завершит эпоху; лимит приходится задавать отдельно.
  • Выборка с возвращением способна показать один пример несколько раз, а другой не выбрать вовсе.
  • Взвешенный sampler намеренно чаще берёт одни категории, чем другие.
  • Распределённое обучение делит набор между процессами; один процесс видит свою часть, а эпоха относится к общему проходу системы.

В таких случаях эпоха остаётся полезной границей журнала, но уже не гарантирует буквальное «каждый пример ровно один раз». В Keras, например, параметр steps_per_epoch может явно определить, сколько batches считать эпохой, даже если источник данных устроен иначе. Это отражено в документации Model.fit.

Эпоха не создаёт чекпоинт автоматически

Границы эпох удобны для сохранения, поэтому эти понятия часто стоят рядом. Но правило сохранения задаётся отдельно. Состояние можно записывать:

  • после каждой эпохи;
  • через определённое число обновлений;
  • только при улучшении проверочной метрики;
  • вручную или по времени.

Кроме того, экспортированные веса и полноценное состояние тренировки — не одно и то же. Для точного продолжения обычно нужны не только веса модели или LoRA, но и состояние оптимизатора, расписания learning rate, счётчиков и генераторов случайности. Файл, пригодный для генерации, не всегда подходит для бесшовного возобновления обучения.

Как выбирать момент остановки

Универсального числа эпох нет. Небольшой однообразный набор, большой разнообразный датасет и поток синтетических примеров нельзя оценивать одной вилкой. Learning rate тоже меняет картину: одинаковое число проходов при разной величине обновлений даёт разный путь обучения.

Для генеративной модели удобно сохранять несколько промежуточных состояний и сравнивать их на небольшой постоянной сетке:

  1. несколько промптов, включая сцены вне обучающего набора;
  2. несколько фиксированных seed, а не один удачный кадр;
  3. одинаковые параметры генерации;
  4. проверка узнаваемости, разнообразия и нежелательного копирования деталей датасета.

Тренировочный loss помогает заметить сбой, но сам по себе не выбирает лучший визуальный результат. Он может продолжать снижаться, пока модель уже теряет гибкость на новых сценах. Поэтому промежуточные изображения и отложенные данные дают более содержательный сигнал.

С чем часто путают

  • Epoch и batch. Batch — одна группа примеров; эпоха охватывает все группы, отнесённые к одному проходу.
  • Epoch и optimizer step. Обновление весов может происходить после одного или нескольких batches.
  • Epoch и iteration. Слово iteration бывает неоднозначным; в чужом журнале лучше проверить, что именно считает счётчик.
  • Training step и sampling step. Первый относится к обучению, второй — к процессу генерации изображения.
  • Epoch и run. Run — весь запуск тренировки, который может включать много эпох.
  • Epoch и checkpoint. Чекпоинт — сохранённое состояние; эпоха лишь возможный момент для сохранения.

Частые вопросы

Каждое изображение встречается в эпохе ровно один раз?

В обычном конечном датасете с последовательным или перемешанным проходом — обычно да, кроме отброшенного неполного batch. Пользовательский sampler, потоковая загрузка, повторение и выборка с возвращением могут нарушать это правило.

Больше эпох означает более качественную модель?

Нет. Дополнительные проходы дают оптимизатору больше возможностей изменить веса, но результат зависит от данных, learning rate и всей схемы обучения. После полезного участка может начаться переобучение, а иногда запуск оказывается неудачным гораздо раньше.

Можно ли сравнить два обучения по числу эпох?

Только если одинаковы датасет и остальные условия. Для разных запусков информативнее сравнивать число просмотренных примеров, обновлений оптимизатора и эффективный batch вместе с learning rate.

Нужно ли сохранять файл после каждой эпохи?

Не обязательно. Частое сохранение упрощает выбор удачного состояния, но занимает место и время. Интервал зависит от длины эпохи и цены повторного обучения, а не от самого определения термина.

Можно ли продолжить обучение с выбранной эпохи?

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

Главное

Epoch — это мера охвата обучающих данных. В простом случае модель завершает эпоху, когда обработала весь конечный датасет. Число batches определяется размером набора и batch size, а число обновлений весов дополнительно зависит от накопления градиента и распределения по устройствам.

Эпоха хорошо отвечает на вопрос «сколько проходов сделано», но не на вопрос «насколько хороша модель». Для выбора результата нужны промежуточные состояния и одинаковые условия проверки.

Источники