Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Propagazione All'Indietro | Rete Neurale da Zero
Introduzione alle Reti Neurali

bookPropagazione All'Indietro

La propagazione all'indietro (backprop) è il processo di calcolo di come la funzione di perdita varia rispetto a ciascun parametro della rete. L'obiettivo è aggiornare i parametri nella direzione che riduce la perdita.

Per ottenere questo risultato, si utilizza l'algoritmo di discesa del gradiente e si calcolano le derivate della perdita rispetto ai valori di pre-attivazione di ciascun livello (valori grezzi prima dell'applicazione della funzione di attivazione), propagandoli all'indietro.

Ogni livello contribuisce alla previsione finale, quindi i gradienti devono essere calcolati in modo strutturato:

  1. Eseguire la propagazione in avanti;
  2. Calcolare la derivata della perdita rispetto alla pre-attivazione di uscita;
  3. Propagare questa derivata all'indietro attraverso i livelli utilizzando la regola della catena;
  4. Calcolare i gradienti per pesi e bias per aggiornarli.
Note
Nota

I gradienti rappresentano il tasso di variazione di una funzione rispetto ai suoi input, ovvero sono le sue derivate. Indicano quanto una piccola variazione di pesi, bias o attivazioni influisce sulla funzione di perdita, guidando il processo di apprendimento del modello tramite la discesa del gradiente.

Notazione

Per rendere la spiegazione più chiara, utilizziamo la seguente notazione:

  • WlW^l è la matrice dei pesi del livello ll;
  • blb^l è il vettore dei bias del livello ll;
  • zlz^l è il vettore delle pre-attivazioni del livello ll;
  • ala^l è il vettore delle attivazioni del livello ll;

Pertanto, ponendo a0a^0 uguale a xx (gli input), la propagazione in avanti in un percettrone con n livelli può essere descritta dalla seguente sequenza di operazioni:

a0=x,......z1=W1a0+b1,zl=Wlal1+bl,zn=Wnan1+bn,a1=f1(z1),al=fl(zl),an=fn(zn),......y^=an.\begin{aligned} a^0 &= x, & &... & &...\\ z^1 &= W^1 a^0 + b^1, & z^l &= W^l a^{l-1} + b^l, & z^n &= W^n a^{n-1} + b^n,\\ a^1 &= f^1(z^1), & a^l &= f^l(z^l), & a^n &= f^n(z^n),\\ &... & &... & \hat y &= a^n. \end{aligned}

Per descrivere matematicamente la retropropagazione, introduciamo le seguenti notazioni:

  • dalda^l: derivata della funzione di perdita rispetto alle attivazioni allo strato ll;
  • dzldz^l: derivata della funzione di perdita rispetto alle pre-attivazioni allo strato ll (prima di applicare la funzione di attivazione);
  • dWldW^l: derivata della funzione di perdita rispetto ai pesi allo strato ll;
  • dbldb^l: derivata della funzione di perdita rispetto ai bias allo strato ll.

Calcolo dei gradienti per lo strato di output

All'ultimo strato nn, si calcola innanzitutto il gradiente della funzione di perdita rispetto alle attivazioni dello strato di output, danda^n. Successivamente, utilizzando la regola della catena, si calcola il gradiente della funzione di perdita rispetto alle pre-attivazioni dello strato di output:

dzn=danfn(zn)dz^n = da^n \odot f'^n(z^n)
Note
Nota

Il simbolo \odot rappresenta la moltiplicazione elemento per elemento. Poiché si lavora con vettori e matrici, il simbolo di moltiplicazione usuale \cdot rappresenta invece il prodotto scalare. fnf'^n è la derivata della funzione di attivazione dello strato di output.

Questa quantità rappresenta la sensibilità della funzione di perdita rispetto alle variazioni nella pre-attivazione dello strato di output.

Una volta ottenuto dzn\text d z^n, si calcolano i gradienti per i pesi e i bias:

dWn=dzn(an1)Tdbn=dzn\begin{aligned} dW^n &= dz^n \cdot (a^{n-1})^T\\ db^n &= dz^n \end{aligned}

dove (an1)T(a^{n-1})^T è il vettore trasposto delle attivazioni provenienti dallo strato precedente. Dato che il vettore originale è un vettore nneurons×1n_{neurons} \times 1, il vettore trasposto è 1×nneurons1 \times n_{neurons}.

Per propagare questa quantità all'indietro, si calcola la derivata della perdita rispetto alle attivazioni dello strato precedente:

dan1=(Wn)Tdznda^{n-1} = (W^n)^T \cdot dz^n

Propagazione dei Gradienti agli Strati Nascosti

Per ogni strato nascosto ll la procedura è la stessa. Dato dalda^l:

  1. Calcolare la derivata della perdita rispetto alle pre-attivazioni;
  2. Calcolare i gradienti per i pesi e i bias;
  3. Calcolare dal1da^{l-1} per propagare la derivata all'indietro.
dzl=dalfl(zl)dWl=dzl(al1)Tdbl=dzldal1=(Wl)Tdzl\begin{aligned} dz^l &= da^l \odot f'^l(z^l)\\ dW^l &= dz^l \cdot (a^{l-1})^T\\ db^l &= dz^l\\ da^{l-1} &= (W^l)^T \cdot dz^l \end{aligned}

Questo passaggio si ripete fino a raggiungere lo strato di input.

Aggiornamento di pesi e bias

Una volta calcolati i gradienti per tutti gli strati, si aggiornano i pesi e i bias utilizzando la discesa del gradiente:

Wl=WlαdWlbl=blαdbl\begin{aligned} W^l &= W^l - \alpha \cdot dW^l\\ b^l &= b^l - \alpha \cdot db^l \end{aligned}

dove α\alpha è il tasso di apprendimento, che controlla quanto vengono modificati i parametri.

question mark

Durante la retropropagazione, come aggiorna una rete neurale i suoi pesi e bias per minimizzare la funzione di perdita?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 2. Capitolo 7

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Awesome!

Completion rate improved to 4

bookPropagazione All'Indietro

Scorri per mostrare il menu

La propagazione all'indietro (backprop) è il processo di calcolo di come la funzione di perdita varia rispetto a ciascun parametro della rete. L'obiettivo è aggiornare i parametri nella direzione che riduce la perdita.

Per ottenere questo risultato, si utilizza l'algoritmo di discesa del gradiente e si calcolano le derivate della perdita rispetto ai valori di pre-attivazione di ciascun livello (valori grezzi prima dell'applicazione della funzione di attivazione), propagandoli all'indietro.

Ogni livello contribuisce alla previsione finale, quindi i gradienti devono essere calcolati in modo strutturato:

  1. Eseguire la propagazione in avanti;
  2. Calcolare la derivata della perdita rispetto alla pre-attivazione di uscita;
  3. Propagare questa derivata all'indietro attraverso i livelli utilizzando la regola della catena;
  4. Calcolare i gradienti per pesi e bias per aggiornarli.
Note
Nota

I gradienti rappresentano il tasso di variazione di una funzione rispetto ai suoi input, ovvero sono le sue derivate. Indicano quanto una piccola variazione di pesi, bias o attivazioni influisce sulla funzione di perdita, guidando il processo di apprendimento del modello tramite la discesa del gradiente.

Notazione

Per rendere la spiegazione più chiara, utilizziamo la seguente notazione:

  • WlW^l è la matrice dei pesi del livello ll;
  • blb^l è il vettore dei bias del livello ll;
  • zlz^l è il vettore delle pre-attivazioni del livello ll;
  • ala^l è il vettore delle attivazioni del livello ll;

Pertanto, ponendo a0a^0 uguale a xx (gli input), la propagazione in avanti in un percettrone con n livelli può essere descritta dalla seguente sequenza di operazioni:

a0=x,......z1=W1a0+b1,zl=Wlal1+bl,zn=Wnan1+bn,a1=f1(z1),al=fl(zl),an=fn(zn),......y^=an.\begin{aligned} a^0 &= x, & &... & &...\\ z^1 &= W^1 a^0 + b^1, & z^l &= W^l a^{l-1} + b^l, & z^n &= W^n a^{n-1} + b^n,\\ a^1 &= f^1(z^1), & a^l &= f^l(z^l), & a^n &= f^n(z^n),\\ &... & &... & \hat y &= a^n. \end{aligned}

Per descrivere matematicamente la retropropagazione, introduciamo le seguenti notazioni:

  • dalda^l: derivata della funzione di perdita rispetto alle attivazioni allo strato ll;
  • dzldz^l: derivata della funzione di perdita rispetto alle pre-attivazioni allo strato ll (prima di applicare la funzione di attivazione);
  • dWldW^l: derivata della funzione di perdita rispetto ai pesi allo strato ll;
  • dbldb^l: derivata della funzione di perdita rispetto ai bias allo strato ll.

Calcolo dei gradienti per lo strato di output

All'ultimo strato nn, si calcola innanzitutto il gradiente della funzione di perdita rispetto alle attivazioni dello strato di output, danda^n. Successivamente, utilizzando la regola della catena, si calcola il gradiente della funzione di perdita rispetto alle pre-attivazioni dello strato di output:

dzn=danfn(zn)dz^n = da^n \odot f'^n(z^n)
Note
Nota

Il simbolo \odot rappresenta la moltiplicazione elemento per elemento. Poiché si lavora con vettori e matrici, il simbolo di moltiplicazione usuale \cdot rappresenta invece il prodotto scalare. fnf'^n è la derivata della funzione di attivazione dello strato di output.

Questa quantità rappresenta la sensibilità della funzione di perdita rispetto alle variazioni nella pre-attivazione dello strato di output.

Una volta ottenuto dzn\text d z^n, si calcolano i gradienti per i pesi e i bias:

dWn=dzn(an1)Tdbn=dzn\begin{aligned} dW^n &= dz^n \cdot (a^{n-1})^T\\ db^n &= dz^n \end{aligned}

dove (an1)T(a^{n-1})^T è il vettore trasposto delle attivazioni provenienti dallo strato precedente. Dato che il vettore originale è un vettore nneurons×1n_{neurons} \times 1, il vettore trasposto è 1×nneurons1 \times n_{neurons}.

Per propagare questa quantità all'indietro, si calcola la derivata della perdita rispetto alle attivazioni dello strato precedente:

dan1=(Wn)Tdznda^{n-1} = (W^n)^T \cdot dz^n

Propagazione dei Gradienti agli Strati Nascosti

Per ogni strato nascosto ll la procedura è la stessa. Dato dalda^l:

  1. Calcolare la derivata della perdita rispetto alle pre-attivazioni;
  2. Calcolare i gradienti per i pesi e i bias;
  3. Calcolare dal1da^{l-1} per propagare la derivata all'indietro.
dzl=dalfl(zl)dWl=dzl(al1)Tdbl=dzldal1=(Wl)Tdzl\begin{aligned} dz^l &= da^l \odot f'^l(z^l)\\ dW^l &= dz^l \cdot (a^{l-1})^T\\ db^l &= dz^l\\ da^{l-1} &= (W^l)^T \cdot dz^l \end{aligned}

Questo passaggio si ripete fino a raggiungere lo strato di input.

Aggiornamento di pesi e bias

Una volta calcolati i gradienti per tutti gli strati, si aggiornano i pesi e i bias utilizzando la discesa del gradiente:

Wl=WlαdWlbl=blαdbl\begin{aligned} W^l &= W^l - \alpha \cdot dW^l\\ b^l &= b^l - \alpha \cdot db^l \end{aligned}

dove α\alpha è il tasso di apprendimento, che controlla quanto vengono modificati i parametri.

question mark

Durante la retropropagazione, come aggiorna una rete neurale i suoi pesi e bias per minimizzare la funzione di perdita?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 2. Capitolo 7
some-alt