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