Momentum (Optimization)
A otimização por momentum usa gradientes passados para acelerar o treinamento do modelo, suavizar atualizações ruidosas e melhorar a convergência, equilibrando a taxa de aprendizado.
Momentum é uma técnica de otimização que dá ao treinamento baseado em gradientes uma memória das atualizações anteriores. Ao combinar o gradiente atual com um histórico decrescente de gradientes anteriores, ela aumenta a velocidade nas direções consistentes e reduz os movimentos de vaivém. Isso ajuda os modelos de aprendizado de máquina a minimizar o objetivo de treinamento com mais eficiência. A otimização para mecanismos de busca diz respeito à visibilidade de sites; o momentum diz respeito às atualizações numéricas dos parâmetros do modelo.
Como funciona o Momentum#
Durante a descida do gradiente, um modelo ajusta seus pesos no sentido oposto ao gradiente — a direção em que sua função de perda aumenta mais rapidamente. O momentum clássico, também chamado de momentum de Polyak ou método da bola pesada, acrescenta inércia a esse movimento. Boris Polyak o apresentou em seu trabalho de 1964 sobre a aceleração de métodos iterativos.
O otimizador mantém um buffer de velocidade, com um valor acumulado para cada parâmetro. Cada atualização multiplica o buffer antigo por um coeficiente de momentum, soma o gradiente atual e subtrai dos pesos o buffer resultante multiplicado pela taxa de aprendizado. Em redes neurais, a retropropagação fornece esses gradientes; o otimizador mantém o buffer entre as atualizações.
O momentum é especialmente útil em superfícies de perda alongadas, nas quais a curvatura é acentuada na direção transversal ao vale e suave ao longo de seu fundo. Os gradientes que apontam repetidamente ao longo do vale se acumulam, enquanto os componentes alternados na direção transversal se cancelam parcialmente. Com a descida estocástica do gradiente, essa memória também suaviza as flutuações entre minilotes. A dinâmica do momentum em perdas quadráticas explica tanto a aceleração quanto as oscilações que ele pode introduzir perto de um mínimo.
Momentum, taxa de aprendizado e métodos relacionados#
O coeficiente de momentum, geralmente escrito como beta ou mu, costuma variar entre zero e um. Zero equivale à descida do gradiente comum; valores mais próximos de um retêm gradientes antigos por mais tempo. 0.9 é um valor inicial comum. Com um buffer de velocidade não normalizado e um gradiente constante, a velocidade acumulada se aproxima de dez vezes esse gradiente com 0.9, contra 100 vezes com 0.99. Por isso, o momentum e a taxa de aprendizado interagem fortemente durante o ajuste de hiperparâmetros.
Uma combinação excessivamente agressiva causa ultrapassagem do mínimo: as atualizações o atravessam repetidamente, provocando oscilações na perda ou divergência. Isso ocorre até mesmo em objetivos quadráticos suaves. Um cronograma da taxa de aprendizado altera a magnitude das atualizações ao longo do treinamento, enquanto o momentum determina por quanto tempo o histórico direcional persiste.
Dois algoritmos de otimização estreitamente relacionados usam esse histórico de maneiras diferentes:
- O momentum de Nesterov avalia o gradiente em uma posição futura estimada com a velocidade retida, permitindo que o gradiente corrija o movimento previsto.
- O Adam combina uma média do gradiente ponderada exponencialmente com uma média do gradiente ao quadrado, que dimensiona as atualizações separadamente para cada parâmetro. Seu
beta1controla a memória dos gradientes.
Um exemplo mínimo com PyTorch#
Este exemplo de PyTorch compara pontos iniciais e taxas de aprendizado idênticos em um objetivo quadrático alongado. A implementação de SGD oficial gerencia automaticamente o buffer de momentum.
import torch
# Curvature is 50 times greater along the second coordinate.
scale = torch.tensor([1.0, 50.0])
for momentum in (0.0, 0.9):
weights = torch.tensor([5.0, 1.0], requires_grad=True)
optimizer = torch.optim.SGD([weights], lr=0.015, momentum=momentum)
for step in range(100):
optimizer.zero_grad()
loss = (scale * weights.square()).sum()
loss.backward()
optimizer.step()
final_loss = (scale * weights.square()).sum().item()
print(f"Momentum {momentum}: loss = {final_loss:.6f}")Após 100 atualizações, a perda é de aproximadamente 0.056531 sem momentum e 0.000216 com momentum. O histórico direcional acumulado acelera o progresso ao longo da coordenada mais suave.
Usos no treinamento de visão computacional#
O momentum contribui para o treinamento de redes neurais convolucionais para classificação de imagens e detecção de objetos. O treinamento do Ultralytics YOLO ativa o momentum de Nesterov quando optimizer="SGD" é selecionado, e a configuração momentum controla o histórico de atualizações retido. A implementação do treinador passa esse coeficiente para o otimizador com nesterov=True.
Uma aplicação marcante é o procedimento original de treinamento do ResNet para ImageNet. Esses modelos usaram SGD com momentum 0.9, tamanho do lote de 256, decaimento de pesos de 0.0001 e taxa de aprendizado inicial de 0.1, reduzida em dez vezes quando o erro estagnava.










