Retropropagazione: differenze tra le versioni
Nessun oggetto della modifica |
Nessun oggetto della modifica |
||
Riga 69: | Riga 69: | ||
|title=Backpropagation | |title=Backpropagation | ||
|title_mode=append | |title_mode=append | ||
|keywords= | |keywords=reti neurali, apprendimento automatico, intelligenza artificiale, backpropagation, algoritmo di apprendimento, ottimizzazione, gradienti, funzione obiettivo, loss, propagazione all'indietro | ||
|description= | |description=La backpropagation è un metodo fondamentale per addestrare le reti neurali. Questo articolo spiega come funziona la backpropagation, come calcola i gradienti per aggiornare i pesi del modello e minimizzare la funzione di perdita. Vengono inoltre illustrati esempi di applicazione in diversi tipi di reti neurali, come le reti feed-forward, le RNN e i modelli seq2seq. | ||
}} | }} |
Versione attuale delle 13:47, 17 ago 2024
Retropropagazione | |
---|---|
Nome Inglese | Backpropagation |
Sigla | Backprop |
La backpropagation è un metodo per il calcolo dei gradienti utilizzato per il training delle reti neurali. Essa ha senso solo in un contesto di apprendimento supervisionato o autosupervisionato, cioè quando si conosce il valore atteso del modello per un dato input. Essa è la chiave per capire come le reti neurali si addestrano.
Data una funzione obiettivo che misura la distanza fra il valore previsto dal modello nel suo stato attuale, ed il valore atteso, fornito come etichetta, la backpropagation calcola i gradienti di ogni parametro del modello - parametri che possono essere pesi e bias nel caso di reti feed-forward o RNN, oppure i valori di Q,K e V nei meccanismi di attention, oppure ancora la rappresentazione densa dei vettori per i layer embedding - per minimizzare questa funzione obiettivo o "loss". In generale, tutti i parametri così detti "learnable" sono soggetti a ottimizzazione da parte della backpropagation.
I valori così calcolati vengono normalmente passati all'ottimizzatore che, in base ad altri parametri, decide quali parametri aggiornare e di quanto.
Seguono alcuni esempi di come interpretare la backpropagation nelle varie architetture:
- in una rete "statica" per la classificazione, o feed-forward (layer densi), la backpropagation aggiorna i pesi e i bias di tutti i layer, per far sì che il valore del o dei neuroni di ouput sia più simile a quello dell'etichetta fornita
- in una rete neurale ricorrente (RNN) la backpropagation calcola il gradiente di pesi e bias dei layer densi Whi, Whh, Who rispetto alla differenza dell'output con il valore predetto dopo il numero di step, prefissato. La backpropagation, in questo caso, è chiamata backpropagation-through-time (BPTT)
- in un modello seq2seq per la traduzione automatica, la backpropagation utilizza la funzione obiettivo (Cross-Entropy Loss ) fra la sequenza in output del decoder e la sequenza nell'etichetta. Si consideri che la sequenza di ouput è generata in modo autoregressivo: quindi la backpropagation "porterà" la rete verso la crezione di una sequenza "migliore" dato il contesto creato dall'encoder, e cercherà di far sì che questo contesto contenga la migliore rappresentazione possibile della sequenza di input. Come esempio di implementazione di veda per esempio qui .
I gradienti

Per riprendere un esempio posto in questo eccellente tutorial, immaginiamo una rete neurale composta da un solo neurone.
X -> [wx + b] -> y -> (y_hat - y])^2 -> loss
In questa rappresentazione la perdita è calcolata attraverso l'errore quadratico. Il calcolo del passo"forward" è, dato l'input 2.1 e l'etichetta "reale" 4:, il peso w = 2.1 e b = 0:
2.1 -> [(1)(2.1) + 0] -> 2.1 -> (2.1 - 4])^2 -> 3.61
Ora si può andare a ritroso per calcolare i gradienti del bias b e del peso w, nel seguente modo:
- Come cambia la perdita in base a y_hat (la predizione)? questa è dLoss / dy_hat. La derivata di (y_hat - y]^2 è 2*(y_hat-y). La domanda a cui risponde il gradiente è sapere quanto cambia la loss a ogni unità di cambiamento di y_hat. Il valore è di 2(2.1-4) = -3.8
- Invece il gradiente di una funzione lineare come quella individuata da b e w (una retta) rispetto a b e w, è rispettivamente 1 (per ogni aumento unitario di b, la funzione aumenta di uno) e w (il coefficiente angolare). Questo permette di calcolare dy_hat/db e dy_hat/dw.

Ci ri riferisca all'immagine backprop_3 per vedere il resto della soluzione.

Gradienti Esplosivi
I gradienti esplosivi si verificano quando i gradienti diventano molto grandi, causando aggiornamenti eccessivi dei pesi della rete. Segni:
- Valori NaN nei gradienti o nei pesi.
- Aumento improvviso della funzione di perdita.
- Pesi che diventano molto grandi.
Soluzioni:
- Clipping dei gradienti: limitare i gradienti a una soglia massima.
- Regolarizzazione: tecniche come L2 per evitare pesi troppo grandi.
- Ridurre il tasso di apprendimento: per mitigare l'aggiornamento eccessivo dei pesi.
Gradienti Svanenti
I gradienti svanenti si verificano quando i gradienti diventano molto piccoli, impedendo l'aggiornamento efficace dei pesi. Segni:
- Convergenza molto lenta o assente.
- Cambiamenti minimi nei pesi.
- Prestazioni scarse nell'apprendere dipendenze a lungo termine.
Soluzioni:
- Uso di LSTM/GRU: architetture che aiutano a combattere il problema dei gradienti svanenti.
- Tecniche di inizializzazione: come l'inizializzazione Xavier o He.
- Connessioni dirette: per mitigare i gradienti svanenti permettendo un percorso alternativo per il flusso del gradiente.
Implementazione in PyTorch
La backpropagation in pytorch viene calcolata, dopo la chiamata del forward pass, nel seguente modo
prediction = model(data) # forward pass loss = (prediction - labels).sum() loss.backward() # backward pass
A questo punto sarà possibile chiamare l'ottimizzatore
optim.step() #gradient descent