Epoch
Эпоха — это один полный проход модели по обучающим данным. Узнай, как эпохи связаны с батчами и итерациями и сколько эпох нужно для обучения.
Эпоха — это один полный проход модели машинного обучения по всему обучающему набору данных. За эпоху каждый обучающий пример ровно один раз участвует в обновлении весов модели. Модели глубокого обучения редко обучаются достаточно хорошо за один проход, поэтому обучение продолжается в течение многих эпох; ошибка на обучающих данных обычно уменьшается с каждой эпохой по мере того, как сеть уточняет свои предсказания.
Эпоха, батч и итерация#
Структуру обучения описывают три термина, каждый из которых вложен в предыдущий:
- Эпоха: один полный проход по обучающему набору данных.
- Пакет: группа примеров, обрабатываемых вместе за один шаг. Наборы данных редко целиком помещаются в память GPU, поэтому каждую эпоху делят на пакеты, обычно предварительно перемешивая данные.
- Итерация: одно обновление весов после вычисления функции потерь для пакета и обратного распространения градиентов через обратное распространение ошибки. Синоним — «шаг».
Число итераций за эпоху равно размеру набора данных, деленному на размер пакета и округленному вверх. Для набора данных из 1 000 изображений при размере пакета 100 требуется 10 итераций на эпоху, поэтому за 50 эпох выполняется 500 обновлений весов. В PyTorch эта структура выглядит как два вложенных цикла: внешний цикл по эпохам и внутренний цикл по пакетам, которые обрабатывает DataLoader.
import torch
from torch.utils.data import DataLoader, TensorDataset
torch.manual_seed(0)
# 1,000 noisy samples of the line y = 3x + 2, served in shuffled batches of 100
x = torch.rand(1000, 1)
y = 3 * x + 2 + 0.1 * torch.randn(1000, 1)
loader = DataLoader(TensorDataset(x, y), batch_size=100, shuffle=True)
model = torch.nn.Linear(1, 1)
optimizer = torch.optim.SGD(model.parameters(), lr=0.5)
for epoch in range(5): # one epoch = one full pass over all 1,000 samples
for xb, yb in loader: # 1,000 / 100 = 10 iterations per epoch
loss = torch.nn.functional.mse_loss(model(xb), yb)
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f"Epoch {epoch + 1}: {len(loader)} iterations, last batch loss {loss.item():.4f}")В каждой эпохе выполняется 10 итераций, а ошибка на последнем пакете снижается с 0.1096 после первой эпохи до 0.0088 после пятой, когда модель сходится к истинной прямой. При использовании аугментации данных в каждой эпохе модель видит заново преобразованную версию каждого изображения, поэтому последующие эпохи добавляют разнообразие, а не точные повторы.
Как выбрать число эпох#
Число эпох — один из основных параметров настройки гиперпараметров. Слишком малое число эпох приводит к недообучению: ошибка остается высокой как на обучающих, так и на валидационных данных. Слишком большое число эпох ведет к переобучению: ошибка на обучении продолжает снижаться, а оценка на валидации перестает улучшаться или падает, поскольку модель начинает запоминать обучающие примеры. Подходящее число зависит от размера набора данных и модели, расписания скорости обучения и того, начинается ли обучение с предобученных весов с помощью переноса обучения. Масштаб тоже влияет на выбор: небольшие наборы данных для компьютерного зрения часто используют для обучения сотни эпох, а большие языковые модели обычно обрабатывают значительную часть данных менее одного раза; GPT-3 прошла 0,44 эпохи по отфильтрованным данным Common Crawl.
Ранняя остановка автоматизирует выбор. После каждой эпохи модель оценивается на валидационных данных, сохраняется лучший контрольный снимок, а обучение завершается, когда оценка на валидации не улучшается в течение заданного числа эпох, называемого терпением.
Расписания обучения, зависящие от эпох#
Помимо момента остановки, многие настройки обучения изменяются по расписанию эпох: например, разогрев и снижение скорости обучения или интенсивность аугментации. В обучении Ultralytics YOLO значения epochs и patience по умолчанию равны 100, скорость обучения разогревается в течение первых 3 эпох, а мозаичная аугментация отключается в последние 10 эпох (close_mosaic=10), чтобы модель завершала обучение на изображениях, похожих на реальные входные данные. Рецепт обучения YOLO26 показывает, насколько число эпох зависит от размера модели: после 150 эпох предобучения на Objects365 дообучение на COCO длилось 245 эпох для YOLO26n и 40 эпох для YOLO26x.
from ultralytics import YOLO
# Загрузи предварительно обученную модель YOLO26n
model = YOLO("yolo26n.pt")
# Обучение в течение 50 эпох: 50 полных проходов по обучающим изображениям COCO8
results = model.train(data="coco8.yaml", epochs=50, imgsz=640)Во время этого запуска тренер проверяет модель YOLO26 после каждой эпохи, каждый раз перезаписывает last.pt и сохраняет best.pt, когда показатель качества на валидации — для обнаружения это mAP50-95 — достигает нового максимума.










