Synthetische Gradienten - was ist der praktische Nutzen?


8

Ich kann zwei Motive sehen, um synthetische Gradienten in RNN zu verwenden:

  1. Um das Training zu beschleunigen, korrigieren Sie jede Schicht sofort mit dem vorhergesagten Gradienten
  2. 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


Warum wird das Training Ihrer Meinung nach nicht beschleunigt? Die einzige Rechtfertigung, die ich sehe, ist die bloße Behauptung, dass dies "die Trainingsgeschwindigkeit nicht verbessern sollte", aber Sie geben Ihre Argumentation nicht an. Es ist auch nicht klar, was Sie mit "Schritt 1)" meinen, da Sie in der Frage keine Schritte beschrieben haben. In jedem Fall zeigt das Papier, dass es Beschleunigungen bietet. Daten schlagen jeden Tag die Theorie. Hast du die Zeitung gelesen?
DW

Ich bin damit einverstanden, dass Daten jeden Tag die Theorie übertreffen, aber das beste Gegenbeispiel, das ich machen kann, sind GPUs und CPUs. Überall wird immer wieder gesagt, dass die GPU Größenordnungen schneller als die CPU ausführt und Vergleiche anstellt. Eine ordnungsgemäß codierte Mulithread-CPU ist jedoch nur 2-3 Mal langsamer als die GPU derselben Kategorie und billiger als die GPU. larsjuhljensen.wordpress.com/2011/01/28/… Wieder einmal bin ich nicht gegen synthetische Farbverläufe - sie scheinen fantastisch zu sein, nur bis ich eine Antwort auf meinen Beitrag bekomme, kann ich mich nicht ausruhen: D.
Kari

Ich bin mir nicht sicher, ob ein 7 Jahre alter Blog-Beitrag über BLAST hier fürchterlich relevant ist.
DW

Was ich damit sagen will, ist "es gibt Möglichkeiten, Parallelität besser erscheinen zu lassen, als es tatsächlich sein könnte", in jedem Szenario
Kari

Antworten:


2

Aber hey! Diese vorhergesagten "synthetischen Gradienten" werden sowieso sehr klein (vernachlässigbar) sein - schließlich starten wir deshalb eine neue Backprop-Sitzung B. Wären sie nicht zu klein, würden wir einfach alle 6 Zeitschritte in einer einzigen langen bkprop-Sitzung A analysieren ".

-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:

 input
   |
   V
Layer_0 & DNI_0
Layer_1
Layer_2
Layer_3 & DNI_3
Layer_4
Layer_5 & DNI_5
Layer_6
Layer_7
   | 
   V
output

Der DNI_0 wird immer mit einem synthetischen Gradienten trainiert, der von DNI_3 kommt (der natürlich durch Schicht_2 und Schicht_1 fließt) und mehrere Schichten weiter positioniert.

Ebenso wird der DNI_3 immer mit einem synthetischen Gradienten trainiert, der von DNI_5 kommt

DNI_0 oder DNI_3 sehen niemals den wahren Gradienten, da der wahre Grad nur an DNI_5 und nicht früher geliefert wird .

Lesen Sie diesen fantastischen Blogpost , Teil 3, für alle, die immer noch Schwierigkeiten haben, sie zu verstehen

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.


0

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.


Nach meinem Verständnis sollten die Gradienten zeitlich nicht schneller den DNI erreichen, sondern nur, dass sie jetzt zeitlich verschoben und asynchron berechnet werden, während die Vorwärtsstütze auftritt. Der DNI muss immer noch den wahren Gradienten erhalten, um sich selbst zu trainieren . Daher sollten die synthetischen Gradienten die gleiche Anzahl von Berechnungen erfordern, die parallel durchgeführt werden müssen wie bei Standard-BPTT. Ist das richtig?
Kari

Es würde also keine Beschleunigung geben, einfach die SG zwischen den Schichten einzuführen. Ja, wir erhalten den sofort vorhergesagten Gradienten vom DNI, aber für jede solche Vorhersage müssen wir schließlich den Preis durch asynchrone vollständige Rückausbreitung in Richtung dieses DNI zahlen , etwas später
Kari,

@Kari, nein, das klingt für mich nicht richtig. Wenn Sie die gleiche Anzahl von Iterationen benötigen, aber jetzt jede Iteration 50% weniger Zeit auf der GPU benötigt, wird die resultierende Berechnung früher durchgeführt. Selbst wenn Sie 10% mehr Iterationen / Epochen benötigen (weil die Verläufe verzögert sind oder die synthetischen Verläufe nicht perfekt mit den tatsächlichen Verläufen übereinstimmen), ist dies immer noch ein Gewinn: Die Beschleunigung, den synthetischen Gradienten schneller als den tatsächlichen Gradienten berechnen zu können überwiegt andere Effekte. Sie scheinen zuversichtlich zu sein, dass dies nicht helfen kann, aber die Daten im Papier zeigen, dass es hilft.
DW

Hm, zum Beispiel haben wir 4 Schichten nach unserem DNI; Im normalen Backprop würden wir 4 "Vorwärts" -Austausche zwischen den Schichten und dann 4 "Rückwärtsaustausche" haben, und während dies auftritt, ist das System gesperrt. Mit DNI können wir unsere Gewichte sofort korrigieren, müssen aber später echte Steigungen erhalten. Jetzt ist das System jedoch nicht gesperrt, sodass in der Zwischenzeit weitere Vorwärtspässe vorbeigleiten können. Aber wir verdanken immer noch den wahren Gradienten von früher unserem DNI ... Um diesen Gradienten zu erhalten und an DNI zurückzusenden, dauert es 100% der Zeit (dieselben 4 Schritte vorwärts, dieselben 4 Schritte rückwärts).
Kari

Es ist nur so, dass unser DNI sagt "Gut, geben Sie sie, wenn möglich, später", aber wir müssen immer noch den vollen Preis zahlen, also sehe ich keine Leistungssteigerung. Ich stimme zu, die Papiere zeigen großartige Ergebnisse, aber wie kommt es? Wir können ohnehin schon Minibatches parallel trainieren: /
Kari
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.