Ich bin mir nicht sicher, ob diese Frage hierher gehört, aber sie hängt eng mit den Gradientenmethoden in der Optimierung zusammen, die hier offenbar zum Thema gehören. Sie können auf jeden Fall migrieren, wenn Sie der Meinung sind, dass eine andere Community über bessere Fachkenntnisse in diesem Thema verfügt.
Kurz gesagt, ich suche nach einem schrittweisen Beispiel für die automatische Differenzierung im umgekehrten Modus . Es gibt nicht viel Literatur zu diesem Thema und die bestehende Implementierung (wie die in TensorFlow ) ist schwer zu verstehen, ohne die Theorie dahinter zu kennen. Daher wäre ich sehr dankbar, wenn jemand im Detail zeigen könnte, was wir übergeben , wie wir es verarbeiten und was wir aus dem Rechengraphen herausnehmen.
Ein paar Fragen, mit denen ich am meisten Schwierigkeiten habe:
- Samen - warum brauchen wir sie überhaupt?
- Umgekehrte Differenzierungsregeln - Ich weiß, wie man vorwärts differenziert, aber wie gehen wir zurück? wissen wir im Beispiel aus diesem Abschnitt , dass ?
- Arbeiten wir nur mit Symbolen oder durchlaufen wir tatsächliche Werte ? Beispielsweise im gleichen Beispiel ist und Symbole oder Werte?¯ w i
Antworten:
Nehmen wir an, wir haben den Ausdruck und wollen die Derivate und . Reverse-Mode-AD teilt diese Aufgabe in zwei Teile, nämlich Vorwärts- und Rückwärtsdurchläufe.z= x1x2+ Sünde( x1) dzdx1 dzdx2
Vorwärtspass
Zunächst zerlegen wir unseren komplexen Ausdruck in eine Menge primitiver Ausdrücke, dh Ausdrücke, die aus höchstens einem einzelnen Funktionsaufruf bestehen. Beachten Sie, dass ich die Eingabe- und Ausgabevariablen aus Konsistenzgründen auch umbenenne, obwohl dies nicht erforderlich ist:
Der Vorteil dieser Darstellung ist, dass Differenzierungsregeln für jeden einzelnen Ausdruck bereits bekannt sind. Zum Beispiel wissen wir , dass Ableitung von ist , und so . Wir werden diese Tatsache in umgekehrter Reihenfolge weiter unten verwenden.Sünde cos dw4dw1= cos( w1)
Vorwärtsdurchlauf besteht im Wesentlichen darin, jeden dieser Ausdrücke auszuwerten und die Ergebnisse zu speichern. Angenommen, unsere Eingaben sind: und . Dann haben wir:x1= 2 x2= 3
Pass umkehren
Dies ist, wo die Magie beginnt, und es beginnt mit der Kettenregel . In ihrer Grundform besagt die Kettenregel, dass, wenn Sie die Variable die von abhängt , die wiederum von abhängt , dann:t ( u ( v ) ) u v
oder, falls über mehrere Pfade / Variablen von abhängt , zB:t v uich
dann (siehe Beweis hier ):
Wenn wir einen Endknoten und Eingabeknoten haben und der Weg von nach durch Zwischenknoten (dh wobei ), können wir eine Ableitung finden asz wich z wich wp z= g( wp) wp= f( wich) dzdwich
Mit anderen Worten, um die Ableitung der Ausgabevariablen für eine Zwischen- oder Eingabevariable , müssen wir nur die Ableitungen ihrer Eltern und die Formel kennen, um die Ableitung des primitiven Ausdrucks zu berechnen .z wich wp= f( wich)
Der umgekehrte Durchlauf beginnt am Ende (dh ) und breitet sich rückwärts zu allen Abhängigkeiten aus. Hier haben wir (Ausdruck für "Samen"):dzdz
Dies kann als "Änderung in führt zu genau der gleichen Änderung in " gelesen werden , was ziemlich offensichtlich ist.z z
Dann wissen wir, dass und so:z= w5
Aus der Definition und den Regeln partieller Ableitungen ergibt sich . Somit:w3= w1w2 dw3dw2= w1
Was, wie wir bereits aus dem Forward Pass wissen, ist:
Schließlich trägt über und zu . Aus den Regeln partieller Ableitungen wissen wir wiederum, dass und . Somit:w1 z w3 w4 dw3dw1= w2 dw4dw1= cos( w1)
Und wieder können wir es bei bekannten Eingaben berechnen:
Da und nur Aliase für und , erhalten wir unsere Antwort:w1 w2 x1 x2
Und das ist es!
Diese Beschreibung betrifft nur skalare Eingaben, dh Zahlen, kann jedoch auch auf mehrdimensionale Arrays wie Vektoren und Matrizen angewendet werden. Zwei Dinge, die man beachten sollte, wenn man Ausdrücke mit solchen Objekten unterscheidet:
Die Fähigkeit der automatischen Unterscheidung besteht darin, dass sie mit komplizierten Strukturen aus Programmiersprachen wie Bedingungen und Schleifen umgehen kann. Wenn Sie jedoch nur algebraische Ausdrücke benötigen und das Framework für die Arbeit mit symbolischen Darstellungen ausreicht, können Sie vollständig symbolische Ausdrücke erstellen. Tatsächlich könnten wir in diesem Beispiel den Ausdruck erzeugen und diese Ableitung für beliebige Eingaben berechnen.dzdw1= w2+ cos( w1) = x2+ cos( x1)
quelle