Ich kann zwei Motive sehen, um synthetische Gradienten in RNN zu verwenden:
- Um das Training zu beschleunigen, korrigieren Sie jede Schicht sofort mit dem vorhergesagten Gradienten
- Längere Sequenzen lernen können
Ich sehe Probleme mit beiden. Bitte beachten Sie, dass ich synthetische Farbverläufe sehr mag und sie gerne implementieren würde. Aber ich muss verstehen, wo meine Denkspur falsch ist.
Ich werde jetzt zeigen, warum Punkt 1 und Punkt 2 nicht vorteilhaft zu sein scheinen, und Sie müssen mich korrigieren, wenn sie tatsächlich nützlich sind:
Punkt 1:
Synthetische Gradienten sagen uns, dass wir uns auf ein anderes "Mini-Helfer-Netzwerk" (DNI) verlassen können, um unsere aktuelle Schicht darüber zu informieren, welche Gradienten auch während der FWD-Requisite von oben ankommen werden.
Solche Gradienten werden jedoch erst einige Operationen später auftreten. Es muss die gleiche Menge an Backprop wie ohne DNI durchgeführt werden, außer dass wir jetzt auch unseren DNI trainieren müssen.
Das Hinzufügen dieser Asyncronisität sollte nicht dazu führen, dass Ebenen schneller trainieren als während der herkömmlichen "gesperrten" vollständigen fwdprop -> vollständigen Back-Prop-Sequenz, da das Gerät die gleiche Anzahl von Berechnungen durchführen muss. Es ist nur so, dass die Berechnungen rechtzeitig verschoben werden
Dies lässt mich denken, dass Punkt 1) nicht funktionieren wird. Das einfache Hinzufügen von SG zwischen den einzelnen Schichten sollte die Trainingsgeschwindigkeit nicht verbessern.
Punkt 2:
Ok, wie wäre es, wenn Sie SG nur auf der letzten Ebene hinzufügen , um "Gradient from Future" vorherzusagen, und nur, wenn dies der letzte Zeitschritt während der Vorwärtsstütze ist .
Auf diese Weise kann unser LSTM, obwohl es aufhören muss, Vorhersagen zu treffen und sich zurückzubreiten, den zukünftigen Gradienten vorhersagen, den es erhalten hätte (mithilfe von DNI, der auf dem letzten Zeitschritt sitzt).
Betrachten Sie mehrere Trainingseinheiten (Sitzung A, Sitzung B):
fwdprop timestep_1A ---> fwdprop timestep_2A ---> fwdprop timestep_3A ----> stop und bkprop!
fwdprop timestep_1B ---> fwdprop timestep_2B ---> fwdprop timestep_3B ----> stop und bkprop!
Wir haben unser Netzwerk gerade gezwungen, 6 Zeitschritte in zwei Hälften zu "analysieren": 3 Zeitschritte, dann wieder 3 verbleibende Zeitschritte.
Beachten Sie, dass unser DNI ganz am Ende von "Sitzung A" sitzt und vorhersagt, "welchen Gradienten ich vom Beginn von Sitzung B (ab Zukunft) fließen würde ". Aus diesem Grund wird timestep_3A mit einem Gradienten "ausgestattet, der von timestep_1B stammen würde" ausgestattet, sodass Korrekturen, die während A vorgenommen werden, zuverlässiger sind.
Aber hey! Diese vorhergesagten „synthetische Gradienten“ wird sehr klein (vernachlässigbar) sowieso - immerhin das ist , warum wir eine neue Backprop starten Sitzung B . Wären sie nicht zu klein, würden wir einfach alle 6 Zeitschritte in einer einzigen langen bkprop "Sitzung A" analysieren.
Daher denke ich, dass Punkt 2) auch keinen Nutzen bringen sollte. Das Hinzufügen von SG im letzten Zeitschritt von fwdprop ermöglicht das effektive Trainieren längerer Sequenzen, aber verschwindende Verläufe gingen nirgendwo hin.
OK. Vielleicht können wir den Vorteil nutzen, "Sitzung A" , "Sitzung B" usw. auf separaten Maschinen zu trainieren ? Aber wie unterscheidet sich das vom einfachen parallelen Training mit den üblichen Minibatches? Denken Sie daran, wurde in Punkt 2 erwähnt: Die Situation wird durch Sitzung A verschlechtert, indem Gradienten vorhergesagt werden, die sowieso verschwinden.
Frage: Bitte helfen Sie mir, den Nutzen von Synthetic Gradient zu verstehen, da die beiden oben genannten Punkte nicht vorteilhaft zu sein scheinen