Momentum (Optimization)
L'ottimizzazione con momentum usa i gradienti passati per accelerare l'addestramento del modello, attenuare gli aggiornamenti rumorosi e migliorare la convergenza, bilanciando al contempo il tasso di apprendimento.
Il momentum è una tecnica di ottimizzazione che fornisce all'addestramento basato sul gradiente una memoria degli aggiornamenti precedenti. Combinando il gradiente corrente con una cronologia decrescente dei gradienti precedenti, aumenta la velocità lungo le direzioni coerenti e riduce i movimenti avanti e indietro. Questo aiuta i modelli di apprendimento automatico a minimizzare l'obiettivo di addestramento in modo più efficiente. L'ottimizzazione per i motori di ricerca riguarda la visibilità dei siti web; il momentum riguarda gli aggiornamenti numerici dei parametri del modello.
Come funziona il momentum#
Durante la discesa del gradiente, un modello modifica i propri pesi in direzione opposta al gradiente, cioè alla direzione in cui la sua funzione di perdita aumenta più rapidamente. Il momentum classico, chiamato anche momentum di Polyak o metodo della palla pesante, aggiunge inerzia a questo movimento. Boris Polyak lo introdusse nel suo lavoro del 1964 sull'accelerazione dei metodi iterativi.
L'ottimizzatore mantiene un buffer della velocità, con un valore accumulato per ogni parametro. A ogni aggiornamento, moltiplica il vecchio buffer per un coefficiente di momentum, aggiunge il gradiente corrente e sottrae dai pesi il buffer risultante moltiplicato per il tasso di apprendimento. Nelle reti neurali, la retropropagazione fornisce questi gradienti; l'ottimizzatore conserva il buffer tra un aggiornamento e l'altro.
Il momentum è particolarmente utile sulle superfici di perdita allungate, dove la curvatura è ripida attraverso una valle e poco accentuata lungo il suo fondo. I gradienti che puntano ripetutamente lungo la valle si accumulano, mentre le componenti che si alternano attraverso la valle si annullano parzialmente. Con la discesa stocastica del gradiente, questa memoria attenua anche le fluttuazioni tra i mini-batch. La dinamica del momentum su una funzione di perdita quadratica spiega sia l'accelerazione sia le oscillazioni che può introdurre in prossimità di un minimo.
Momentum, tasso di apprendimento e metodi correlati#
Il coefficiente di momentum, comunemente indicato con beta o mu, è solitamente compreso tra zero e uno. Con zero si ottiene la normale discesa del gradiente; valori più vicini a uno mantengono più a lungo i gradienti precedenti. Un coefficiente di 0.9 è un valore iniziale comune. Con un buffer della velocità non normalizzato e un gradiente costante, a 0.9 la velocità accumulata tende a dieci volte il gradiente, mentre a 0.99 tende a cento volte. Di conseguenza, il momentum e il tasso di apprendimento interagiscono fortemente durante la regolazione degli iperparametri.
Una combinazione eccessivamente aggressiva provoca un superamento del minimo: gli aggiornamenti lo oltrepassano ripetutamente, causando oscillazioni della perdita o divergenza. Ciò accade anche con obiettivi quadratici regolari. Una pianificazione del tasso di apprendimento modifica l'entità degli aggiornamenti durante l'addestramento, mentre il momentum determina quanta memoria direzionale viene conservata.
Due algoritmi di ottimizzazione strettamente correlati usano questa memoria in modi diversi:
- Il momentum di Nesterov valuta il gradiente in una posizione anticipata, raggiunta usando la velocità conservata, consentendo al gradiente di correggere il movimento previsto.
- Adam combina una media esponenzialmente ponderata del gradiente con una media del gradiente al quadrato, che ridimensiona gli aggiornamenti separatamente per ogni parametro. Il parametro
beta1controlla la memoria del gradiente.
Un esempio minimo con PyTorch#
Questo esempio con PyTorch confronta gli stessi punti di partenza e tassi di apprendimento su un obiettivo quadratico allungato. L'implementazione SGD ufficiale gestisce automaticamente il buffer del 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}")Dopo 100 aggiornamenti, la perdita è di circa 0.056531 senza momentum e 0.000216 con momentum. La memoria direzionale accumulata accelera i progressi lungo la coordinata meno ripida.
Utilizzi nell'addestramento per la visione artificiale#
Il momentum supporta l'addestramento delle reti neurali convoluzionali per la classificazione delle immagini e il rilevamento di oggetti. L'addestramento di Ultralytics YOLO attiva il momentum di Nesterov quando è selezionato optimizer="SGD", mentre l'impostazione momentum controlla la cronologia degli aggiornamenti conservata. L'implementazione dell'addestratore passa il coefficiente all'ottimizzatore con nesterov=True.
Un'applicazione fondamentale è la procedura di addestramento originale di ResNet per ImageNet. Questi modelli usavano SGD con momentum 0.9, una dimensione del batch di 256, un decadimento dei pesi di 0.0001 e un tasso di apprendimento iniziale di 0.1, ridotto di dieci volte quando l'errore si stabilizzava.










