Nel contesto del Deep Learning, la funzione che stiamo cercando di ottimizzare è la nostra funzione di perdita J. Definiamo le nostre perdite di addestramento come la media delle perdite per tutto il nostro set di dati di addestramento:
Dove Dtrain è il numero di campioni nel nostro set di dati di addestramento.
Pertanto, possiamo implementare la discesa del gradiente basata sul seguente algoritmo, in cui calcoliamo il gradiente delle perdite di addestramento rispetto ai pesi per un certo numero di epoche per eseguire un aggiornamento dei pesi del modello (2)
w = (0, ... ,0) # Initialize the weights
for k = 1,..., num_epochs: # Repeat for the desired number of iterations
grad = ∇w TrainLoss(w) # Gradient of the Training losses w(k) <-- w(k-1) - η * grad # Update the model weights
Il problema con la discesa del gradiente, come mostrato nello pseudo-codice sopra, è la sua bassa velocità.
Per un esempio di giocattolo con pochi punti e una funzione semplice potrebbe funzionare bene, ma immaginiamo di sviluppare una ANN e di avere un milione di punti dati per addestrarla.
Se desideriamo aggiornare i pesi del modello utilizzando la discesa del gradiente, dovremmo esaminare tutti i campioni dei dati di addestramento, solo per eseguire un aggiornamento dei pesi del modello. Quindi ripetilo, ancora e ancora, finché non raggiungiamo la convergenza. Un aggiornamento del peso per epoca.
Per superare questo problema, potremmo utilizzare il cosiddetto algoritmo Stochastic Gradient Descent
Discesa del gradiente stocastico
Per superare il problema della lenta convergenza della discesa del gradiente “vanilla”, possiamo eseguire un aggiornamento dei pesi del modello in base a ciascun campione del set di addestramento. Il vantaggio è che non è necessario attendere di aver eseguito il ciclo dell’intero set per eseguire un solo aggiornamento dei pesi.
Possiamo aggiornare i pesi più volte per epoca, poiché utilizziamo la funzione Perdita per ogni singolo campione, anziché per l’intera perdita di allenamento.
Questo è l’aspetto dell’algoritmo di discesa del gradiente stocastico (SGD).
w = (0, ... ,0) # Initialize the weights
for k = 1,..., num_epochs:
for (x, y) ∈ Dtrain:
grad = ∇w J(x,y,w)
w(k) <-- w(k-1) - η(k) * grad
Si noti che la dimensione del passo è una funzione delle iterazioni di training. Questo perché, affinché l’algoritmo converga, η deve diminuire con l’avanzare del numero di iterazioni. Nel dispense del MIT 6.036 (1), viene menzionato il seguente teorema:
Teorema 4.1. Se J è convesso e η
Fonte: towardsdatascience.com