Батчи, эпохи и метрики обучения
Урок объясняет организацию обучения по батчам и эпохам и какие метрики за ним наблюдать.
Эпоха — это один полный проход по всем обучающим данным; батч — порция данных, обрабатываемая за один шаг обновления весов.
Зачем мини-батчи
Можно считать градиент по всему датасету сразу (полный батч) — точно, но дорого по памяти и медленно. Можно по одному примеру (онлайн) — быстро, но шумно. Золотая середина — мини-батчи по 32–256 примеров: достаточно точная оценка градиента и эффективное использование GPU. На каждый батч делается один шаг обновления весов.
Термины, которые часто путают
| Термин | Значение |
| батч (batch) | порция примеров для одного шага |
| итерация (iteration) | один шаг = обработка одного батча |
| эпоха (epoch) | проход по всем данным = много итераций |
Если данных 10 000 и батч 100, то в одной эпохе будет 100 итераций (100 шагов обновления весов).
Разбиваем данные на батчи
data = list(range(10)) # 10 условных примеров
batch_size = 3
def batches(xs, size):
for i in range(0, len(xs), size):
yield xs[i:i+size]
for epoch in range(1, 3):
print("Эпоха", epoch)
for b in batches(data, batch_size):
print(" батч:", b)
Вывод:
Эпоха 1 батч: [0, 1, 2] батч: [3, 4, 5] батч: [6, 7, 8] батч: [9] Эпоха 2 батч: [0, 1, 2] батч: [3, 4, 5] батч: [6, 7, 8] батч: [9]
Десять примеров разбиты на четыре батча (последний неполный). За эпоху сеть увидит все данные ровно один раз. На практике перед каждой эпохой данные ещё перемешивают (shuffle), чтобы батчи не повторялись из эпохи в эпоху.
Какие метрики смотреть
Во время обучения отслеживают как минимум две кривые:
- Потеря на обучении (train loss) — должна устойчиво падать; если стоит на месте, обучение не идёт (проверьте lr).
- Потеря на валидации (val loss) — главный индикатор обобщения. Пока обе падают — всё хорошо. Когда train loss падает, а val loss начинает расти — сеть переобучается (следующий урок).
Для классификации к потере добавляют accuracy (доля верных ответов), а при дисбалансе классов — precision, recall и F1. Одной точности бывает мало: если 99% писем не спам, модель, всегда говорящая «не спам», даст 99% accuracy и при этом бесполезна.
Как размер батча влияет на обучение
Размер батча — это не только про скорость. Маленькие батчи дают «шумную» оценку градиента: каждый шаг немного случаен, и этот шум, как ни странно, полезен — он помогает выскакивать из плохих локальных минимумов и иногда улучшает обобщение. Большие батчи дают точный, гладкий градиент и максимально загружают GPU, но порой застревают в широких посредственных минимумах и требуют подстройки lr. Эмпирическое правило: увеличиваешь батч вдвое — обычно можно слегка поднять и learning rate. На практике батч 32–256 — разумный старт, а дальше его подбирают под объём памяти GPU и поведение валидационной кривой.
Ещё одна тонкость — перемешивание. Если не делать shuffle, сеть может уловить случайный порядок данных (например, если примеры отсортированы по классу) и обучаться смещённо. Поэтому перед каждой эпохой обучающую выборку перемешивают, а валидационную и тестовую — нет, чтобы метрики были воспроизводимы.
Итог
- Эпоха — проход по всем данным; батч — порция для одного шага; итерация — один шаг.
- Мини-батчи (32–256) балансируют точность градиента и скорость.
- Следят за train и val потерями; для классификации — за accuracy и при дисбалансе за precision/recall/F1.