Automatisches Differenzieren
Das automatische Differenzieren bzw. Differenzieren von Algorithmen ist ein Verfahren der Informatik und angewandten Mathematik. Zu einer Funktion in mehreren Variablen, die als Prozedur in einer Programmiersprache oder als Berechnungsgraph gegeben ist, wird eine erweiterte Prozedur erzeugt, die sowohl die Funktion als auch einen oder beliebig viele Gradienten bis hin zur vollen Jacobi-Matrix auswertet. Wenn das Ausgangsprogramm Schleifen enthält, darf die Anzahl der Schleifendurchläufe nicht von den unabhängigen Variablen abhängig sein.
Diese Ableitungen werden z. B. für das Lösen von nichtlinearen Gleichungssystemen mittels Newton-Verfahren und für Methoden der nichtlinearen Optimierung benötigt.
Das wichtigste Hilfsmittel dabei ist die Kettenregel sowie die Tatsache, dass zu den im Computer verfügbaren Elementarfunktionen wie sin, cos, exp, log die Ableitungen bekannt und genauso exakt berechenbar sind. Damit wird der Aufwand zur Berechnung der Ableitungen proportional (mit kleinem Faktor) zum Aufwand der Auswertung der Ausgangsfunktion.
Berechnung von Ableitungen
Aufgabe: Gegeben sei eine Funktion
Gesucht ist der Code/die Funktion für Richtungsableitungen oder die volle Jacobi-Matrix
Verschiedene Ansätze hierfür sind:
- Versuche, eine geschlossene, analytische Form für f zu finden und bestimme durch Differentiation „auf Papier“. Implementiere dann den Code für von Hand.
- Problem: Zu schwierig, zeitaufwendig, fehleranfällig
- Vorteile: sehr effizient, hohe Genauigkeit
- Erzeuge die Berechnungsvorschrift für f in einem Computeralgebrasystem und wende die dort zur Verfügung stehenden Mittel zum symbolischen Differenzieren an. Exportiere dann den Code für in seine eigentliche Umgebung.
- Problem: Zeitaufwendig, skaliert nicht, zu kompliziert für größere Programme/Funktionen
- Bestimme eine numerische Approximation der Ableitung. Es gilt für kleines h
- .
- Problem: Wahl der optimalen Schrittweite h, ungenau, eventuell Instabilität
- Vorteil: einfache Berechnung
- Stelle die Berechnungsvorschrift als Berechnungsbaum, d. h. als arithmetisches Netzwerk, dar und erweitere diesen unter Verwendung der Kettenregel zu einem Berechnungsbaum für Funktionswert und Ableitung .
Die Idee der automatischen Differentiation (AD)
Jedes Programm, das eine Funktion auswertet, kann als eine Abfolge von Zwischenschritten beschrieben werden, in denen Zwischenergebnisse auf elementare Weise umgewandelt werden. Man kann sich dies so vorstellen, dass es eine (potentiell unendliche) Folge von Zwischenwerten gibt und Funktionen , die aber nur von ein oder zwei Variablen wirklich abhängen. Die Funktion wird ausgewertet, indem am Anfang gesetzt wird und nacheinander
bestimmt wird. Dies kann so eingerichtet werden, dass die Funktionswerte von f sich in den zuletzt ausgewerteten Zwischenergebnissen befinden, d. h. am Ende wird noch zugeordnet.
AD beschreibt eine Menge von Verfahren, deren Ziel es ist, ein neues Programm zu erzeugen, das die Jacobimatrix von f, auswertet. Die Eingabevariablen x heißen unabhängige Variablen, die Ausgabevariable(n) y abhängige Variablen. Bei AD unterscheidet man mindestens zwei verschiedene Modi.
- Vorwärtsmodus (engl. Forward Mode)
- Rückwärtsmodus (engl. Reverse Mode)
Vorwärtsmodus
Im Vorwärtsmodus berechnet man das Matrizenprodukt
der Jacobi-Matrix mit einer beliebigen Matrix (Seedmatrix), ohne vorher die Komponenten der Jacobi-Matrix zu bestimmen.
Beispiel 1
- AD berechnet J
Im Vorwärtsmodus werden Richtungsableitungen entlang des Kontrollflusses der Berechnung von f transportiert. Für jede skalare Variable v wird in dem AD-erzeugten Code ein Vektor Dv erzeugt, dessen i-te Komponente die Richtungsableitung entlang der i-ten unabhängigen Variablen enthält.
Beispiel 2
Berechne eine Funktion
Eine automatische Differentiation im Vorwärtsmodus hätte eine Funktion
zum Ergebnis:
Rückwärtsmodus
Der Rückwärtsmodus besteht aus zwei Phasen.
- Das Originalprogramm wird ausgeführt und gewisse Daten werden abgespeichert.
- Das Originalprogramm wird rückwärts ausgeführt. Dabei werden Richtungsableitungen transportiert und es werden die Daten aus Phase 1 verwendet.
In Phase 2 wird für jede skalare Variable v ein Vektor eingeführt. Dieser Vektor enthält in der i-ten Komponente die i-te Richtungsableitung (in Richtung von v). Die Saatmatrix befindet sich in . Im Rückwärtsmodus erhält man als Ergebnis ein Produkt
Beispiel 1
- AD berechnet J
Beispiel 2
Für jede Rechenvorschriftszeile werden die Ableitungen von u und v auf folgendem Wege von s ergänzt:
Gesucht sind die - und -Ableitungen von . Diese werden jeweils als und bezeichnet. Der Wert wird mit 1 initialisiert, alle anderen -Werte werden mit 0 initialisiert.
Effizienzbetrachtungen
Die Effizienz von AD-Algorithmen hängt vom Modus und dem Parameter p ab. Die Wahl des Modus und des Parameters p hängt davon ab, wofür die Jacobimatrix berechnet wird. Es bezeichne
die Zeit f zu berechnen | |
der Speicherbedarf dieser Rechnung | |
die Zeit f und JS zu berechnen | |
der Speicherbedarf dieser Rechnung | |
die Zeit f und SJ zu berechnen | |
der Speicherbedarf dieser Rechnung |
Für die beiden vorgestellten Modi gilt
- Vorwärtsmodus:
- Rückwärtsmodus:
Die Berechnung als Kette von Berechnungen
Gegeben: , Frage: Wie verändert sich die Ableitung von s während der zweiten Phase, um die Ableitungen von u und v zu erhalten?
wird als Sequenz von Programmen interpretiert. Im Beispiel „Optimierung eines Tragflügels“ umfasst die Berechnung die folgenden Schritte.
- Überlagerung des Tragflügels mit sogenannten „Mode-Funktionen“
- Berechnung eines Gitters, das um den Tragflügel herum gelegt wird
- Lösung der Navier-Stokes-Gleichungen auf dem Gitter und Berechnung der Integrals der selbigen.
- .
Insgesamt ergibt sich die Funktion
Mit einem naiven Ansatz würde man drei Matrizen ,, berechnen und dann zwei Matrizenmultiplikationen durchführen. Der Nachteil des Vorwärtsmodus ist allerdings:
im Rückwärtsmodus würde analog
gelten. Ein besserer Ansatz ist, das Ergebnis einer Berechnung jeweils als Saatmatrix der folgenden einzusetzen.
- Wähle als Saatmatrix der ersten Rechnung
- Das Ergebnis der ersten Rechnung als Saatmatrix der zweiten Rechnung
- Das Ergebnis der zweiten Rechnung als Saatmatrix der dritten Rechnung
also
Da die Zeilenzahl jeder Matrix 8 (p=8) ist, erhöht sich der Zeit- und Speicherbedarf gegenüber der regulären Auswertung von um höchstens 8.
Literatur
- Andreas Griewank, Andrea Walther (2008): Evaluating Derivatives: Principles and Techniques of Algorithmic Differentiation, Second Edition, SIAM, xxii + 438 Seiten, ISBN 978-0-89871-659-7
- George F. Corliss; Andreas Griewank (1993): "Operator Overloading as an Enabling Technology for Automatic Differentiation" (PDF; 227 kB), Technical Report MCS-P358-0493, Mathematics and Computer Science Division, Argonne National Laboratory