Retropropagazione: differenze tra le versioni
Nessun oggetto della modifica |
m (Alesaccoia ha spostato la pagina Backpropagation a Retropropagazione) |
(Nessuna differenza)
|
Versione delle 09:29, 1 apr 2024
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 .
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