Back-propagation

La back-propagation è senz'altro il paradigma delle reti neurali più universalmente usato ed è basato sulle reti neurali feed-forward con apprendimento supervised, visto precedentemente. Il meccanismo si basa sull'intuizione avuta da S. Freud su come il cervello umano si adattasse alle varie situazioni nel tempo. Nella sua idea Freud ipotizzò un flusso chimico in direzione opposta al normale flusso elettrico eccitatorio. Da qui il nome di back-propagation, ovvero propagazione all'indietro. Nel modello matematico quello che viene propagato all'indietro è l'errore tra l'uscita voluta e l'uscita reale della rete per un particolare stato di ingresso. Si ottiene così un algoritmo che appartiena alla classe degli algoritmi che realizzano una discesa del gradiente, ovvero si cerca un minimo (nella maggior parte dei casi locale) della superficie dell'errore. La trattazione qui svolta si rifà a quella derivata dalla regola Delta generalizzata da Rumelhart, Hinton e Williams ([26]).

Riferendoci alla figura 4.2, l'algoritmo si può così riassumere: dato un particolare vettore di ingressi si applica tale vettore alla rete neurale e si ottiene l'uscita $z$, si confronta tale uscita con l'uscita voluta $y$ calcolando l'errore quadratico dato da:

\begin{displaymath}
E=\frac{1}{2}\cdot\sum_k{(z_k-y_k)^2}.
\end{displaymath} (4.2)

A questo punto si deve calcolare la variazione dei pesi sulle sinapsi attraverso la propagazione dell'errore, ovvero si correggono i pesi delle sinapsi in verso opposto alla superficie dell'errore (infatti tale algoritmo viene chiamato anche step-descend, ovvero discende la superficie dell'errore nel verso del gradiente).

La variazione dell'errore in funzione della variazione dei pesi sinaptici è data da $\frac{dE}{dw_{ij}}$ e attraverso la regola di derivazione a catena:

\begin{displaymath}\frac{dE}{dw_ij} = \frac{dE}{dy_j} \cdot \frac{dy_j}{du_j} \cdot \frac{du_j}{dw_ij},\end{displaymath}

dove $\frac{dE}{dy_j}$ è la derivata dell'errore rispetto all'uscita $y_j$ del neurone $j$; $\frac{dy_j}{du_j}$ è la derivata dell'uscita $y_j$ rispetto all'energia di attivazione $u_j$ e $\frac{du_j}{dw_ij}$ è la derivata dell'attivazione del nodo di uscita rispetto al peso sinaptico.

Dalla formula 4.2 si ricava:

\begin{displaymath}\frac{dE}{dy_j}=y_j-z_j\end{displaymath}

La derivata dell'uscita $y_j$ rispetto all'energia di attivazione $u_j$ è la derivata dell'operatore interno al neurone sopra citato $y_j=tanh(u_j)$, ovvero:

\begin{displaymath}\frac{dy_j}{du_j}=\frac{1+y_j}{1-y_j}.\end{displaymath}

La derivata $\frac{du_j}{dw_ij}$ è data dall'equazione 4.1 e vale:

\begin{displaymath}\frac{du_j}{dw_ij}=x_j,\end{displaymath}

dove $x_j$ è l'ingresso del $j$-esimo neurone di uscita, ovvero l'uscita del neurone -esimo dello strato nascosto. Nel caso in cui lo strato di uscita abbia funzione di trasferimento lineare, semplicemente nelle formule precedenti si ha $\frac{dy_j}{du_j}=1.$

Si può così ricavare la variazione dei pesi:

\begin{displaymath}
\Delta w_{ij}=\eta\cdot (z_j-y_j)\cdot \left(\frac{1+y_j}{1-y_j}\right)\cdot x_i;
\end{displaymath} (4.3)

il termine $\eta$ è una costante che determina la velocità di convergenza dell'algoritmo ed è un termine determinato in modo euristico molto importante: infatti un valore troppo piccolo può determinare una velocità di convergenza molto lenta, mentre un valore troppo grande può portare alla instabilità (non convergenza) dell'algoritmo.

La regola così ricavata è valida solo per i neuroni dello strato di uscita. L'applicazione dell'algoritmo per lo strato nascosto è più problematica, in quanto il valore di uscita del neurone nascosto non è direttamente legato al valore voluto in uscita dalla rete neurale. Esprimendo la 4.3 come prodotto di una funzione di errore $d_j=(z_j-y_j)\cdot \left(\frac{1+y_j}{1-y_j}\right)$ per l'ingresso del neurone $x_i$:

\begin{displaymath}\Delta w_{ij}=\eta\cdot d_j\cdot x_i\end{displaymath}

si può ricavare un'espressione analoga per i neuroni dello strato nascosto. La logica alla base è quella che un neurone nascosto direttamente collegato allo strato di uscita deve essere corretto in proporzione al suo contributo al neurone dello strato di uscita che è stato corretto.

In termini probabilistici un neurone nascosto che ha una forte connessione con un un neurone di uscita fortemente ``sbagliato'' ha molta probabilità di essere lui stesso contributo di errore. Matematicamente si può allora definire la funzione di errore per un neurone dello strato nascosto come:

\begin{displaymath}d_i=\left(\frac{1+h_j}{1-h_j}\right) \cdot\sum_j d_j\cdot w_{ij},\end{displaymath}

dove $h_j$ è l'uscita del neurone nascosto $j$-esimo.

La procedura è facilmente generalizzabile per reti con più strati nascosti.

La dipendenza della stabilità dell'algoritmo dal parametro $\eta$ ha suggerito diverse varianti alla back-propagation standard. La soluzione qui adottata è una variante della regola delta-bar proposta da R. A. Jacobs nel 1988. Tale metodo (detto anche back-propagation con momento di inerzia o back-propagation adattativa), prevede la variazione del parametro $\eta$ passo per passo di una quantità $\eta=\eta+k$, dove $k$ è di un ordine di grandezza inferiore a $\eta$, nel caso di diminuzione dell'errore definito dalla eq. 4.2 (stabilità dell'algoritmo), oppure di una variazione di $\eta=\eta\cdot(1-\Theta)$, con $0 < \Theta <1$, nel caso di aumento dell'errore (instabilità dell'algoritmo). Il risultato finale che si ottiene è quello di superare dei minimi locali nella superficie dell'errrore, facendo in modo così che l'algoritmo non venga ``intrappolato'' in tali minimi. Maggiori dettagli verranno esposti nel capitolo 6, dedicato all'effettiva realizzazione del controlo neurale.

Bofh 2004-02-09