Lassen Sie mich hier mit ein paar vorsichtigen Worten abwägen, denen eine Geschichte vorangestellt ist. Vor langer Zeit habe ich mit einem Kollegen gearbeitet, als ich gerade anfing. Er hatte ein Optimierungsproblem zu lösen, mit einem ziemlich chaotischen Ziel. Seine Lösung bestand darin, die analytischen Derivate für eine Optimierung zu generieren.
Das Problem, das ich sah, war, dass diese Derivate böse waren. Mit Macsyma generiert und in Fortran-Code konvertiert, waren sie jeweils Dutzende von Fortsetzungsanweisungen lang. Tatsächlich war der Fortran-Compiler darüber verärgert, da er die maximale Anzahl von Fortsetzungsanweisungen überschritten hatte. Während wir eine Flagge fanden, die es uns ermöglichte, dieses Problem zu umgehen, gab es andere Probleme.
In langen Ausdrücken, wie sie üblicherweise von CA-Systemen erzeugt werden, besteht das Risiko einer massiven subtraktiven Stornierung. Berechnen Sie viele große Zahlen, nur um festzustellen, dass sich alle gegenseitig aufheben, um eine kleine Zahl zu erhalten.
Oft sind analytisch erzeugte Derivate tatsächlich teurer zu bewerten als numerisch erzeugte Derivate unter Verwendung endlicher Differenzen. Ein Gradient für n Variablen kann mehr als das N-fache der Kosten für die Bewertung Ihrer Zielfunktion in Anspruch nehmen. (Möglicherweise können Sie Zeit sparen, da viele der Begriffe in den verschiedenen Ableitungen wiederverwendet werden können. Dies zwingt Sie jedoch auch dazu, eine sorgfältige Handcodierung durchzuführen, anstatt computergenerierte Ausdrücke zu verwenden. Und jedes Mal, wenn Sie böse mathematische Begriffe codieren Ausdrücke, die Wahrscheinlichkeit eines Fehlers ist nicht trivial. Stellen Sie sicher, dass Sie diese Ableitungen auf Richtigkeit überprüfen.)
Der Punkt meiner Geschichte ist, dass diese CA-generierten Ausdrücke ihre eigenen Probleme haben. Das Lustige ist, dass mein Kollege tatsächlich stolz auf die Komplexität des Problems war, dass er eindeutig ein wirklich schwieriges Problem löste, weil die Algebra so böse war. Ich glaube nicht, dass er darüber nachgedacht hat, ob diese Algebra tatsächlich das Richtige berechnet hat, ob sie so genau funktioniert und ob sie so effizient funktioniert.
Wäre ich zu diesem Zeitpunkt die leitende Person bei diesem Projekt gewesen, hätte ich ihm den Aufruhr vorgelesen. Sein Stolz veranlasste ihn, eine Lösung zu verwenden, die wahrscheinlich unnötig komplex war, ohne zu überprüfen, ob ein Gradient auf der Basis endlicher Differenzen angemessen war. Ich wette, wir hatten vielleicht eine Mannwoche Zeit damit verbracht, diese Optimierung zum Laufen zu bringen. Zumindest hätte ich ihm geraten, den erzeugten Gradienten sorgfältig zu testen. War es genau? Wie genau war es im Vergleich zu Finite-Differenzen-Derivaten? Tatsächlich gibt es heutzutage Tools, die auch eine Schätzung des Fehlers in ihrer abgeleiteten Vorhersage zurückgeben. Dies gilt sicherlich für den adaptiven Differenzierungscode (Derivat), den ich in MATLAB geschrieben habe.
Testen Sie den Code. Überprüfen Sie die Derivate.
Bevor Sie dies jedoch tun, sollten Sie überlegen, ob andere, bessere Optimierungsschemata in Frage kommen. Wenn Sie beispielsweise eine Exponentialanpassung durchführen, besteht eine sehr gute Chance, dass Sie partitionierte nichtlineare kleinste Quadrate verwenden (manchmal als trennbare kleinste Quadrate bezeichnet. Ich denke, das war der Begriff, den Seber und Wild in ihrem Buch verwendet haben.) Die Idee besteht darin, den Parametersatz in intrinsisch lineare und intrinsisch nichtlineare Mengen zu unterteilen. Verwenden Sie eine Optimierung, die nur für die nichtlinearen Parameter funktioniert. Wenn diese Parameter "bekannt" sind, können die intrinsisch linearen Parameter unter Verwendung einfacher linearer kleinster Quadrate geschätzt werden. Dieses Schema reduziert den Parameterraum in der Optimierung. Dies macht das Problem robuster, da Sie keine Startwerte für die linearen Parameter finden müssen. Dadurch wird die Dimensionalität Ihres Suchraums verringert, sodass das Problem schneller ausgeführt wird. Wieder habe ich geliefertein Werkzeug für diesen Zweck , aber nur in MATLAB.
Wenn Sie die analytischen Derivate verwenden, codieren Sie sie, um Begriffe wiederzuverwenden. Dies kann eine erhebliche Zeitersparnis bedeuten und die Fehler tatsächlich reduzieren, wodurch Sie Ihre eigene Zeit sparen. Aber dann überprüfen Sie diese Zahlen!
codegen
darin enthaltene Paket ansehen, da es automatisch kompakten und effizienten C- oder Fortran-Code für jeden oder alle Ausdrücke generieren kann.