51 Stimmen

Neuronales Netzwerk erzeugt immer gleiche/ähnliche Ausgaben für jede Eingabe

Ich habe ein Problem, bei dem ich versuche, ein neuronales Netz für Tic-Tac-Toe zu erstellen. Aus irgendeinem Grund führt das Training des neuronalen Netzwerks jedoch dazu, dass es für jede beliebige Eingabe fast die gleiche Ausgabe erzeugt.

Ich habe einen Blick darauf geworfen Künstliche neuronale Netze Benchmark aber meine Netzimplementierung ist für Neuronen mit der gleichen Aktivierungsfunktion für jedes Neuron gebaut, d.h. keine konstanten Neuronen.

Um sicherzugehen, dass das Problem nicht nur auf meine Wahl des Trainingssatzes (1218 Brettzustände und Züge, die von einem genetischen Algorithmus generiert wurden) zurückzuführen ist, habe ich versucht, das Netz so zu trainieren, dass es XOR reproduziert. Dabei wurde die logistische Aktivierungsfunktion verwendet. Anstatt die Ableitung zu verwenden, habe ich den Fehler multipliziert mit output*(1-output) da in einigen Quellen behauptet wurde, dies sei gleichbedeutend mit der Verwendung des Derivats. Ich kann den Haskell-Quelltext auf HPaste stellen, aber es ist ein wenig peinlich, ihn anzusehen. Das Netzwerk hat 3 Schichten: die erste Schicht hat 2 Eingänge und 4 Ausgänge, die zweite hat 4 Eingänge und 1 Ausgang, und die dritte hat 1 Ausgang. Die Erhöhung auf 4 Neuronen in der zweiten Schicht hat nicht geholfen, und auch nicht die Erhöhung auf 8 Ausgänge in der ersten Schicht.

Anschließend berechnete ich die Fehler, die Netzwerkausgabe, die Bias-Aktualisierungen und die Gewichtungsaktualisierungen von Hand auf der Grundlage von http://hebb.mit.edu/courses/9.641/2002/lectures/lecture04.pdf um sicherzustellen, dass in diesen Teilen des Codes kein Fehler aufgetreten ist (das war nicht der Fall, aber ich werde es wahrscheinlich noch einmal tun, nur um sicherzugehen). Da ich Batch-Training verwende, habe ich nicht mit x in Gleichung (4). Ich füge jedoch die Gewichtsänderung hinzu http://www.faqs.org/faqs/ai-faq/neural-nets/part2/section-2.html schlägt vor, sie stattdessen zu subtrahieren.

Das Problem blieb auch in diesem vereinfachten Netz bestehen. Dies sind zum Beispiel die Ergebnisse nach 500 Epochen Batch-Training und inkrementellem Training.

Input    |Target|Output (Batch)      |Output(Incremental)
[1.0,1.0]|[0.0] |[0.5003781562785173]|[0.5009731800870864]
[1.0,0.0]|[1.0] |[0.5003740346965251]|[0.5006347214672715]
[0.0,1.0]|[1.0] |[0.5003734471544522]|[0.500589332376345]
[0.0,0.0]|[0.0] |[0.5003674110937019]|[0.500095157458231]

Wenn man subtrahiert statt addiert, hat man das gleiche Problem, nur dass alles 0,99 irgendwas statt 0,50 irgendwas ist. 5000 Epochen führen zum gleichen Ergebnis, außer dass das im Stapelverfahren trainierte Netzwerk in jedem Fall genau 0,5 liefert. (Sogar 10.000 Epochen haben beim Batch-Training nicht funktioniert.)

Gibt es irgendetwas, das dieses Verhalten hervorrufen könnte?

Außerdem habe ich mir die Zwischenfehler für das inkrementelle Training angesehen, und obwohl die Eingaben der versteckten/eingehenden Schichten variierten, war der Fehler für das Ausgangsneuron immer +/-0,12. Beim Stapeltraining stiegen die Fehler zwar an, aber extrem langsam, und die Fehler waren alle extrem klein (x10^-7). Unterschiedliche anfängliche Zufallsgewichte und Verzerrungen machten ebenfalls keinen Unterschied.

Beachten Sie, dass es sich um ein Schulprojekt handelt, daher wären Hinweise/Anleitungen hilfreicher. Obwohl es eine schreckliche Idee war, das Rad neu zu erfinden und mein eigenes Netzwerk zu erstellen (in einer Sprache, die ich nicht gut kenne!), hielt ich es für ein Schulprojekt für angemessener (damit ich weiß, was vor sich geht... zumindest in der Theorie. An meiner Schule scheint es keinen Informatiklehrer zu geben).

EDIT: Zwei Schichten, eine Eingabeschicht mit 2 Eingängen zu 8 Ausgängen und eine Ausgabeschicht mit 8 Eingängen zu 1 Ausgang, führen zu fast den gleichen Ergebnissen: 0,5+/-0,2 (oder so) für jeden Trainingsfall. Ich spiele auch mit pyBrain herum, um zu sehen, ob irgendeine Netzwerkstruktur dort funktionieren wird.

Edit 2: Ich verwende eine Lernrate von 0,1. Tut mir leid, dass ich das vergessen habe.

Edit 3: Pybrains "trainUntilConvergence" bringt mir auch kein vollständig trainiertes Netzwerk, aber 20000 Epochen schon, mit 16 Neuronen in der versteckten Schicht. 10000 Epochen und 4 Neuronen, nicht so viel, aber nahe dran. In Haskell, mit der Eingabeschicht mit 2 Eingängen und 2 Ausgängen, der versteckten Schicht mit 2 Eingängen und 8 Ausgängen und der Ausgabeschicht mit 8 Eingängen und 1 Ausgang... habe ich das gleiche Problem mit 10000 Epochen. Und mit 20000 Epochen.

