6 Stimmen

Neuronales Netz - Backpropagation, Fehler beim Training

Nachdem ich einige Artikel über neuronale Netze (Backpropagation) gelesen habe, versuche ich, selbst ein einfaches neuronales Netz zu erstellen.

Ich habe mich für ein neuronales XOR-Netz entschieden, Mein Problem ist, wenn ich versuche, das Netz zu trainieren, wenn ich nur ein Beispiel zum Trainieren des Netzes verwende, sagen wir 1,1,0(als input1,input2,targetOutput). nach 500 Zügen +- antwortet das Netzwerk 0,05. aber wenn ich mehr als ein Beispiel ausprobiere (sagen wir 2 verschiedene oder alle 4 Möglichkeiten), zielt das Netzwerk auf 0,5 als Ausgabe :( ich habe in google nach meinen fehlern gesucht, ohne ergebnis :S Ich versuche, so viele Details wie möglich zu geben, um den Fehler zu finden:

-ive hat Netze mit 2,2,1 und 2,4,1 (Eingabeschicht, versteckte Schicht, Ausgabeschicht) ausprobiert.

-die Ausgabe für jede neuronale definiert durch:

double input = 0.0;
        for (int n = 0; n < layers[i].Count; n++)
            input += layers[i][n].Output * weights[n];

wobei 'i' die aktuelle Schicht ist und die Gewichte alle Gewichte der vorherigen Schicht sind.

-Der Fehler der letzten Schicht (Ausgabeschicht) ist definiert durch:

value*(1-value)*(targetvalue-value);

wobei "Wert" die neuronale Ausgabe und "Zielwert" die Zielausgabe für die aktuelle neuronale Verbindung ist.

-Fehler für die anderen Neurale definiert durch:

foreach neural in the nextlayer 
           sum+=neural.value*currentneural.weights[neural];

-Alle Gewichte im Netz werden durch diese Formel angepasst (das Gewicht von neural -> neural 2)

weight+=LearnRate*neural.myvalue*neural2.error;

während LearnRate die neue Lernrate ist (bei meinem Netz auf 0,25 festgelegt). -Das Biasgewicht für jedes neuronale Netz ist definiert durch:

bias+=LearnRate*neural.myerror*neural.Bias;

bias ist const value=1.

Das ist so ziemlich alles, was ich sagen kann, wie ich schon sagte, die Ausgabe soll 0,5 mit verschiedenen Trainingsbeispielen sein :(

vielen Dank für Ihre Hilfe ^_^.

1voto

Bob Roberts Punkte 388

Es ist schwierig zu sagen, wo der Fehler liegt, ohne den vollständigen Code zu sehen. Eine Sache, die Sie sorgfältig überprüfen sollten, ist, dass Ihre Berechnung des lokalen Fehlergradienten für jede Einheit mit der Aktivierungsfunktion übereinstimmt, die Sie auf dieser Schicht verwenden. Die allgemeine Formel finden Sie hier: http://www.learnartificialneuralnetworks.com/backpropagation.html .

Die Berechnung, die Sie für die Ausgabeschicht durchführen, setzt zum Beispiel voraus, dass Sie eine logistische Sigmoid-Aktivierungsfunktion verwenden, aber Sie erwähnen das nicht im obigen Code, so dass es so aussieht, als würden Sie stattdessen eine lineare Aktivierungsfunktion verwenden.

Im Prinzip sollte ein 2-2-1-Netz ausreichen, um XOR zu lernen, obwohl das Training manchmal in einem lokalen Minimum stecken bleibt, ohne zum richtigen Zustand konvergieren zu können. Es ist also wichtig, dass Sie nicht von einem einzigen Training auf die Leistung Ihres Algorithmus schließen. Beachten Sie, dass ein einfaches Backprog zwangsläufig langsam ist; es gibt schnellere und robustere Lösungen wie z. B. Rprop.

Es gibt Bücher zu diesem Thema, die detaillierte Schritt-für-Schritt-Berechnungen für ein einfaches Netzwerk anbieten (z.B. 'A.I.: A guide to intelligent systems' von Negnevitsky), dies könnte Ihnen helfen, Ihren Algorithmus zu debuggen. Eine Alternative wäre, ein vorhandenes Framework (z. B. Encog, FANN, Matlab) zu verwenden, die gleiche Topologie und die gleichen Anfangsgewichte zu verwenden und die Berechnung mit Ihrer eigenen Implementierung zu vergleichen.

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