2016-07-29 6 views
1

Vor ein paar Tagen habe ich versucht, das, was ich dieses Jahr in einer KI-Vorlesung über neuronale Netze gelernt habe, in die Praxis umzusetzen. Ich habe versucht, einen einfachen zu machen, mit nur 2 Neuronen, der sein Eingangssignal replizieren würde. Hier ist eine kleine Zeichnung des Netzwerks, mit meinen Berechnungen: http://imgur.com/a/RixAH (Entschuldigung für die Kommentare in Französisch, sie sind nicht wirklich wichtig)Backpropagation für ein einfaches neuronales Netzwerk, das ungewöhnliche Ergebnisse liefert

Die seltsame Sache ist, dass es konvergiert, aber für ein einfaches binäres Eingangssignal, wann das Signal ist 0, sendet das Netzwerk effektiv ~ 0, aber wenn es 1 ist, sendet es ~ 0,5, und ich verstehe nicht warum. Außerdem muss ich die Lernrate ziemlich hoch setzen (~ 100), um es zum Laufen zu bringen, wieder weiß ich nicht warum.

Hier ist der Java-Code, den ich verwendet, um das Netzwerk zu testen:

public class Main 
{ 
    final static double R = 100; 

public static void main(String[] args) 
{ 
    double w1 = Math.random(), w2 = Math.random(); 

    for (int iter = 1; iter <= 100; iter++) 
    { 
     int x; 

     if (Math.random() >= 0.5) 
     { 
      x = 1; 
     } 
     else 
     { 
      x = 0; 
     } 

     double p1 = x * w1; 
     double y = 1/(1 + Math.exp(-p1)); 

     double p2 = y * w2; 
     double z = 1/(1 + Math.exp(-p2)); 

     double P = -0.5 * Math.pow(x - z, 2); 

     double dP1 = (x - z) * z * (1 - z) * w2 * y * (1 - y) * x; 
     double dP2 = (x - z) * z * (1 - z) * y; 

     w1 += R * dP1; 
     w2 += R * dP2; 

     System.out.println("x = " + x + ", z = " + z + ", P = " + P); 
    } 
} 

} 

Haben Sie eine Ahnung, wo das Problem aus kommen könnte?

Danke.

LeChocdesGitans

Edit:

ich es endlich geschafft, zum Laufen zu bringen (folgte ich Ihren Rat für die Netzwerkkonfiguration). Ich nehme an, es gab auch einen Implementierungsfehler, weil es nicht direkt funktionierte, nachdem ich das Layout des Netzwerks geändert hatte, aber ich begann es noch einmal und nun kann ich ziemlich interessante Dinge tun, wie die Zeichenerkennung, die ziemlich gut funktioniert , vergleichen Sie, wie grundlegend meine Anwendung ist.

Nochmals vielen Dank für Ihren Rat!

+0

Ich bin neugierig, warum haben Sie sich entschieden, zwei Schichten mit jeweils einem Neuron zu verwenden? – rpd

+0

Nun, da ich nicht viel Erfahrung im maschinellen Lernen habe, habe ich nur ein Setup verwendet, das ich in einem der Videos des MIT über neuronale Netze gesehen habe. Was denkst du ist das Beste? – LeChocdesGitans

+0

Ein Setup von einer Schicht mit zwei Perzeptronen ist funktioneller und "realistischer" als ein Spielzeugbeispiel. – rpd

Antwort

1

Wie rpd sagte, ist Ihr Hauptproblem, dass Sie zwei aufeinanderfolgende Schichten trainieren. Mathematisch bedeutet dies, dass die gesamte auf Knoten 1 angewendete Korrektur über Knoten 2 gefiltert werden muss. Ja, Sie können die Kettenregel, das Bayes-Theorem oder eine andere äquivalente Filterung anwenden, aber dies birgt immer das Risiko eines Implementierungsfehlers.

Von den Effekten, die Sie beschreiben, haben Sie fast sicher einen Fehler in Ihrer Implementierung. Der größte Hinweis darauf ist, dass Sie Ihre Lernrate über jeden vernünftigen Wert hinaus erhöhen mussten, um auch nur marginal akzeptable Ergebnisse zu erhalten. Denken Sie daran, dies ist der Skalierungsfaktor, um kleine Schritte zu erkennen. Ein Wert von 100 bedeutet, dass Sie die beste aktuelle Schätzung der korrekten Anpassung vornehmen und dann 100 Mal so weit gehen. Wenn der Rest Ihres Algorithmus korrekt ist, ist eine Lernrate von mehr als 1.0 ein beabsichtigter Versuch, wild zu oszillieren, ohne jemals zu konvergieren.

Wenn Sie Ihre Zwischenwerte nachverfolgt haben, veröffentlichen Sie die Reihenfolge der Aktualisierungen. Wenn nicht, sollten Sie diesen Debugging-Schritt verwenden.

Allerdings sollten Sie zuerst Ihre versteckten Neuronen parallel, nicht in Serie. Zum einen ist die Faltung von Funktionen nur eine Verschwendung von Schritten. Zum anderen sollten die Gewichtungen durch denselben Prozess (parallel) aktualisiert werden. Das Ergebnis sollte auf verschiedene Gewichtungen konvergieren, die leicht auf 1.0 normalisiert werden können (z. B. durch eine SoftMax-Operation). Die Einschicht-Rückpropagation ist eine Berechnung niedriger Ordnung: debuggen Sie den Prozess mit einem einfachen linearen Prozess (Euler-Methode), bevor Sie sich für die schnellere Konvergenz mit den kubischen (und schlechteren) Fehlerfunktionen, die Sie einrichten, einsetzen.


Ich arbeitete mit Ihren Notizen und Algorithmus ein wenig, und bekam ein paar Beobachtungen.

  • Sie fiel ein negatives Vorzeichen in der ersten Zeile Ihrer Notizen: Wenn P (x, z) = -1/2 (x-z)^2, dann das Derivat - (x-z) oder z-x. Diese Änderung im Algorithmus hilft der Konvergenz etwas.

  • Die Faltung von Neuronen in Serie ist im Allgemeinen fehlerhaft; Dies reduziert sich trivial auf ein Modell mit einem einzigen versteckten Neuron.

Verwandte Themen