2016-04-10 15 views
0

Ich versuche ein neuronales Netzwerk zu implementieren. Ich verwende Backpropagation, um die Gradienten zu berechnen. Nach dem Erhalten der Gradienten multipliziere ich sie mit der Lernrate und subtrahiere sie von den entsprechenden Gewichten. (Im Grunde versuchen Sie gradientenabstieg, bitte sagen Sie mir, wenn das falsch ist). Das erste, was ich versuchte, nachdem die Backpropagation und der Gradientenabstieg fertig waren, bestand darin, einen einfachen XOR - Klassifikator zu trainieren, bei dem die Eingaben (0,0), (1,0), (0,1), (1,1) und die entsprechenden Ausgaben sind 0, 1, 1, 0. Also mein neuronales Netzwerk enthält 2 Eingabeeinheiten, 1 Ausgabeeinheit und eine versteckte Ebene mit 3 Einheiten darauf. Beim Training mit einer Lernrate von 3,0 für> 100 (selbst ausprobiert> 5000) sinken die Kosten bis zu einem bestimmten Punkt, an dem es feststeckt, so dass es konstant bleibt. Die Gewichte werden jedes Mal, wenn ich das Programm starte, zufällig initialisiert, aber es bleibt immer bei den gleichen spezifischen Kosten hängen. Wie auch immer, nachdem das Training beendet ist, habe ich versucht, mein neurales Netzwerk auf einem der obigen Eingänge laufen zu lassen und der Ausgang ist immer 0.5000. Ich dachte darüber nach, die Ein- und Ausgänge so zu ändern, dass sie sind: (-1, -1), (1, -1), (-1, 1), (1, 1) und die Ausgänge -1, 1, 1, - 1. Wenn nun mit der gleichen Lernrate trainiert wird, sinken die Kosten kontinuierlich, unabhängig von der Anzahl der Iterationen, aber die Ergebnisse sind immer noch falsch, und sie liegen immer nahe bei 0. Ich habe sogar versucht, sie für eine wahnsinnige Anzahl von Wiederholungen zu trainieren Iterationen und die Ergebnisse sind die folgenden: [Iterationen: (20kk), Eingaben: (1, -1), Ausgabe: (1.6667e-08)] und auch [Iterationen: (200kk), Eingaben: (1, -1) , Ausgabe: (1.6667e-09)], auch für Eingaben (1,1) und andere versucht, die Ausgabe ist auch sehr nahe bei 0. Es scheint, als ob die Ausgabe immer mittel ist (min (y), max (y)), spielt es keine Rolle, in welcher Form ich die Ein-/Ausgabe zur Verfügung stelle. Ich kann nicht herausfinden, was ich falsch mache, kann jemand bitte helfen?Neuronales Netzwerk seltsame Vorhersage

+0

den Code zur Verfügung stellen, da Ihr Fehler dort ist. – lejlot

+0

@lejlot Hier ist der Code: https://github.com/cuvidk/yaann-api – cuvidk

Antwort

1

Es gibt so viele Orte, wo man falsch sein könnte:

  • Ihre Steigungen überprüfen numerisch
  • Sie nicht-lineare versteckten Einheiten verwenden XOR zu lernen - haben Sie es nicht-lineare Aktivierung haben?
  • Sie benötigen Bias-Neuron, haben Sie eine?

kleinere Dinge, die das genannte Problem nicht dazu führen sollte, aber es lohnt sich Festsetzung oder so:

  • tun Sie sigmoidale Aktivierung in dem Ausgangsknoten haben (wie Ihr Netzwerk ein Klassifikator ist)?
  • Trainierst du mit Kreuz-Entropie-Kosten (obwohl das ein kleines Problem ist)?
+0

Wenn Sie meinen Code überprüft haben, haben Sie gesehen, dass ich eine vektorisierte Implementierung verwende, und ich füge immer eine Spalte von Einsen in der Aktivierungsmatrix vor dem Multiplizieren hinzu es mit der Transponierung der Gewichtsmatrix, also ja, ich benutze ein Bias-Neuron. Alle Neuronen verwenden sigmoidale Aktivierung, und ja, ich verwende Kreuz-Entropie-Kosten. Was nicht-lineare versteckte Einheiten angeht, ich fürchte, ich verstehe nicht, was Sie damit meinen. – cuvidk

+0

Haben Sie Steigungen numerisch überprüft? Hast du versucht, eine "typische" Lernrate zu verwenden (wie 1e-3)? Sie sollten auch regularizationFactor = 0 setzen (ich weiß nicht, was Sie gerade verwenden) – lejlot

+0

Ich habe gerade versucht 1e-3 als Lernrate, gleiche Ergebnisse. Ich habe die Gradienten nicht numerisch überprüft, ich denke gerade darüber nach, wie man das jetzt macht. Die derzeitige Implementierung macht es schwierig. – cuvidk

Verwandte Themen