Retropropagazione: differenze tra le versioni

Da Wiki AI.
Nessun oggetto della modifica
Nessun oggetto della modifica
Riga 15: Riga 15:
* in una [[Recurrent Neural Network (RNN)|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 una [[Recurrent Neural Network (RNN)|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 [[Sequence to Sequence (seq2seq)|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 [https://github.com/astorfi/sequence-to-sequence-from-scratch/blob/3e4660a6a2e26293657e1cdd528516887cf9e0d2/seq2seq.py#L338 qui] .
* in un modello [[Sequence to Sequence (seq2seq)|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 [https://github.com/astorfi/sequence-to-sequence-from-scratch/blob/3e4660a6a2e26293657e1cdd528516887cf9e0d2/seq2seq.py#L338 qui] .
=== I gradienti ===
[[File:Backward backprop.png|miniatura]]
Per riprendere un esempio posto in questo eccellente [https://xnought.github.io/backprop-explainer/ tutorial], immaginiamo una rete neurale composta da un solo neurone.
X -> [wx + b] -> y -> (y_hat - y])^2 -> loss
In questa rappresentazione la [[Funzione Obiettivo (loss)|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.
[[File:Backprop 3.png|miniatura|backprop_3]]
Ci ri riferisca all'immagine backprop_3 per vedere il resto della soluzione.
[[File:Backprop2.png|miniatura]]


=== In PyTorch ===
=== In PyTorch ===

Versione delle 12:17, 24 mag 2024

Nome: Retropropagazione

Nome inglese: backpropagation


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.
backprop_3

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

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