Batch Size
O tamanho do lote é o número de exemplos de treino que um modelo processa por atualização de pesos. Determina a utilização da memória da GPU, a velocidade de treino e o ruído do gradiente.
O tamanho do lote é o número de exemplos de treinamento que um modelo processa em conjunto antes de atualizar seus pesos. Em vez de passar todo o conjunto de dados de treinamento pela rede neural de uma só vez, o treinamento o divide em lotes. Para cada lote, o modelo faz previsões, a função de perda as avalia, a retropropagação calcula os gradientes e o otimizador dá um passo. O tamanho do lote é um hiperparâmetro que determina três coisas ao mesmo tempo: quanta memória da GPU o treinamento exige, quanto tempo leva cada época e o quanto cada estimativa de gradiente é ruidosa.
Como o tamanho do lote afeta o treinamento#
Cada lote fornece ao algoritmo de otimização uma estimativa do gradiente para todo o conjunto de dados, e a estimativa fica mais precisa à medida que o lote aumenta. O trecho de código PyTorch abaixo mede essa precisão diretamente, calculando a média dos gradientes por amostra em muitos lotes aleatórios de cada tamanho:
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}")A dispersão da estimativa do gradiente cai de 2.248 com tamanho de lote 8 para 0.771 com 64 e 0.267 com 512. Cada aumento de 8 vezes no tamanho do lote reduz o ruído em cerca de 2.9 vezes, próximo à raiz quadrada de 8, como ocorre ao calcular a média de amostras independentes.
Esse ruído influencia o equilíbrio entre lotes pequenos e grandes:
- Lotes pequenos (por exemplo, de 8 a 32): Atualizações ruidosas e muitas etapas por época. O ruído age como um leve regularizador que costuma ajudar o descenso estocástico do gradiente (SGD) a generalizar, e lotes pequenos cabem em hardware modesto, mas cada época demora mais porque a GPU fica parcialmente ociosa.
- Lotes grandes (por exemplo, 256 ou mais): Gradientes mais suaves, menos etapas por época e alta utilização do hardware. Lotes muito grandes tendem a convergir para mínimos agudos, que generalizam pior, como Keskar et al. constataram; além disso, como exigem menos etapas por época, precisam de uma taxa de aprendizado proporcionalmente maior e de um período de aquecimento. Com essa regra de escala linear, Goyal et al. treinaram a ResNet-50 no ImageNet com tamanho de lote 8,192 em 256 GPUs durante uma hora, igualando a precisão do treinamento com lotes pequenos.
Limites de memória e acumulação de gradientes#
A memória da GPU precisa comportar os pesos do modelo, o estado do otimizador e as ativações intermediárias necessárias para a retropropagação; a memória das ativações cresce linearmente com o tamanho do lote e a resolução das imagens. Um lote que não cabe interrompe o treinamento com um erro de falta de memória (OOM). O treinamento com precisão mista reduz aproximadamente pela metade a memória das ativações, e a acumulação de gradientes permite atingir um lote efetivo maior, somando os gradientes de vários lotes pequenos antes de cada atualização dos pesos.
O treinamento da Ultralytics YOLO já inclui esse recurso: acumula gradientes até processar cerca de 64 imagens, o tamanho nominal do lote nbs; assim, após o aquecimento, o padrão batch=16 atualiza os pesos a cada quatro lotes. Definir batch=-1 executa o AutoBatch, que escolhe o maior lote que cabe em cerca de 60% da memória CUDA livre e usa como alternativa um tamanho de lote 16 em dispositivos CPU e Apple MPS.
from ultralytics import YOLO
# Carrega um modelo YOLO26n pré-treinado
model = YOLO("yolo26n.pt")
# batch=-1 permite que o AutoBatch escolha o tamanho do lote com base na memória GPU disponível
# Usa um inteiro (batch=16) para um tamanho fixo ou um float (batch=0.70) para uma fração da memória
results = model.train(data="coco8.yaml", epochs=5, batch=-1)Antes do início do treinamento, o AutoBatch executa o modelo YOLO26 com tamanhos de lote de 1 a 16 (até 64 em GPUs com 16 GB ou mais), ajusta uma reta ao uso de memória medido e a usa para calcular o tamanho do lote que atinge a fração desejada.
Tamanho do lote vs. termos relacionados#
- Época e iteração: Uma época é uma passagem pelo conjunto de dados inteiro, e uma iteração é uma atualização dos pesos. O número de iterações por época é igual ao tamanho do conjunto de dados dividido pelo tamanho do lote, arredondado para cima; assim, 1,000 imagens com tamanho de lote 100 exigem 10 iterações.
- Minilote: Sinônimo de lote na maioria dos textos sobre aprendizado profundo. Tecnicamente, o descenso do gradiente em lote usa o conjunto de dados inteiro a cada atualização, o descenso estocástico do gradiente usa um único exemplo e o descenso do gradiente por minilotes fica entre os dois — é assim que quase todas as redes modernas são treinadas.
- Normalização em lote: Camada que normaliza as ativações usando a média e a variância do lote atual, então suas estatísticas ficam pouco confiáveis com tamanhos de lote muito pequenos. A normalização por grupos evita essa dependência e apresentou erro 10.6% menor que a normalização em lote na ResNet-50 no ImageNet com tamanho de lote 2.
- Tamanho do lote de inferência: Na implantação, o agrupamento em lotes troca latência de inferência por throughput. Agrupar quadros de várias câmeras aumenta o número de imagens processadas por segundo, enquanto cada quadro aguarda o preenchimento do lote.










