C# Feedforward Neuronal Network mit Backpropagation Trainer

Rossibaer

Lieutenant
Registriert
Apr. 2007
Beiträge
754
Hallo zusammen,

ich spiele zur Zeit mit einem Feedforward Neural Network rum. Mittels Backpropagation trainiere ich das Netz. Das Netzwerk besteht aus 2 Input Neuronen, 1 Hidden Layer mit 2 Neuronen und 1 Output Neuron. Ich versuche gerade das XOr Problem zu lösen. Dabei fällt mir auf, dass es zwar gelöst wird, jedoch habe ich eine Fehlerrate von ca. 0.2. Es spielt keine Rolle wie niedrig ich den Trainingsfehler oder wie lang ich das Training laufen lasse. Am Ende ermittelt er mir immer folgende ca. Werte:

bei 1.0 und 1.0 als Eingabe ist das Resultat: 0.002...
bei 0.0 und 1.0 als Eingabe ist das Resultat: 0.998...
bei 1.0 und 0.0 als Eingabe ist das Resultat: 0.998...
bei 0.0 und 0.0 als Eingabe ist das Resultat: 0.002...

Was könnten die allgemeinen Ursachen beim Backpropagation Training sein, sodaß diese Werte nicht über- bzw. unterschritten werden? Ich habe bereits versucht das Momentum und die Adjust - Rate zu modifizieren, jedoch hat dies keine bzw. sehr geringe Auswirkungen auf das Ergebnis...

Mir gehts erstmal nur um allgemeine Fehlerquellen/Möglichkeiten ohne da allzu spezifisch mit Code zu werden... Als Vorlage hatte ich mich an folgendem Projekt orientiert: https://github.com/z1c0/DotNeuralNet

Mir stellen sich folgende allgemeine Fragen:
1. Welche möglichen Fehlerursachen sorgen für ein Stehenbleiben bei einem Resultat/Fehlerquote?
2. Welche allgemeinen Möglichkeiten gibt es um die Fehlerrate weiter zu senken bzw. das Training eines Netzwerkes zu optimieren?
3. Wie könnte man (Pseudocode wäre vollkommen ausreichend) eine Anpassung der Werte von Momentum/Adjust während des Trainings realisieren, sodaß z.B. die Adjust-Rate von 0.7 beginnend, während des Trainings schrittweise um 0.1 reduziert wird? Insbesondere, wie kann man erkennen, dass das Training z.B. keine weitere Verbesserung errreichen würde und somit eine Anpassung notwendig wäre? Hintergrund ist ja, das beim Berechnen der Fehlerquote immer geringfügige Abweichungen drin sind, d.h. ich habe nie einen festen Wert, wo das Netz stehen bleibt, sondern mit jeder Iteration gibts wieder eine neue Fehlerquote, die geringfügig anders ist, als die vorhergehende.

Mir würde es vollkommen ausreichen, wenn es sich nur um Pseudocode handelt ...

Vielen Dank schonmal fürs Lesen und evtl. habt ihr so ein paar allgemeine Tipps denen ich gerne nachgehen werde.

Viele Grüße
Rossibaer
 
Mein Tipp ist, dass du mit diesem Thema hier bei CB sicher falsch bist und dich eher bei StackOverflow oder so anmelden solltest. ;)
 
Wie dem auch sei, mal abwarten. Vielleicht behältst du Recht mit deiner Aussage oder auch nicht...

Viele Grüße
Rossibaer

Edit: Zum Thema StackOverflow:

closed as not constructive by ...

As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center for guidance. If this question can be reworded to fit the rules in the help center, please edit the question.

Ich glaube nicht, dass meine Fragen allgemeiner Natur bei StackOverflow lange offen für Antworten stehen bleiben. Da wird wahrscheinlich der Thread schneller geschlossen, als ich auf senden klicken kann... ;)
 
Zuletzt bearbeitet:
Das Netz liefert zu allen Eingaben ein sehr gutes Ergebnis, man könnte damit durchaus zufrieden sein. (fast 1 bei 1 und fast 0 bei 0). Mit Fehlerrate meinst du wohl, dass der Ausgabeknoten nicht exakt 1 oder 0 ist?


