Demo backpropagation
$$ \definecolor{input}{RGB}{66, 133, 244} \definecolor{output}{RGB}{219, 68, 55} \definecolor{dinput}{RGB}{244, 180, 0} \definecolor{doutput}{RGB}{15, 157, 88} \definecolor{dweight}{RGB}{102, 0, 255} $$

Algoritmo di propagazione

L'algoritmo di propagazione è essenziale per addestrare rapidamente grandi reti neurali. Questo articolo spiega come funziona l'algoritmo.

Scorri verso il basso...

Rete neurale semplice

A destra è visualizzata una rete neurale con un input, un nodo di output e due livelli nascosti di due nodi ciascuno.

I nodi nei livelli adiacenti sono connessi alle ponderazioni \(w_{ij}\), che sono i parametri di rete.

Funzione di attivazione

Ogni nodo ha un input totale \(\color{input}x\), una funzione di attivazione \(f(\color{input}x\color{black})\) e un output \(\color{output}y\color{black}=f(\color{input}x\color{black})\). \(f(\color{input}x\color{black})\) deve essere una funzione non lineare, altrimenti la rete neurale potrà imparare solo i modelli lineari.

Una funzione di attivazione di uso comune è la funzione Sigmoid: \(f(\color{input}x\color{black}) = \frac{1}{1+e^{-\color{input}x}}\).

Funzione di errore

Lo scopo è apprendere automaticamente le ponderazioni della rete dai dati, in modo che l'output previsto \(\color{output}y_{output}\) sia vicino al target \(\color{output}y_{target}\) per tutti gli input \(\color{input}x_{input}\).

Per misurare la distanza dall'obiettivo, utilizziamo una funzione di errore \(E\). Una funzione di errore comunemente utilizzata è \(E(\color{output}y_{output}\color{black},\color{output}y_{target}\color{black}) = \frac{1}{2}(\color{output}y_{output}\color{black} - \color{output}y_{target}\color{black})^2 \).

Propagazione avanti

Iniziamo con un esempio di input \((\color{input}x_{input}\color{black},\color{output}y_{target}\color{black})\) e aggiorniamo il livello di input della rete.

Per coerenza, l'input è considerato come qualsiasi altro nodo, ma senza una funzione di attivazione, quindi l'output è uguale a quello dell'input, ovvero \( \color{output}y_1 \color{black} = \color{input} x_{input} \).

Propagazione avanti

Ora aggiorniamo il primo livello nascosto. Prendiamo l'output \(\color{output}y\) dei nodi nel livello precedente e utilizziamo le ponderazioni per calcolare l'input \(\color{input}x\) dei nodi nel livello successivo.
$$ \color{input} x_j \color{black} = $$$$ \sum_{i\in in(j)} w_{ij}\color{output} y_i\color{black} +b_j$$

Propagazione avanti

Quindi aggiorniamo l'output dei nodi nel primo livello nascosto. Per questo utilizziamo la funzione di attivazione, \( f(x) \).
$$ \color{output} y \color{black} = f(\color{input} x \color{black})$$

Propagazione avanti

Utilizzando queste due formule, propagamo il resto della rete e ottieni l'output finale della rete.
$$ \color{output} y \color{black} = f(\color{input} x \color{black})$$
$$ \color{input} x_j \color{black} = $$$$ \sum_{i\in in(j)} w_{ij}\color{output} y_i \color{black} + b_j$$

Derivazione di errori

L'algoritmo di propagazione decide quanto aggiornare ogni ponderazione della rete dopo aver confrontato l'output previsto con l'output desiderato per uno specifico esempio. Per questo motivo, dobbiamo calcolare la variazione dell'errore in relazione a ogni ponderazione \(\color{dweight}\frac{dE}{dw_{ij}}\).
Una volta ottenute le derivate di errore, possiamo aggiornare le ponderazioni utilizzando una semplice regola di aggiornamento:
$$w_{ij} = w_{ij} - \alpha \color{dweight}\frac{dE}{dw_{ij}}$$
dove \(\alpha\) è una costante positiva, nota come tasso di apprendimento, che dobbiamo perfezionare empiricamente.

[Nota] La regola di aggiornamento è molto semplice: se l'errore cala quando la ponderazione aumenta (\(\color{dweight}\frac{dE}{dw_{ij}}\color{black} < 0\)), aumenta la ponderazione, altrimenti se l'errore aumenta quando la ponderazione aumenta (\(\color{dweight}\frac{dE}{dw_{ij}} \color{black} > 0\)), la ponderazione diminuisce.

Derivati aggiuntivi

Per facilitare il calcolo \(\color{dweight}\frac{dE}{dw_{ij}}\), archiviamo inoltre per ciascun nodo altre due derivate: come cambia l'errore con:
  • l'input totale del nodo \(\color{dinput}\frac{dE}{dx}\) e
  • l'output del nodo \(\color{doutput}\frac{dE}{dy}\).

Propagazione della schiena

Iniziamo la propagazione delle derivate di errore. Poiché disponiamo dell'output previsto di questo particolare esempio di input, possiamo calcolare in che modo l'errore viene modificato con quell'output. Considerata la nostra funzione di errore, \(E = \frac{1}{2}(\color{output}y_{output}\color{black} - \color{output}y_{target}\color{black})^2\) abbiamo:
$$ \color{doutput} \frac{\partial E}{\partial y_{output}} \color{black} = \color{output} y_{output} \color{black} - \color{output} y_{target}$$

Propagazione della schiena

Ora che abbiamo \(\color{doutput} \frac{dE}{dy}\) possiamo \(\color{dinput}\frac{dE}{dx}\) usare la regola della catena,
$$\color{dinput} \frac{\partial E}{\partial x} \color{black} = \frac{dy}{dx}\color{doutput}\frac{\partial E}{\partial y} \color{black} = \frac{d}{dx}f(\color{input}x\color{black})\color{doutput}\frac{\partial E}{\partial y}$$
dove \(\frac{d}{dx}f(\color{input}x\color{black}) = f(\color{input}x\color{black})(1 - f(\color{input}x\color{black}))\) quando \(f(\color{input}x\color{black})\) è la funzione di attivazione Sigmoid.

Propagazione della schiena

Non appena abbiamo la derivazione dell'errore per quanto riguarda l'input totale di un nodo, possiamo ottenere la derivata dell'errore per quanto riguarda le ponderazioni in entrata nel nodo.
$$\color{dweight} \frac{\partial E}{\partial w_{ij}} \color{black} = \frac{\partial x_j}{\partial w_{ij}} \color{dinput}\frac{\partial E}{\partial x_j} \color{black} = \color{output}y_i \color{dinput} \frac{\partial E}{\partial x_j}$$

Propagazione della schiena

E utilizzando la regola catena, possiamo anche ottenere \(\frac{dE}{dy}\) dal livello precedente. Abbiamo fatto un giro completo.
$$ \color{doutput} \frac{\partial E}{\partial y_i} \color{black} = \sum_{j\in out(i)} \frac{\partial x_j}{\partial y_i} \color{dinput} \frac{\partial E}{\partial x_j} \color{black} = \sum_{j\in out(i)} w_{ij} \color{dinput} \frac{\partial E}{\partial x_j}$$

Propagazione della schiena

Occorre ripetere le tre formule precedenti finché non avremo calcolato tutti i derivati degli errori.

Fine.

Calcolo in corso...