Home > Doc > Reti Neurali su .... > La Regola Delta

Reti neurali su Personal Computer e Fuzzy Logic: Reti Neurali Error Back Propagation

La Regola Delta

Ci troviamo esattamente al punto c del ciclo visto sopra e calcoliamo la differenza dell'output avuto all'unità j con quello desiderato: err(j)=D(j)-y(j) Se per ogni esempio facessimo la somma algebrica degli errori di ogni output, poiché questi sono compresi tra +1 e -1, rischieremmo di annullare l'errore globale e, comunque, commetteremmo un errore concettuale dato che per noi l'errore è tale sia nel senso negativo che positivo.

Possiamo ottenere una misura dell'errore globale facendo una somma dei quadrati degli errori (o in un programma in c usando una funzione che ci restituisca il valore assoluto di un float). err(j)=absolute(D(j)-y(j)) o err(j)=((D(j)-y(j))**2)/2 Supponiamo che l'errore globale della rete cosi calcolato sia e=0.3,mentre noi desideriamo che l'errore sia 0.01, ciò significa che dobbiamo cambiare i pesi delle connessioni ...ma come?

Consideriamo il peso della connessione specifica che collega y(k) dello strato di output al neurone h(j) dello strato intermedio: naturalmente variando questo peso l'errore su y(k) varia,supponiamo con una legge come quella di fig.5.


Il valore al quale dovremmo settare il peso della connessione è ovviamente il punto c che corrisponde al minimo dell'errore. Pertanto se noi riuscissimo a cercare tale punto minimo per ogni connessione avremmo ottenuto il risultato, cioè la rete sarebbe addestrata. La difficoltà di tale procedimento sta nel fatto che non possiamo analizzare singolarmente ogni connessione in modo sequenziale perchè la forma della funzione che lega ciascun peso con l'errore varia al variare degli altri pesi. Il problema della ottimizzazione dei pesi di una rete di tale tipo è in realtà la ricerca di un minimo di una funzione in uno spazio n-dimensionale che può essere ricondotto alla ricerca di un insieme di minimi coerenti di n funzioni in uno spazio bidimensionale.

Esiste solamente una tecnica empirica per ottenere la soluzione che viene denominata "discesa del gradiente". Ricordando che la derivata di una funzione è una misura della pendenza della funzione in quel punto, possiamo spiegare tale tecnica come segue: partiamo da un punto casuale(i pesi all'inizio hanno valori casuali) e facciamo piccoli spostamenti di segno opposto e proporzionali alla derivata della funzione in quel punto(significa che se ci troviamo in A faremo un piccolo spostamento verso B e se ci troviamo in D faremo un piccolo spostamento verso C).

In questo modo ci avviciniamo sempre più al minimo della funzione e quando sarà raggiunto, essendo la derivata in quel punto 0, non effettueremo più spostamenti. Con questa tecnica noi possiamo anche immaginare la forma della funzione modificarsi lentamente(a causa delle modifiche degli altri pesi) mentre noi ci muoviamo su di essa con spostamenti abbastanza piccoli da consentirci di tenere conto di tale movimento.

Naturalmente il minimo raggiunto potrebbe non essere il minimo assoluto ma un minimo locale, pero nell'insieme di tutti i minimi raggiunti è molto probabile che la grande maggioranza siano minimi assoluti. Esprimiamo in formula matematica il principio esposto nel seguente modo:


delta_w2=-epsilon*(d err/d w2)
dove d err/d w =derivata dell’ errore rispetto al peso
epsilon=costante di apprendimento che incide
sulla misura dello spostamento a parità
di "pendenza" nel punto specifico
(è consigliabile un valore compreso tra 0.1 e 0.9)


Proviamo a sviluppare questa derivata nel seguente modo:


delta_w2(k)(j)=-epsilon*(d err/d I(j))*(d I(j)/d w2(k)(j))
definendo delta(j)=d err/d I(j) si semplifica in
delta_w2(k)(j)=-epsilon * delta(j) * (d I(j)/d w2(k)(j))


e ricordiamo che la formula di attivazione di un neurone dello strato di output è


I(j)=E(k) w2(k)(j) * h(k)
dove h(k)=output del neurone k_esimo dello strato hidden
la sua derivata risulta d I(j)/d w2(k)(j)=h(k)


ritorniamo adesso a delta impostando


delta(j)=(d err/d y(j)) * (d y(j)/d I(j))
e risolviamo separatamente le due derivate in essa contenute:


prima derivata) d err/d y(j) = d (((D(j)-y(j))**2)/2)/d y(j) =-(D(j)-y(j))
seconda derivata) d y(j)/d I(j) =d (1/(1+e**(-I(j)))/d I(j) = y(j) * (1-y(j))


per cui dato che


delta_w2(j)=-epsilon * delta(j) * (d I(j)/d (w2(k)(j))
si ha delta_w2=-epsilon * delta(j) * h(k)
e delta(j)=(D(j)-y(j))*y(j)*(1-y(j))


abbiamo la formula che ci consente di calcolare i pesi delle connessioni tra i neuroni dello strato di output e quelli dello strato intermedio:


delta_w2[j][k]=epsilon*(D[j]-y[j]) * y[j] * (1-y[j]) * h[k]
dove conosciamo


D[j] come valore di output desiderato
y[j] come valore di output ottenuto
h[k] come stato di attivazione del
neurone k del livello intermedio

Luca Marchese

Successivo: La retropropagazione dell'errore

Sommario: Indice