2012-11-29 28 views
8

Uso una rete neurale composta da 4 neuroni di ingresso, 1 strato nascosto costituito da 20 neuroni e uno strato di uscita di 7 neuroni.Rete neurale con tanh saturazione errata con dati normalizzati

Sto provando ad addestrarlo per un algoritmo da bcd a 7 segmenti. I miei dati sono normalizzati 0 è -1 e 1 è 1.

Quando si verifica la valutazione dell'errore di uscita, il neurone si satura errato. Se l'output desiderato è 1 e l'output reale è -1, l'errore è 1-(-1)= 2.

Quando lo si moltiplica per la derivata della funzione di attivazione error*(1-output)*(1+output), l'errore diventa quasi 0 a causa di 2*(1-(-1)*(1-1).

Come posso evitare questo errore di saturazione?

+0

Quindi questo potrebbe essere solo non mio dominio ma non ho assolutamente idea di come sia possibile risolvere questo dalle informazioni fornite.Inoltre, non so se "tanh" sia un errore di battitura o una tangente iperbolica. – djechlin

+0

tanh is hbolbolic tangent :) – PVJ

risposta

7

La saturazione degli asintoti della funzione di attivazione è un problema comune con le reti neurali. Se guardi un grafico della funzione, non sorprende: sono quasi piatti, il che significa che la prima derivata è (quasi) 0. La rete non può più imparare.

Una soluzione semplice consiste nel ridimensionare la funzione di attivazione per evitare questo problema. Ad esempio, con funzione di attivazione tanh() (mio preferito), si raccomanda di utilizzare la seguente funzione di attivazione quando l'uscita desiderata è in {-1, 1}:

f(x) = 1.7159 * tanh(2/3 * x) 

conseguenza, il derivato è

f'(x) = 1.14393 * (1- tanh(2/3 * x)) 

Questo forzerà i gradienti nell'intervallo di valori più non lineare e accelera l'apprendimento. Per tutti i dettagli vi consiglio di leggere l'ottimo documento di Yann LeCun Efficient Back-Prop. Nel caso di tanh() funzione di attivazione, l'errore sarebbe stato calcolato come

error = 2/3 * (1.7159 - output^2) * (teacher - output) 
+2

La derivata è errata, dovrebbe essere: 'f '(x) = 1.14393 * (1- tanh^2 (2/3 * x))' => 'f' (x) = 0.6667 * 1.7159 * (1 - tanh (2/3 * x)) * (1 + tanh (2/3 * x))) ' => f '(x) = 0.6667/1.7159 * (1.7159 - 1.7159 * tanh (2/3 * x)) * (1.7159 + 1.7159 * tanh (2/3 * x)) ' => 'f' (x) = 0.6667/1.7159 * (1.7159 - f (x)) * (1.7159 + f (x)) ' –

+0

Ho controllato il derivato numericamente https://github.com/hughperkins/ClConvolve/blob/master/notes/numericbackprop.gnumeric e le tue formule sono corrette Fukuzawa. –

2

Questo è destinato a verificarsi indipendentemente dalla funzione utilizzata. La derivata, per definizione, sarà zero quando l'uscita raggiunge uno dei due estremi. È passato un po 'di tempo da quando ho lavorato con Artificial Neural Networks ma, se ricordo bene, questo (tra molti altri aspetti) è uno dei limiti dell'utilizzo dell'algoritmo di back-propagation.

È possibile aggiungere uno Momentum factor per assicurarsi che vi sia una correzione basata sull'esperienza precedente, anche quando la derivata è zero.

Si potrebbe anche addestrarlo per epoca, dove si accumulano i valori delta per i pesi prima di eseguire l'aggiornamento effettivo (rispetto all'aggiornamento di ogni iterazione). Ciò riduce anche le condizioni in cui i valori delta oscillano tra due valori.

Potrebbero esserci metodi più avanzati, come i metodi del secondo ordine per la propagazione posteriore, che attenueranno questo particolare problema.

Tuttavia, tenere presente che tanh raggiunge -1 o +1 agli infiniti e il problema è puramente teorico.

0

Non completamente sicuro se sto leggendo la domanda correttamente, ma in tal caso, dovresti ridimensionare i tuoi input e target tra 0.9 e -0.9 che potrebbero aiutare i tuoi derivati ​​a essere più sani di mente.

+0

@danelliotster Puoi modificare la tua risposta per mostrare come la derivata sarà più sana. Ho downvoted in un momento di fretta. Non posso annullare ora a meno che non ci sia una modifica. –

Problemi correlati