JM hat Recht mit der Lagerung. BFGS erfordert einen ungefähren Hessischen Wert, aber Sie können ihn mit der Identitätsmatrix initialisieren und dann einfach die Rang-2-Aktualisierungen des ungefähren Hessischen Werts berechnen, solange Gradienteninformationen verfügbar sind, vorzugsweise analytisch und nicht durch endliche Differenzen. BFGS ist eine Quasi-Newton-Methode, die in weniger Schritten konvergiert als CG und weniger dazu neigt, "hängen zu bleiben" und leichte algorithmische Optimierungen zu erfordern, um für jede Iteration einen signifikanten Abfall zu erzielen.
Im Gegensatz dazu benötigt CG Matrix-Vektor-Produkte, die für Sie nützlich sein können, wenn Sie Richtungsableitungen berechnen können (wiederum analytisch oder unter Verwendung endlicher Differenzen). Eine Berechnung endlicher Differenzen einer Richtungsableitung ist viel billiger als eine Berechnung endlicher Differenzen eines Hessischen. Wenn Sie also Ihren Algorithmus mit endlichen Differenzen konstruieren möchten, berechnen Sie die Richtungsableitung einfach direkt. Diese Beobachtung trifft jedoch nicht wirklich auf BFGS zu, das ungefähre Hessische Werte unter Verwendung innerer Produkte von Gradienteninformationen berechnet.
In Bezug auf die Konvergenzraten entspricht CG-Iterationen ungefähr einem Schritt der Newtonschen Methode , wenn die Anzahl der Entscheidungsvariablen in Ihrem Problem ist . BFGS ist eine Quasi-Newton-Methode, aber die gleiche Art von Beobachtung sollte gelten; Es ist wahrscheinlich, dass Sie mit BFGS in weniger Iterationen Konvergenz erzielen, es sei denn, es gibt ein paar CG-Richtungen, in denen viel Gefälle herrscht, und nach einigen CG-Iterationen starten Sie es neu. CG-ähnliche Methoden sind billiger, wenn Matrix-Vektor-Produkte billig sind und Ihr Problem so groß ist, dass das Speichern des Hessischen schwierig oder unmöglich ist. BFGS umfasst einige weitere Vektor-Vektor-Produkte, um das ungefähre Hessische zu aktualisieren, sodass jede BFGS-Iteration teurer ist, Sie jedoch weniger benötigen, um ein lokales Minimum zu erreichen.nnn
Ich würde die beiden Algorithmen anhand eines kleinen Testproblems für Ihre Anwendung vergleichen, wenn Sie wissen, dass die Speicherung kein Problem darstellt. Ohne die Besonderheiten Ihres Problems zu kennen, gehe ich davon aus, dass BFGS schneller sein wird, aber Sie sollten die beiden Algorithmen wirklich testen, um eine bessere Vorstellung davon zu bekommen, welche besser funktionieren wird.
Abschließend noch ein Wort zur automatischen Differenzierung: Nachdem ich einige Erfahrungen mit einer internen automatischen Differenzierungsfunktion (AD) für Fortran ( DAEPACK ) gesammelt habe , kann ich Ihnen sagen, dass AD-Tools oft schwierig sind. Sie sind möglicherweise nicht unbedingt in der Lage, den von ihnen selbst generierten Code zu unterscheiden. Es gibt zwei Arten von AD-Tools:
- AD-Tools von Quelle zu Quelle
- Operator, der AD-Tools überlastet
Source-to-Source-Tools sind im Wesentlichen modifizierte Compiler, die den von Ihnen geschriebenen Quellcode analysieren und automatisch neuen Quellcode generieren, der den Gradienten der Funktionen in Ihrem Quellcode berechnet. Für das Überladen von AD-Tools durch Operatoren müssen Sie die überladenen AD-Operatoren in Ihrem Quellcode verwenden, damit Ableitungen berechnet werden können. Dies würde zusätzlichen Aufwand für die Berechnung analytischer Ableitungen mit AD erfordern.