Diese Frage bezieht sich auf das Deepmind-Papier zu DDPG: https://arxiv.org/pdf/1509.02971v5.pdf .
Die meisten (alle?) Implementierungen des DDPG-Algorithmus, die ich gesehen habe, berechnen die Gradientenaktualisierung für das Akteursnetzwerk durch , wo stellt die Parameter des Akteursnetzwerks dar, repräsentiert das Akteursnetzwerk, repräsentiert das Kritikernetzwerk und repräsentiert die Zustandseingabe. Ich werde diese Gleichung 1 nennen.
Gleichung 1 wird, wie in der Veröffentlichung gezeigt, durch Anwenden der Kettenregel auf abgeleitet . Das gibt.
Meine Frage ist, ob ich mit einem Auto-Grad-Softwarepaket (Theano / Tensorflow / Torch / etc) einen Grund habe, warum ich nicht einfach den Gradienten der Ausgabe von berechnen konnte wrt direkt? Aus irgendeinem Grund scheinen alle Implementierungen zuerst den Gradienten der Ausgabe von zu berechnen wrt und multiplizieren Sie es dann mit dem Gradienten von wrt zu gemäß der Kettenregel. Ich verstehe nicht, warum sie das tun - warum nicht einfach den Gradienten von direkt berechnen wrt stattdessen? Gibt es einen Grund, warum Sie dies nicht tun können? Dh warum scheinen die meisten Updates dies zu tun:
Q_grad = gradients( Q(s, mu(s|theta)), mu(s|theta) )
mu_grad = gradients( mu(s|theta), theta )
J_grad = Q_grad * mu_grad
An Stelle von:
J_grad = gradients( Q(s, mu(s|theta)), theta )
Wobei die erste Eingabe für "Farbverläufe" die Funktion ist, die Sie unterscheiden möchten, und die zweite Eingabe die Funktion ist, in Bezug auf die Sie unterscheiden möchten.
Um klar zu sein, ich sehe keinen Grund warum ist eine andere Aktualisierung als Gleichung 1, da Gleichung 1 buchstäblich durch Anwenden der Kettenregel auf abgeleitet wird , aber ich möchte sicherstellen, dass mir keine Subtilität fehlt.
Antworten:
Es gibt keinen Unterschied in der Berechnung. Ich habe mich das Gleiche gefragt und in meiner eigenen TensorFlow DDPG-Implementierung überprüft, indem ich beide ausprobiert und behauptet habe, dass die numerischen Werte identisch sind. Wie erwartet sind sie.
Mir ist aufgefallen, dass die meisten Tutorial-ähnlichen Implementierungen (z. B. Patrick Emamis ) die Multiplikation explizit zeigen. Die Baseline-Implementierung von OpenAIdoes direkt berechnen ∇θμQ . (Sie definieren dazu einen Verlust im Akteursnetzwerk von−∇θμQ gemittelt über die Charge).
Es gibt einen Grund, den Sie trennen möchten∇aQ von ∇θμμ und multipliziere sie. Dies ist der Fall, wenn Sie einen der Begriffe direkt bearbeiten möchten. Zum Beispiel machen Hausknecht und Stone "invertierende Gradienten" an∇aQ Maßnahmen zu erzwingen, um in der Reichweite der Umwelt zu bleiben.
quelle
Auf diese Weise können Sie zwei unabhängige Netzwerke definieren. Andernfalls müssen Sie möglicherweise ein großes Netzwerk definieren und unterscheiden, welcher Teil zur Richtlinie und welcher zur Statusaktionswertfunktion gehört.
quelle
Ich bin mir nicht sicher, ob ich diese Multiplikation zwischen den beiden Gradiententermen verstehen kann.
Wenn Sie dies mit Tensorflow berechnen:
Es wendet die Kettenregel an und berechnet daher die Gadients für
Q
die Ausgabe des Richtliniennetzwerksmu(s|theta)
und propagiert diese "Fehler" dann über das Richtliniennetzwerk zurück, um die abgetasteten Farbverläufetheta
(die Parameter jeder Schicht Ihres Richtliniennetzwerks) zu erhalten.Wenn Sie jedoch Folgendes tun:
Dann berechnet es nach meinem Verständnis (1) den Gradienten
Q
der Ausgabe des Richtliniennetzwerksmu(s|theta)
und (2) den Gradienten der Ausgabe des Richtliniennetzwerksmu(s|theta)
für die Richtlinienparametertheta
, diesmal jedoch SEPARAT. Was ich nicht verstehe, ist, dass Sie jetzt einerseits Ihren ersten Farbverlauf haben, der ein Größenvektor ist,(1, action_dim)
und andererseits Ihren zweiten Farbverlauf, der ein Größenvektor ist(1, theta_dim)
. Um Ihr Update anzuwenden, benötigen Sie einen Farbverlauf für Theta, der ein Vektor der Größe wäre(1, theta_dim)
. Was genau bewirkt diese Multiplikation in der dritten Zeile und wie entspricht sie der Rückübertragung des ersten Gradienten durch das Richtliniennetzwerk:Frage:
Führt es nur ein Außenprodukt aus, das eine Formmatrix erstellt
(action_dim, theta_dim)
und dann durch Summieren über die Dimension reduziert, um unseren Aktualisierungsvektor der Form zu erhalten(1, theta)
? Wenn ja, warum ist dies gültig (entspricht der Rückübertragung des ersten Gradienten durch das Richtliniennetzwerk)?quelle