Con la formula sopraesposta potremmo gia costruire un programma che effettui l'addestramento di una rete priva di strati nascosti(cioè con il solo strato di output decisionale), sostituendo allo strato nascosto lo strato di input.
Se consideriamo una rete con uno strato hidden dobbiamo invece ripetere il calcolo precedente (tra output e hidden), tra lo strato hidden e lo strato di input.
A questo punto sorge una difficoltà in più: nel primo calcolo noi conoscevamo l'errore sullo strato di output dato da(D[j]-y[j]), mentre adesso non conosciamo l'errore sullo strato hidden. Qui entra in gioco il concetto di retropropagazione dell'errore proprio per calcolare quale errore è presente nello strato nascosto(uso indifferentemente i termini hidden e nascosto) in corrispondenza dell'errore nello strato di output.
La tecnica è quella di fare percorrere all'errore sull'output un cammino inverso attraverso le connessioni pesate tra output e hidden (da qui il nome "retropropagazione"). Tradurre in termini matematici ciò che sembra un concetto fisicamente banale risulta invece un lavoro un po’ più complesso ma ci proviamo lo stesso iniziando con il definire la formula di modifica per i pesi tra hidden e input analoga alla precedente (discesa del gradiente):
delta_w1[j][k]=-epsilon*(d err / d w1[j][k])
sviluppiamo la derivata nel seguente modo:
delta_w1[j][k]=-epsilon*(d err/d I[k])*(d I[k]/d w1[j][k])
chiamiamo delta[k]=-(d err/d I[k])
e applicando la regola di composizione delle derivate possiamo scrivere
delta[k]=-(d err/d I[j])*(d I[j]/d h[k])*(d h[k]/d I[k])
dove h[k]=attivazione del k_esimo neurone hidden
quindi anche
delta[k]=-(E(j)(d err/d I[j])*(d I[j]/d h[k]))*(d h[k]/d I[k])
dato che l'operatore sommatoria agisce solo sui fattori aggiunti che si annullano.
Notiamo ora che il primo termine (d err/d I[j])=delta[j] che abbiamo incontrato nei calcoli precedenti e che il secondo (d I[j]/d h[k]) puo essere calcolato come
d E(k) w2[k][j]*h[k]/d h[k] = w2[k][j]
mentre il terzo d h[k]/d I[k] = d h[k]/d (1/1+e**(-h[k]) = h[k]*(1-h[k]
otteniamo finalmente:
delta_w1[j][k]= epsilon * delta[k] * x[j]
in cui
x[i]= i_esimo input
delta[k]= (E[j] delta[j] * w2[k][j]) * h[k] * (1-h[k])
in cui
h[k]= attivazione neurone k dello strato hidden (conosciuto ovviamente eseguendo la rete, cioè moltiplicando gli input per i pesi delle connessioni e sommando tutto)
delta[j] = (D[j]-y[j]) * (y[j]) * (1-y[j])
già calcolato nella parte precedente (quella relativa alla modifica dei pesi tra output e hidden).
Notate che delta[j] contiene effettivamente la retropropagazione dell'errore e infatti è l'unico termine che contiene dati relativi allo strato di output contenuto nel calcolo del delta_w1.
Luca Marchese
Successivo: Simulazione in C di esecuzione e apprendimento
Sommario: Indice