2016-05-19 7 views
2

Ich schrieb mein erstes neuronales Feed-Forward-Netzwerk in C mit dem Sigmoid 1.0/(1.0 + exp(-x)) als Aktivierungsfunktion und Gradientenabstieg, um die Gewichte anzupassen. Ich habe versucht, sin(x) anzunähern, um sicherzustellen, dass mein Netzwerk funktioniert. Allerdings scheint die Ausgabe des Neurons auf der Ausgabeschicht immer zwischen den Extremwerten 0 und 1 zu oszillieren und die Gewichte der Neuronen wachsen zu absurden Größen, egal wie viele verborgene Schichten es gibt, wie viele Neuronen sich in der versteckten Schicht befinden (s), wie viele Trainingsbeispiele ich anbiete oder was die Zielwerte sind.Nicht konvergierendes neuronales Netzwerk in C

1) Gibt es "bewährte" Standarddatensätze, um neuronale Netze auf Fehler zu überprüfen? Wenn ja, welche Strukturen funktionieren am besten (z. B. Anzahl von Neuronen in der verborgenen Schicht), um zu der gewünschten Ausgabe zu konvergieren?

2) Gibt es häufige Fehler, die die gleichen Symptome erzeugen? Ich fand this thread, aber das Problem war wegen fehlerhafter Daten, die ich glaube, ist nicht mein Fall.

3) Gibt es eine bevorzugte Möglichkeit, das Netzwerk zu trainieren? In meiner Implementierung durchlaufe ich die Trainingssätze und stelle die Gewichte jedes Mal auf, spüle dann ab und wiederhole ~ 1000 mal. Gibt es eine andere Reihenfolge, die besser funktioniert?

+0

Was ist Ihre letzte Aktivierungsfunktion? Ist es auch Sigmoid? Dann könnten Sie Probleme mit der Tatsache haben, dass die Sünde negativ sein könnte. –

+0

@ MarcinMożejko Um klar zu sein, nahm ich nur 50 zufällige reelle Zahlen zwischen 0 und 1 und verwendete die sin (x) von jedem als Ausgabeziel. Also die Zahlen sind alle positiv und zwischen 0 und 1. Ich bin mir auch nicht sicher, was Sie mit der endgültigen Aktivierungsfunktion meinen? –

+0

Die endgültige Aktivierung ist eine Aktivierungsfunktion in der letzten Schicht. Ok - Was waren deine Lernraten und die verlorene Funktion für diese Aufgabe? Hast du MSE benutzt? –

Antwort

1

Also, um es zusammenzufassen:

  1. Unter der Annahme, dass Ihre Gradienten Ausbreitung mit Gewichtsbelastung (L1 und L2 richtig in der Regel die Werte von Parametern wie Topologie, Lernrate, Chargengröße oder Wert einer Konstante angeschlossenen arbeitet Zerfall) werden unter Verwendung einer Technik berechnet, die Gridsuche oder Zufallssuche genannt wird. Es wurde empirisch bewiesen, dass die Zufallssuche in diesem task besser abschneidet.

  2. Der häufigste Grund für Gewichtsabweichungen ist eine falsche Lernrate. Der große Wert davon könnte das Lernen wirklich schwer machen. Auf der anderen Seite - wenn die Lernrate zu klein ist - kann der Lernprozess sehr lange dauern. Normalerweise - Sie sollten babysit die Lernphase. Die spezifizierte Anweisung könnte z.B. here.

  3. In Ihrer Lernphase verwendeten Sie eine Technik namens SGD. Normalerweise - es kann gute Ergebnisse erzielen, aber es ist anfällig für die Varianz der Datensätze und große Werte der Lernraten. Ich rate Ihnen, Batch-Lernen zu verwenden und eine Stapelgröße als zusätzlichen Lernparameter festzulegen, der während der Gitter- oder Zufallssuche gelernt wird. Sie können hier lesen, z.B. here.

  4. Eine andere Sache, die Sie in Betracht ziehen könnten, ist, Ihre Aktivierungsfunktion auf tanh oder relu zu ändern. Es gibt viele Probleme mit Sättigungsbereichen von sigmoid und es erfordert normalerweise eine ordnungsgemäße Initialisierung. Sie können darüber lesen here.
+0

Dies ist mehr Informationen als ich hoffen konnte.Ich vielen Dank! –

+0

Wenn Sie nichts dagegen haben - könnten Sie auch upvote meine Antwort? :) Upvotes sind von entscheidender Bedeutung für Neural Network Badge, von dem ich träume :) –

+0

Oh ich schon versucht, vorher, aber es sagt, dass ich zuerst 15 'Ruf' brauche, also müssen Sie mach mit meiner Dankbarkeit aus ;-) –

Verwandte Themen