7

Mit CUDA möchte ich ein Gleichungssystem mit einem nichtlinearen Fehlerquadratlöser lösen. Diese Methoden werden in einer ausgezeichneten Broschüre besprochen, die heruntergeladen werden kann here.Mit CUDA lösen wir ein Gleichungssystem in nichtlinearer Kleinste Quadrate

Die Jacobische Matrix in meinem Problem ist spärlich und unteren dreieckig. Gibt es eine Bibliothek für CUDA mit diesen Methoden, oder muss ich diese Methoden selbst aus der Broschüre programmieren?

Ist ein nichtlinearer Gauß-Newton-Löser, Levenberg-Marquardt oder Powell-Methodenlöser in einer CUDA-Bibliothek (entweder frei oder nicht-frei) verfügbar?

+0

https://developer.nvidia.com/cublas kann mit linear-algebra helfen – adray

+0

@adray: Danke! Sind auch einige der Optimierungsverfahren verfügbar, vielleicht in einer anderen Bibliothek? –

Antwort

3

Vor den Hinweis auf eine mögliche, einfache Implementierung eines zur Verfügung gestellt werden Quasi-Newton-Optimierungsroutine in CUDA, einige Worte darüber, wie ein Quasi-Newton-Optimierer arbeitet.

Betrachten sie eine Funktion f von N realen Variablen x und eine zweite Ordnung Expansions um einen bestimmten Punkt xi:

enter image description here

wo A die Hesse-Matrix ist .

Um ein Minimum ausgehend von einem Punkt xi impliziert zu finden, Newton-Verfahren besteht aus Zwingen

enter image description here

was zur Folge hat

enter image description here

und was wiederum wissen die Umkehrung des Hessischen.Darüber hinaus die Funktion ab, die Update-Richtung

enter image description here

sein sollte, so dass

enter image description here

, die die

enter image description here

Gemäß der obigen Ungleichheit impliziert, um sicherzustellen, , sollte die hessische Matrix sein definitiv positiv. Leider ist die Hesse-Matrix nicht notwendigerweise eindeutig positiv, insbesondere weit entfernt von einem Minimum von f, so dass die Verwendung der Umkehrung des Hessischen, zusätzlich rechnerisch belastet, auch schädlich sein kann und den Vorgang noch weiter vom Minimum zu Regionen von steigende Werte von f. Allgemein gesprochen ist es praktischer, ein Quasi-Newton-Verfahren zu verwenden, d. H. Eine Näherung der Umkehrung des Hessischen, die definitiv positiv bleibt und die Iteration nach Iterationen aktualisiert, die zur Inversion des Hessschen selbst konvergieren. Eine grobe Begründung für eine Quasi-Newton-Methode lautet wie folgt. Betrachten

enter image description here

und

enter image description here

Subtraktion der beiden Gleichungen, haben wir die Update-Regel für das Newton Verfahren

enter image description here

Die Aktualisierungsregel für die quasi- Newton-Verfahren ist das folgende

enter image description here

wo Hallo + 1 ist die genannte Matrix, die die Inverse der Hessian annähert und der Schritt nach dem Schritt der Aktualisierung.

Es gibt mehrere Regeln für die Aktualisierung Hallo + 1, und ich gehe nicht in die Details dieses Punktes. Eine sehr häufige wird von der Broyden-Fletcher-Goldfarb-Shanno zur Verfügung gestellt, aber in vielen Fällen ist das Polak-Ribiére Schema wirksam genug.

Die Umsetzung CUDA die gleichen Schritte des klassischen Numerical Recipes Ansatz folgen kann, aber unter Berücksichtigung, dass:

1) Vektor- und Matrixoperationen wirksam durch CUDA Thrust oder cuBLAS erreicht werden; 2) Die Steuerlogik kann von der CPU ausgeführt werden; 3) Die Zeilenminimierung mit Roots-Bracketing und Root-Ergebnissen kann auf der CPU durchgeführt werden und beschleunigt nur die Kostenfunktions- und Gradientenauswertungen der GPU.

Durch das obige Schema können Unbekannte, Gradienten und Hessian auf dem Gerät gespeichert werden, ohne dass sie von Host zu Gerät verschoben werden müssen.

Bitte beachten Sie auch, dass einige Ansätze in der Literatur verfügbar sind, in dem Versuch, die Linie Minimierung parallelisieren werden ebenfalls vorgeschlagen, siehe

Y. Fei, G. Rong, B. Wang, W. Wang, " Parallel L-BFGS-B Algorithmus auf GPU ", Computer & Grafiken, vol. 40, 2014, S. 1-9.

An diesen github page, eine voll ist CUDA Implementierung zur Verfügung, die Numerical Recipes Ansatz linmin, mkbrak und dbrent auf den GPU parallel Fall beschäftigt verallgemeinern. Dieser Ansatz implementiert das Schema von Polak-Ribière, kann jedoch leicht auf andere Quasi-Newton-Optimierungsprobleme verallgemeinert werden.

+1

Sie haben Recht; Jede Implementierung beginnt mit der Mathematik und es ist gut zu sehen, dass eine Referenzversion des Codes verfügbar ist. –

+0

@NicholasKinar Es sollte beachtet werden, dass der Ansatz, der mit der Github-Seite verknüpft ist, das Schema von Polak-Ribiére implementiert, aber leicht auf andere Quasi-Newton-Optimierungsprobleme verallgemeinert werden kann. Ich habe dies explizit in einer Bearbeitung meiner Antwort angegeben. – JackOLantern

0

Derzeit sind keine Prozeduren in einer Bibliothek verfügbar, die das Lösen eines Gleichungssystems mit einem nichtlinearen Fehlerquadratlöser mithilfe der CUDA-Plattform implementieren. Diese Algorithmen müssen von Grund auf mit Hilfe von anderen Bibliotheken geschrieben werden, die lineare Algebra mit dünn besetzten Matrizen implementieren. Wie im obigen Kommentar erwähnt, wird die cuBLAS-Bibliothek auch bei der linearen Algebra helfen.

https://developer.nvidia.com/cusparse

http://code.google.com/p/cusp-library/

1

Werfen Sie auch einen Blick in diese: libflame enthält Implementierungen von vielen Operationen, die von den BLAS und LAPACK Bibliotheken

+0

Danke, dreamcrash; libflame ist interessant. –