Batch Size
Размер батча — это число обучающих примеров, которые модель обрабатывает перед каждым обновлением весов. Он определяет использование памяти GPU, скорость обучения и шум градиента.
Размер пакета — это количество обучающих примеров, которые модель обрабатывает одновременно перед обновлением весов модели. Вместо подачи всего обучающего набора данных в нейронную сеть за один раз обучение разбивается на пакеты. Для каждого пакета модель делает предсказания, функция потерь оценивает их, обратное распространение ошибки вычисляет градиенты, а оптимизатор выполняет один шаг. Размер пакета — это гиперпараметр, который одновременно определяет три вещи: сколько памяти GPU требуется для обучения, как долго выполняется каждая эпоха и насколько шумной будет оценка градиента.
Как размер пакета влияет на обучение#
Каждый пакет даёт алгоритму оптимизации оценку градиента по всему набору данных, и с увеличением пакета эта оценка становится точнее. Приведённый ниже фрагмент кода на PyTorch напрямую измеряет точность, усредняя градиенты отдельных примеров по множеству случайных пакетов разных размеров:
import torch
torch.manual_seed(0)
# Per-sample gradients of a squared-error loss for 10,000 samples
x = torch.randn(10_000)
y = 2 * x + torch.randn(10_000)
w = torch.tensor(0.0)
per_sample_grads = 2 * (w * x - y) * x
# Estimate the gradient from 1,000 random batches at each batch size
for batch_size in (8, 64, 512):
idx = torch.randint(0, len(x), (1000, batch_size))
batch_grads = per_sample_grads[idx].mean(dim=1)
print(f"batch {batch_size:3d}: gradient std {batch_grads.std():.3f}")Разброс оценок градиента снижается с 2.248 при размере пакета 8 до 0.771 при размере 64 и 0.267 при размере 512. Каждое восьмикратное увеличение пакета уменьшает шум примерно в 2.9 раза — почти в √8 раз, как и происходит при усреднении независимых выборок.
Этот шум определяет компромисс между маленькими и большими пакетами:
- Маленькие пакеты (например, от 8 до 32): Шумные обновления и много шагов на эпоху. Шум действует как мягкий регуляризатор, который часто помогает стохастическому градиентному спуску (SGD) обобщать данные. Маленькие пакеты подходят для скромного оборудования, но каждая эпоха длится дольше, поскольку GPU используется не полностью.
- Большие пакеты (например, от 256): Плавные градиенты, меньше шагов на эпоху и высокая загрузка оборудования. Как обнаружили Keskar и соавторы, очень большие пакеты обычно сходятся к острым минимумам, которые хуже обобщают данные. Кроме того, из-за меньшего числа шагов на эпоху им требуется пропорционально большая скорость обучения с периодом разогрева. Используя это правило линейного масштабирования, Goyal и соавторы обучили ResNet-50 на ImageNet за один час с размером пакета 8,192 на 256 GPU, достигнув точности, сопоставимой с обучением на маленьких пакетах.
Ограничения памяти и накопление градиента#
В памяти GPU должны помещаться веса модели, состояние оптимизатора и промежуточные активации, необходимые для обратного распространения ошибки. Объём памяти, занимаемой активациями, линейно растёт вместе с размером пакета и разрешением изображений. Если пакет не помещается в память, обучение останавливается с ошибкой нехватки памяти (OOM). Обучение с смешанной точностью примерно вдвое сокращает память для активаций, а накопление градиента позволяет получить больший эффективный пакет, суммируя градиенты нескольких маленьких пакетов перед каждым обновлением весов.
Встроенное обучение Ultralytics YOLO накапливает градиенты, пока не обработает около 64 изображений — номинальный размер пакета nbs. Поэтому после разогрева параметр по умолчанию batch=16 выполняет одно обновление весов каждые четыре пакета. Если задать batch=-1, запустится AutoBatch: он выберет наибольший пакет, который помещается примерно в 60% свободной памяти CUDA, а на устройствах с CPU и Apple MPS в качестве запасного варианта выберет размер пакета 16.
from ultralytics import YOLO
# Загрузи предварительно обученную модель YOLO26n
model = YOLO("yolo26n.pt")
# batch=-1 позволяет AutoBatch выбрать размер пакета с учётом доступной памяти GPU
# Используй целое число (batch=16), чтобы задать фиксированный размер, или дробное число (batch=0.70), чтобы указать долю памяти
results = model.train(data="coco8.yaml", epochs=5, batch=-1)Перед началом обучения AutoBatch запускает модель YOLO26 с размером пакета от 1 до 16 (до 64 на GPU с памятью не менее 16 GB), аппроксимирует измеренное потребление памяти прямой и вычисляет размер пакета, соответствующий целевой доле.
Размер пакета и связанные термины#
- Эпоха и итерация: Эпоха — это один проход по всему набору данных, а итерация — одно обновление весов. Количество итераций на эпоху равно размеру набора данных, делённому на размер пакета, с округлением вверх. Например, для 1,000 изображений при размере пакета 100 потребуется 10 итераций.
- Мини-пакет: В большинстве материалов по глубокому обучению это синоним слова «пакет». Если быть точным, при пакетном градиентном спуске для каждого обновления используется весь набор данных, при стохастическом градиентном спуске — один пример, а градиентный спуск на мини-пакетах занимает промежуточное положение. Именно так обучается почти любая современная сеть.
- Пакетная нормализация: Слой, который нормализует активации по среднему и дисперсии текущего пакета, поэтому при очень маленьком размере пакета его статистики становятся ненадёжными. Групповая нормализация не зависит от размера пакета; для ResNet-50 на ImageNet при размере пакета 2 она показала ошибку на 10.6% ниже, чем пакетная нормализация.
- Размер пакета при инференсе: Во время развёртывания группировка данных в пакеты позволяет обменять задержку инференса на пропускную способность. Объединение кадров с нескольких камер увеличивает количество изображений в секунду, но каждый кадр ждёт, пока пакет не заполнится.










