fmincg Implementierung in Python


8

Ich versuche, neuronale Netze in Python erneut zu implementieren. Ich habe die Kostenfunktion und den Backpropagation-Algorithmus korrekt implementiert. Ich habe sie überprüft, indem ich den entsprechenden Octave-Code ausgeführt habe.

Wenn ich jedoch versuche, die scipy.optimize.fmin_cgFunktion zu verwenden, dauert die Ausführung der Iterationen sehr lange. Es wird mit einer Warnung beendet und gibt mir einen Fehler, der besagt, dass die "gewünschte Fehlerrate nicht erreicht wurde".

Das gleiche Programm in Octave wird einwandfrei ausgeführt. Es ist jedoch eine eigene fmincgFunktion definiert.

Was mache ich falsch?


Alle, ich habe einen Fehler bekommen. Es scheint, dass der Kernel unerwartet gestorben ist. Wo habe ich etwas falsch gemacht? Muss ich noch etwas tun, um fmin_cg für die vektorisierte Berechnung zu verwenden?
Wei Gao

Um Symmetrieunterbrechungen zu vermeiden, sollten Sie die Parameter wie folgt initialisieren: params = numpy.random.randn (dims) * 0.01
Shivam Singh

Antworten:


6

Verwenden Sie als zukünftigen Hinweis das doppelte Fragezeichen? So ziehen Sie die Quelle der Funktion:

Wenn Sie sich die Scipy-Quellen ansehen, wird diese Fehlermeldung angezeigt, wenn der interne Parameter alpha_k Null oder Keine ist.

Dieser Wert ist wiederum an den internen Wolfe Line-Suchalgorithmus gebunden. Insbesondere wird es aufgerufen, wenn die Suche entlang der Suchbahn keinen besseren Wert findet. Ihre Funktion hat wahrscheinlich irgendwo eine lineare Kontur, in die der Optimierer fällt und die verwirrt wird.

Versuchen Sie vielleicht, einen Rückruf hinzuzufügen, und sehen Sie, wo die fehlgeschlagene Suche generiert wird.


Im Anschluss daran wählt scipy seine maximale Iterationszahl basierend auf der Größe des zu optimierenden Vektors aus. Dies ist eine überdurchschnittliche Vermutung, sollte aber offensichtlicher dokumentiert werden.
Meawoppl

2

Ich gehe davon aus, dass Sie den fprimeParameter nicht angegeben haben . Wenn Sie diesen Parameter nicht angeben, fmin_cgmuss er seine eigene Lösung herausfinden, was normalerweise viel langsamer ist als die von ihm bereitgestellte optimale Lösung. Ihr Code könnte folgendermaßen aussehen:

theta = fmin_cg(compute_cost_reg, fprime=compute_gradient_reg,
                x0=theta, args=(X, y, lambd), maxiter=50)

0

Ich weiß, dass dies eine alte Frage ist, aber ich hatte gerade mit einem ähnlichen Problem zu kämpfen und dachte, ich würde meine Lösung veröffentlichen, falls jemand anderes darauf stößt.

Ich fand das Problem, dass ich den Vektor nicht richtig initialisiert hatte , um die Symmetrie zu brechen.Θ

Danach lief ich fmin_cgmit f und fprime, und obwohl es immer noch ziemlich langsam lief, tat es dies ohne die Fehler oder Warnungen, die ich bis zu diesem Zeitpunkt gesehen hatte.

Tatsächlich hat es die Kostenfunktion besser minimiert als die Matlab-Implementierung, obwohl beide dies getan haben max_iters = 100.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.