PDA

View Full Version : [C++] Reti neurali back propagation


Teo@Unix
20-08-2010, 15:45
Bene,

avrei bisogno di un chiarimento relativamente al calcolo dell'errore degli strati nascosti della mia rete.
Stando alla teoria, io trovo l'errore (dj) nel modo seguente:

dj = Oj (1 - Oj) * Sommatoria( dk * Wkj )

dove
con Oj indico il valore di ouptut del neurone nascosto,
dk è l'errore del neurone dello strato successivo a quello corrente,
Wkj sono i pesi relativi al neurone dello strato successivo appena menzionato.

Nella sommatoria, devo tenere conto del valore soglia chiamato anche bias?
Lo devo includere nella sommatoria al pari degli altri pesi?

Grazie.

Teo@Unix
20-08-2010, 17:21
Nel tentativo di rispondermi direi di si.

E direi anche che devo modificarlo al pari degli altri, dato che la variazione dei pesi è dipendente dall'errore del layer successivo, e a sua volta dipende dal valore bias.

Spero di spiegarmi :rolleyes: ...

Ad esempio il layer nascosto appena prima a quello di output avrà tutti i neuroni con il peso bias aggiuntivo....
questo verrà aggiornato con il delta calcolato....

marco.r
21-08-2010, 00:07
Nel tentativo di rispondermi direi di si.

E direi anche che devo modificarlo al pari degli altri, dato che la variazione dei pesi è dipendente dall'errore del layer successivo, e a sua volta dipende dal valore bias.

Spero di spiegarmi :rolleyes: ...

Ad esempio il layer nascosto appena prima a quello di output avrà tutti i neuroni con il peso bias aggiuntivo....
questo verrà aggiornato con il delta calcolato....

Ciao, qua forse meglio scrivere giu' un paio di formule...
ad ogni passo la regola per l'aggiornamento dei pesi e' la seguente:

http://mathurl.com/3am79mt.png
http://mathurl.com/22qqfla.png
Qui sopra o_i e' l'output del neurone i-esimo, t_i il valore target mentre \sigma' e' la derivata della funzione di attivazione, \eta infine e' il fattore di apprendimento (che non serve altro per modificare la velocita' con cui viene effettuato l'apprendimento)

Quindi, se ho capito bene la tua domanda, la risposta e' si'

Teo@Unix
21-08-2010, 07:32
Perfetto! Grazie.

Mi ritrovo.
L'unica cosa è relativa alla sommatoria nel caso io mi trovi nel layer nascosto, il secondo caso illustrato.

Qui a differenza della mia:
dj = Oj (1 - Oj) * Sommatoria( dk * Wkj )

non vi è riportato l'errore (dk). A meno che W stà già per il prodotto.....

Per fare questo calcolo io utilizzo una variabile che rimane invariata nel ciclo di aggiornamento successivo (per la sommatoria).
Per intenderci, quando ciclo su ogni peso del neurone:
cur_bp_err += layers[l]->getNeuron(n)->getWeight(w)*error;

Questa "cur_bp_err" io la uso nel ciclo successivo (se non riguarda l'ouput layer) per calcolare l'errore da utilizzare per il calcolo della variazione dei pesi.
Ad esempio in questo modo:
error = layers[l]->getNeuron(n)->trans_func_derivate(layers[l]->getNeuron(n)->getValue())*prev_bp_err;

marco.r
21-08-2010, 13:35
Perfetto! Grazie.

Mi ritrovo.
L'unica cosa è relativa alla sommatoria nel caso io mi trovi nel layer nascosto, il secondo caso illustrato.

Qui a differenza della mia:
dj = Oj (1 - Oj) * Sommatoria( dk * Wkj )

non vi è riportato l'errore (dk). A meno che W stà già per il prodotto.....

Corretto, avevo messo un \deltaj invece che \delta_j nella formula latex...

Teo@Unix
21-08-2010, 14:38
ok! grazie molte per l'aiuto.

Ora devo trovare il modo di collaudare il tutto....
ma a me solitamente nulla funziona subito... :fagiano: