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
quelle
Antworten:
-Das ist nicht unbedingt richtig. In der Regel wird ein neues Backprop aufgrund von Hardwareeinschränkungen wie Speicher oder Rechengeschwindigkeit abgeschnitten und gestartet. Der Fluchtgradient kann auf andere Weise verbessert werden, z. B. durch Gradientennormalisierung - Vergrößerung des Gradientenvektors, wenn er über bestimmte Ebenen hinaus zu klein wird, oder Verkleinerung, wenn er kurz vor der Explosion steht. Oder sogar mit Batch-Normalisierung
Es ist wichtig zu verstehen, wie ein DNI-Modul aktualisiert wird. Betrachten Sie zur Klärung ein Beispiel für ein Netzwerk mit mehreren Schichten und 3 DNI-Modulen:
Frühere Schichten müssen sich mit synthetischen Gradienten zufrieden geben, da sie oder ihr DNI niemals den "wahren Gradienten" beobachten werden.
In Bezug auf das Training parallel zu Minibatches anstelle der Parallelisierung über synthetische Grads:
Längere Sequenzen sind präziser als Minibatches, jedoch fügen Minibatches einen Regulierungseffekt hinzu . Angesichts einer Technik, die verhindert, dass der Gradient explodiert oder verschwindet, kann das Training längerer Sequenzen einen viel besseren Einblick in den Kontext des Problems bieten. Dies liegt daran, dass das Netzwerk die Ausgabe nach Berücksichtigung einer längeren Eingabesequenz ableitet, sodass das Ergebnis rationaler ist.
Zum Vergleich der von SG gewährten Vorteile wird auf die Diagramme auf Seite 6 des Papiers verwiesen, in denen hauptsächlich längere Sequenzen gelöst werden können, was meiner Meinung nach am vorteilhaftesten ist (wir können ohnehin bereits über Minibatches parallelisieren, und daher sollte SG das nicht beschleunigen Prozess, wenn er auf demselben Computer ausgeführt wird - auch wenn wir uns tatsächlich nur bis zum nächsten DNI verbreiten).
Je mehr DNI-Module wir haben, desto lauter sollte das Signal sein. Es könnte sich also lohnen, die Layer und DNI alle mit dem Legacy-Backprop zu trainieren, und erst nach Ablauf einiger Epochen verwenden wir das oben beschriebene DNI-Bootstrapping.
Auf diese Weise erhält der früheste DNI zumindest einen Eindruck davon, was zu Beginn des Trainings zu erwarten ist. Das liegt daran, dass die folgenden DNIs sich zu Beginn des Trainings nicht sicher sind, wie der wahre Gradient tatsächlich aussieht. Daher empfehlen sie zunächst jedem, der früher als sie sitzt, den "Müll" -Gradienten.
Vergessen Sie nicht, dass die Autoren auch damit experimentiert haben, die tatsächlichen Eingaben für jede Ebene vorherzusagen.
Wenn Ihre Ebenen über teures Backprop verfügen (möglicherweise über Batch-Normalisierung oder einige ausgefallene Aktivierungsfunktionen), ist die Korrektur mit DNI möglicherweise viel billiger, wenn sie erst einmal ausreichend trainiert ist. Denken Sie daran, dass DNI nicht kostenlos ist - es erfordert eine Matrixmultiplikation und bietet auf einer einfachen dichten Schicht wahrscheinlich keine große Beschleunigung.
Minibatches beschleunigen uns (über Parallelisierung) und geben uns auch die Regularisierung. Synthetische Gradienten ermöglichen es uns, durch Arbeiten mit längeren Sequenzen und (möglicherweise) kostengünstigeren Gradienten besser zu schließen. Alles in allem ist dies ein sehr leistungsfähiges System.
quelle
Synthetische Gradienten beschleunigen das Training, nicht indem sie die Anzahl der benötigten Epochen verringern oder die Konvergenz des Gradientenabfalls beschleunigen, sondern indem sie die Berechnung jeder Epoche beschleunigen. Der synthetische Gradient ist schneller zu berechnen als der reale Gradient (die Berechnung des synthetischen Gradienten ist schneller als die Rückausbreitung), sodass jede Iteration des Gradientenabfalls schneller berechnet werden kann.
quelle