Ich versuche, ein Optimierungsverfahren in Python mit BFGS und L-BFGS in Python zu implementieren, und erhalte in beiden Fällen überraschend unterschiedliche Ergebnisse. L-BFGS konvergiert superschnell zum richtigen Minimum, während BFGS sehr langsam konvergiert, und das auch zu einem unsinnigen Minimum.
FRAGE: Aus meinen Messwerten geht hervor, dass BFGS und L-BFGS im Grunde genommen der Algorithmus sind (Quasi-Newton-Methoden), außer dass letzterer weniger Speicher benötigt und daher schneller ist. Ist das wahr? Ansonsten, wenn sie unterschiedlicher sind, wie dann?
Letztendlich möchte ich herausfinden, ob der Leistungsunterschied auf einige Unterschiede in den tatsächlichen Algorithmen oder auf deren Implementierung in den Python-SciPy-Modulen zurückzuführen ist.
BEARBEITEN: Ich füge einige Daten hinzu, um meine Behauptungen zu unterstützen, dass sich das Verhalten von den beiden Algorithmen unterscheidet.
RUNNING THE L-BFGS-B CODE
* * *
Machine precision = 2.220D-16
N = 147 M = 10
This problem is unconstrained.
At X0 0 variables are exactly at the bounds
At iterate 0 f= 2.56421D+04 |proj g|= 1.19078D+03
At iterate 1 f= 2.12904D+04 |proj g|= 1.04402D+03
At iterate 2 f= 1.49651D+03 |proj g|= 2.13394D+02
At iterate 3 f= 6.08288D+02 |proj g|= 9.85720D+01
At iterate 4 f= 2.91810D+02 |proj g|= 6.23062D+01
...
At iterate 142 f= 3.27609D+00 |proj g|= 8.80170D-04
Time taken for minimisation: 36.3749790192
*** BFGS code ***
At iterate 1, f= 21249.561722
At iterate 2, f= 15710.435098
At iterate 3, f= 15443.836262
At iterate 4, f= 15386.035398
At iterate 5, f= 15311.242917
At iterate 6, f= 15211.986938
At iterate 7, f= 15022.632266
...
At iterate 524, f= 67.898495
...
Warning: Desired error not necessarily achieved due to precision loss.
Iterations: 1239
Time taken: 340.728140116
quelle
Antworten:
Nein, sie sind nicht gleich. In gewissem Sinne ist L-BFGS eine Annäherung an BFGS, die viel weniger Speicher benötigt. BFGS und L-BFGS werden in vielen Standardressourcen ausführlich erläutert.
Sehr grob kann man sich den Unterschied so vorstellen. BFGS berechnet und speichert das vollständige HessischeH. bei jedem Schritt; dafür braucht manΘ (n2) Raum, wo n Zählt die Anzahl der Variablen (Dimensionen), über die Sie optimieren. L-BFGS berechnet und speichert eine Annäherung an das Hessische, die so gewählt wurde, dass die Annäherung in gespeichert werden kannΘ ( n ) Platz. Tatsächlich verwendet L-BFGS die NäherungH.≈M.⊤M. für einige k × n Matrix M. (Ich glaube).
Jeder Schritt von L-BFGS ist ein Versuch, zu approximieren / zu erraten, was der entsprechende Schritt von BFGS tun würde. Ein einzelner Schritt von L-BFGS benötigt jedoch viel weniger Platz und Zeit als ein einzelner Schritt von BFGS. Folglich können Sie innerhalb einer bestimmten Zeit viel mehr Schritte von L-BFGS ausführen als von BFGS. Daher stellen Sie möglicherweise fest, dass L-BFGS schneller konvergiert, da es innerhalb einer bestimmten Zeit so viel mehr Iterationen ausführen kann als BFGS.
Ich weiß nicht, was ein unsinniges Minimum bedeutet oder warum BFGS zu etwas Schlimmerem als L-BFGS konvergieren würde, wenn beide unbegrenzt laufen könnten.
quelle