2012-11-29 8 views
8

Ich verwende ein neuronales Netzwerk aus 4 Eingangsneuronen, 1 versteckte Schicht aus 20 Neuronen und eine 7 Neuron-Ausgangsschicht.Neuronales Netzwerk mit tanh falscher Sättigung mit normalisierten Daten

Ich versuche es für einen bcd zu 7-Segment-Algorithmus zu trainieren. Meine Daten sind normalisiert 0 ist -1 und 1 ist 1.

Wenn die Ausgabe Fehlerauswertung geschieht, sättigt das Neuron falsch. Wenn der gewünschte Ausgang 1 ist und der tatsächliche Ausgang -1 ist, lautet der Fehler 1-(-1)= 2. Wenn ich es mit der Ableitung der Aktivierungsfunktion error*(1-output)*(1+output) multipliziere, wird der Fehler fast 0.

Wie kann ich diesen Sättigungsfehler vermeiden?

+0

dies einfach nicht meine Domäne sein, so berechnet werden, aber ich habe absolut keine Ahnung, wie es möglich ist, diese gegeben von der Information zu beheben.Ich weiß auch nicht, ob "tanh" ein Tippfehler oder ein hyperbolischer Tangens ist. – djechlin

+0

tanh ist hperbolische Tangente :) – PVJ

Antwort

7

Sättigung bei den Asymptoten der Aktivierungsfunktion ist ein häufiges Problem bei neuronalen Netzen. Wenn man sich ein Diagramm der Funktion anschaut, überrascht es nicht: Sie sind fast flach, was bedeutet, dass die erste Ableitung (fast) 0 ist. Das Netzwerk kann nicht mehr lernen.

Eine einfache Lösung ist die Skalierung der Aktivierungsfunktion, um dieses Problem zu vermeiden. Zum Beispiel mit tanh() Aktivierungsfunktion (mein Favorit), empfiehlt es sich die folgende Aktivierungsfunktion zu verwenden, wenn die gewünschte Ausgabe in ist {-1, 1}:

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

Folglich ist die Ableitung

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

Dies wird die Gradienten in den meisten nichtlinearen Wertebereich zwingen und das Lernen beschleunigen. Für alle Details empfehle ich Yann LeCuns großartiges Papier Efficient Back-Prop zu lesen. Im Fall von tanh() Aktivierungsfunktion, würde der Fehler als

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

Die Ableitung ist falsch, sollte sein: '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

Ich überprüfte das Derivat numerisch https://github.com/hughperkins/ClConvolve/blob/master/notes/numericbackprop.gnumeric, und Ihre Formeln sind korrekt Fukuzawa. –

2

Dies kann passieren, egal welche Funktion Sie verwenden. Die Ableitung wird per Definition null sein, wenn die Ausgabe eines von zwei Extremen erreicht. Es ist eine Weile her, seit ich mit Künstlichen Neuronalen Netzen gearbeitet habe, aber wenn ich mich richtig erinnere, ist dies (neben vielen anderen Dingen) eine der Einschränkungen bei der Verwendung des einfachen Back-Propagation-Algorithmus.

Sie könnten eine Momentum factor hinzufügen, um sicherzustellen, dass es eine Korrektur basierend auf früheren Erfahrungen gibt, auch wenn die Ableitung Null ist.

Sie könnten es auch nach Epoche trainieren, in der Sie die Delta-Werte für die Gewichte akkumulieren, bevor Sie die tatsächliche Aktualisierung durchführen (im Vergleich zu jeder Aktualisierung). Dies mildert auch Bedingungen, bei denen die Delta-Werte zwischen zwei Werten oszillieren.

Möglicherweise gibt es erweiterte Methoden, wie Methoden zweiter Ordnung für die Rückpropagation, die dieses spezielle Problem mildern.

Beachten Sie jedoch, dass tanh bei den Unendlichkeiten -1 oder +1 erreicht und das Problem rein theoretisch ist.

0

Nicht ganz sicher, ob ich die Frage richtig lese, aber wenn ja, sollten Sie Ihre Eingaben und Ziele zwischen 0,9 und -0,9 skalieren, was Ihren Derivaten helfen würde, vernünftiger zu werden.

+0

@ danelliothter Können Sie Ihre Antwort bearbeiten, um zu zeigen, wie das Derivat seriöser wird. Ich bin in einem Moment der Eile heruntergestimmt. Ich kann es jetzt nicht rückgängig machen, es sei denn, es gibt eine Bearbeitung. –

Verwandte Themen