Перейти к содержанию
Публикация AiManual

Эпоха, батч и итерация: как разобраться в параметрах обучения нейросетей

Эпоха, батч и итерация означают разное: полный проход по датасету, порцию данных и один шаг с обновлением весов. Разбираем связь с градиентным спуском и скорост

Коротко

Что будет в материале

  1. 01

    Эпоха, батч и итерация: короткий ответ

  2. 02

    Как работает градиентный спуск: итеративная оптимизация шаг за шагом

  3. 03

    Зачем датасет делят на батчи

  4. 04

    Что такое эпоха в нейросети и почему одной эпохи недостаточно

Эпоха, батч и итерация: короткий ответ

Эпоха (epoch) - один полный проход всего датасета через нейронную сеть в прямом и обратном направлении. Батч (batch) - порция данных, на которые делят датасет. Итерация - один шаг обработки одного батча, в конце которого веса сети обновляются.

Три величины связаны арифметически: число итераций в эпохе равно числу батчей. Датасет из 2000 объектов при размере батча 500 даёт 4 батча, то есть 4 итерации за одну эпоху.

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

Как работает градиентный спуск: итеративная оптимизация шаг за шагом

Эпоха, батч и итерация описывают один процесс: обучение через градиентный спуск. Градиентный спуск - алгоритм итеративной оптимизации в машинном обучении, который ищет минимум кривой или многомерной поверхности. Сеть стартует со случайных весов, а алгоритм последовательно сдвигает их туда, где ошибка меньше.

Слово «итеративный» здесь главное. Процедура повторяется много раз, и при правильной реализации каждый шаг улучшает результат: плохо обученная модель постепенно подстраивается под данные.

Градиент и скорость обучения: направление и размер шага

Градиент показывает скорость убывания или возрастания функции, то есть направление изменения. Скорость обучения (learning rate) задаёт размер шага в этом направлении. Первый параметр отвечает на вопрос «куда», вторая - «насколько далеко».

Аналогия со спуском с горы работает без натяжек: градиент подсказывает, где уклон вниз, скорость обучения определяет длину шага. Крупный шаг рискует перескочить минимум, мелкий растягивает обучение на сотни итераций. В разобранном материале описано поведение, при котором в начале шаги больше, а по мере приближения к краю кривой уменьшаются; конкретные расписания изменения learning rate там не раскрыты, поэтому переносить чужой график в свой проект без проверки на своих данных нет смысла.

Почему лосс - главный индикатор

Функция потерь (Cost/Loss, «лосс») показывает, насколько ответы сети расходятся с ожидаемыми. Уменьшение лосса - хороший признак: обновления весов идут в нужную сторону.

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

Зачем датасет делят на батчи

Хочется скормить сети весь датасет за раз, но зачастую нет возможности загрузить сразу все данные в обработку. Данные режут на части меньшего размера, загружают по очереди и обновляют веса нейросети в конце каждого шага, подстраивая их под данные (разбор темы).

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

Отсюда важная деталь. Веса обновляются в конце шага, а не после каждой эпохи. Сколько в эпохе батчей, столько в ней и обновлений.

Размер батча и число батчей - не одно и то же

Размер батча (batch size) - сколько объектов в одной порции. Число батчей - сколько таких порций получается из датасета. Первое вы задаёте, второе вычисляется.

число итераций в эпохе = размер датасета / размер батча

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

Что такое эпоха в нейросети и почему одной эпохи недостаточно

Эпоха (epoch) - весь датасет прошёл через нейронную сеть в прямом и обратном направлении только один раз. Обновления весов после одного прохождения недостаточно: одна эпоха приводит к недообучению, а избыток эпох - к переобучению (источник).

С увеличением числа эпох веса меняются всё большее количество раз. Модель последовательно подстраивается под данные и проходит путь от плохо обученного состояния к оптимальному, где кривая уже описывает закономерности выборки.

Недообучение и переобучение: две крайности

При недообучении веса не успели подстроиться, и кривая плохо описывает данные. При переобучении сеть подстроилась слишком сильно: на знакомых примерах отвечает точно, на новых теряет качество.

Между этими состояниями есть точка, где модель выучила закономерности, но ещё не начала запоминать шум. Искать её приходится по кривой лосса. В разобранном материале остановка описана как решение, которое принимает человек: если вовремя не остановиться, может произойти переобучение.

Как выбрать количество эпох обучения

Универсального числа нет. Оптимальное количество зависит от разнообразия данных и задачи: однородная выборка насыщает модель быстро, разнородная требует больше проходов. В разобранном материале численных рекомендаций по числу эпох, размеру батча и скорости обучения нет, поэтому любые «магические» значения из чужих статей проверяйте на своих данных.

Рабочий ориентир простой: смотреть на функцию потерь и останавливать обучение в момент, когда очередные эпохи начинают вредить, а не улучшать результат.

Как считать итерации: пример с датасетом 2000 объектов и батчем 500

Считаем на числах. Датасет 2000 объектов, размер батча 500. Делим 2000 на 500, получаем 4. В одной эпохе 4 батча, значит 4 итерации.

ПараметрЗначениеЧто означает
Размер датасета2000 объектоввесь объём данных
Размер батча500 объектовпорция за один шаг
Число батчей в эпохе42000 / 500
Итераций за эпоху4одна итерация на один батч
Эпох10полных проходов датасета
Итераций всего404 x 10

При 10 эпохах суммарно выходит 40 итераций, и веса обновятся 40 раз. Это тот самый счётчик, который обычно и мелькает в логах обучения.

Мини-чеклист для своих данных:

  1. Узнайте размер датасета, то есть число объектов, а не число признаков.
  2. Задайте размер батча.
  3. Разделите размер датасета на размер батча и получите число итераций в одной эпохе.
  4. Умножьте результат на число эпох и получите суммарное число обновлений весов.

Проверка сходится на любом масштабе: батч 100 при датасете 2000 даёт 20 итераций за эпоху, а батч 1000 при том же датасете - всего 2. Число эпох при этом не меняется, меняется частота обновлений внутри каждой эпохи.

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

  • Скорость обучения - размер шага, с которым веса двигаются в направлении, указанном градиентом.
  • Размер батча - сколько объектов попадает в одну порцию данных.
  • Итерация - обработка одного батча с обновлением весов в конце шага.
  • Эпоха - полный проход датасета, в котором столько итераций, сколько батчей.

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

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

Сверьте свой конфиг по одному признаку: если число шагов за эпоху в логах не совпадает с делением размера датасета на размер батча, значит в расчётах смешались размер батча и число батчей. Это первое, что нужно проверить, прежде чем трогать скорость обучения.

Подписаться на канал