Edit 4: Ich habe das Netzwerk auf der Grundlage des obigen MIT-PDFs noch einmal von Hand durchgespielt, und die Werte stimmen überein, so dass der Code korrekt sein sollte, es sei denn, ich habe die Gleichungen falsch verstanden.

Ein Teil meines Quellcodes ist unter http://hpaste.org/42453/neural_network__not_working Ich arbeite daran, meinen Code etwas aufzuräumen und ihn in ein Github-Repository (statt in ein privates Bitbucket-Repository) zu stellen.

Der gesamte relevante Quellcode ist jetzt unter https://github.com/l33tnerd/hsann .

1voto

mohammad Punkte 4787

Es ist schwer zu sagen, ohne zu sehen, ein Code-Beispiel, aber es ist möglich, occure für ein Netz, weil die Anzahl der versteckten neron.with incresing in der Anzahl der neron und die Anzahl der versteckten Schicht ist es nicht möglich, ein Netz mit kleinen Satz von training data.until ist es möglich, ein Netz mit kleineren Schicht und nerons ist es falsch, ein größeres net.therefore vielleicht Ihr Problem gelöst mit Aufmerksamkeit auf diese Fragen.

1voto

li.davidm Punkte 10755

Ich habe es nicht mit dem XOR-Problem in der Frage getestet, aber für meinen ursprünglichen Datensatz, der auf Tic-Tac-Toe basiert, glaube ich, dass ich das Netzwerk dazu gebracht habe, etwas zu trainieren (ich habe nur 1000 Epochen laufen lassen, was nicht genug war): das Quickpropagation-Netzwerk kann mehr als die Hälfte seiner Spiele gewinnen/gleichziehen; Backpropagation kann etwa 41 % erreichen. Die Probleme lagen in (kleinen) Implementierungsfehlern und darin, dass ich den Unterschied zwischen der Fehlerableitung (die per- Gewicht ) und der Fehler für jede Neuron die ich bei meinen Recherchen nicht gefunden habe. Die Antwort von @darkcanuck, den Bias ähnlich wie ein Gewicht zu trainieren, hätte wahrscheinlich geholfen, obwohl ich sie nicht umgesetzt habe. Ich habe meinen Code auch in Python umgeschrieben, damit ich ihn leichter hacken kann. Obwohl ich also nicht erreicht habe, dass das Netzwerk die Effizienz des Minimax-Algorithmus erreicht, glaube ich, dass es mir gelungen ist, das Problem zu lösen.

1voto

Nikhil Gupta Punkte 1101

Ich hatte früher ein ähnliches Problem, als meine Daten nicht richtig normalisiert waren. Nachdem ich die Daten normalisiert hatte, lief alles korrekt.

Kürzlich stand ich wieder vor diesem Problem, und nach der Fehlersuche fand ich heraus, dass es einen anderen Grund dafür geben kann, dass neuronale Netze die gleiche Ausgabe liefern. Wenn Sie ein neuronales Netzwerk haben, das einen Gewichtsabnahme-Term hat, wie den in der RSNNS Paket, stellen Sie sicher, dass Ihr Zerfallsterm nicht so groß ist, dass alle Gewichte im Wesentlichen auf 0 gehen.

Ich habe die . Paket für R. Ursprünglich verwendete ich einen Decay-Hyperparameter = 0,01. Als ich mir die Diagnosen anschaute, sah ich, dass der RMSE für jeden Fold (der Kreuzvalidierung) berechnet wurde, aber der Rsquared war immer NA. In diesem Fall ergaben alle Vorhersagen denselben Wert.

Nachdem ich den Decay auf einen viel niedrigeren Wert (1E-5 und niedriger) reduziert hatte, erhielt ich die erwarteten Ergebnisse.

Ich hoffe, das hilft.

0voto

finnw Punkte 46519

Es ist schwer zu sagen, ohne ein Code-Beispiel zu sehen, aber ein Bias-Fehler kann diesen Effekt haben (z.B. das Vergessen, den Bias zur Eingabe hinzuzufügen), also würde ich mir diesen Teil des Codes genauer ansehen.

0voto

darkcanuck Punkte 279

Aufgrund Ihrer Kommentare würde ich @finnw zustimmen, dass Sie ein Problem mit Vorurteilen haben. Sie sollten den Bias als eine konstante "1" (oder -1, wenn Sie es vorziehen) Eingabe für jedes Neuron behandeln. Jedes Neuron hat auch sein eigenes Gewicht für den Bias, so dass die Ausgabe eines Neurons die Summe der gewichteten Eingaben plus dem Bias mal seinem Gewicht sein sollte, das durch die Aktivierungsfunktion geleitet wird. Die Bias-Gewichte werden während des Trainings genau wie die anderen Gewichte aktualisiert.

In Fausetts "Grundlagen neuronaler Netze" (S. 300) gibt es ein XOR-Beispiel mit binären Eingängen und einem Netz mit 2 Eingängen, einer versteckten Schicht aus 4 Neuronen und einem Ausgangsneuron. Die Gewichte werden zufällig zwischen +0,5 und -0,5 initialisiert. Bei einer Lernrate von 0,02 konvergiert das Beispielnetz nach etwa 3000 Epochen. Sie sollten in der Lage sein, ein Ergebnis in der gleichen Größenordnung zu erzielen, wenn Sie die Bias-Probleme (und alle anderen Fehler) beseitigt haben.

Beachten Sie auch, dass Sie das XOR-Problem nicht ohne eine verborgene Schicht in Ihrem Netz lösen können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X