​Dass die Werte nicht mehr sinken/steigen könnte eventuell auch an der Aktivierungsfunktion liegen. Einmal eine andere ausprobieren. Die Änderungsrate sollte aber auch auf jeden Fall sehr klein sein (am besten mal von einer größeren immer kleiner werden, z.b. immer halbieren).

​Nicht auzuschließen ist auch ein Fehler in Implementierung. Probier doch mal TensorFlow aus, dazu gibt es auch reichlich Dokumentation.


Zu den Fragen:
1. Welche möglichen Fehlerursachen sorgen für ein Stehenbleiben bei einem Resultat/Fehlerquote?
​Erfahrungsgemäß eine zu hohe Anpassungsrate, ungünstige Aktivierungsfunktion, Overfitting,...
2. Welche allgemeinen Möglichkeiten gibt es um die Fehlerrate weiter zu senken bzw. das Training eines Netzwerkes zu optimieren?
​Hierbei gibt es eine endlose Anzahl von Möglichkeiten. Anpassung der Trainingsrate, Aktivierungsfunktionen, Ändern der Struktur, Adaptive Trainingsrate, größeres Netz, ....
Insbesondere, wie kann man erkennen, dass das Training z.B. keine weitere Verbesserung errreichen würde und somit eine Anpassung notwendig wäre?
​Das kann man erkennen, indem man sich ein Testdatenset besorgt und das z.B. in regelmäßigen Abständen durch das Neuronale Netz lösen lässt. Hierbei erhältst du jedes mal eine Fehlerrate, welche sich asymptotisch einem Wert annähern sollte.
​Sollte der Wert erreicht werden (keine signifikante Verbesserungen mehr), kannst du die Anpassungsrate kleiner machen. Je nach Problem auf Overfitting aufpassen.
 
Zuletzt bearbeitet:
Hallo The Ripper,

danke für deine Antworten.

Mit Fehlerrate meinst du wohl, dass der Ausgabeknoten nicht exakt 1 oder 0 ist?

Das ich kein 100% Ergebnis, d.h. 1 bei 1 und 0 bei 0 erhalte, ist mir bewusst. Genau mit Fehlerrate meinte ich die Differenz zum erwarteten Ergebnis. So wie ich das gelesen habe, gibt es ja verschiedene Möglichkeiten, z.B. die Differenz von werwartetem Ergebnis zu Ausgabeknoten quadriert und aufsummiert, zum Schluß die Wurzel... (Nur mal so ganz vereinfacht gesprochen). Da ich beim XOr Problem jedoch nur einen Ausgabeknoten habe, fällt das Summieren weg und Quadratwurzel sowie Quadrieren heben sich auf, sodaß am Ende die Differenz gleich der Fehler (oder Fehlerrate) wird.

Da ich mal gelesen hatte, dass man auch die Anpassungsrate dynamisch anpassen könnte, habe ich mal versucht, das auch zu machen, jedoch konnte ich nicht so richtig erkennen, wann es zeit wurde die Rate zu verringern. In den Tests hatte bei mir dann das Verringern der Rate zu schnell schon dafür gesorgt, dass die Rate recht klein wurde. Ich bin so vorgegangen, dass ich ursprünglich die Rate von 0.7 beginnend um je 0.1 verringern wollte. Scheinbar habe ich jedoch einen Fehler in meinem Code, bzw. den falschen Ansatz:

Ich habe geschaut, ob der aktuelle Fehler größer als der vorhergehende war. Wenn der Fehler dann bei 10 Iterationen zu einem größeren Wert kam, als der vorgehende, dann habe ich die Rate verringert. Das war eher ein Griff ins Klo.

Was hältst du von der Idee? Ich berechne die Differenz von vorherigen und aktuellem Fehler und rechne den Prozentwert der Veränderung aus. Wenn ein Schwellwert unterschritten wurde, verringere ich die Rate. Falls notwendig, kann ich ja mal etwas Code beisteuern, jedoch in dem Code mit der Schleife, wo die Iterationen stattfinden und das Lernen angestossen wird, ist nicht allzuviel zu sehen. Käme schon fast auf Pseudocodeniveau....

Vielen Dank nochmal für deine Unterstützung.

Viele Grüße
Rossibaer
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben