In einem wiederkehrenden neuronalen Netzwerk würden Sie normalerweise die Weiterleitung über mehrere Zeitschritte durchführen, das Netzwerk "ausrollen" und dann die Weiterleitung über die Folge von Eingaben zurückführen.
Warum sollten Sie nicht einfach die Gewichte nach jedem einzelnen Schritt in der Sequenz aktualisieren? (Das entspricht einer Trunkierungslänge von 1, es gibt also nichts, was abgewickelt werden müsste.) Dies beseitigt das Problem des Verschwindens des Gradienten vollständig, vereinfacht den Algorithmus erheblich, würde wahrscheinlich die Wahrscheinlichkeit verringern, in lokalen Minima hängen zu bleiben, und scheint vor allem gut zu funktionieren . Ich habe ein Modell auf diese Weise trainiert, um Text zu generieren, und die Ergebnisse schienen mit den Ergebnissen vergleichbar zu sein, die ich von BPTT-trainierten Modellen gesehen habe. Ich bin nur verwirrt, weil in jedem Tutorial zu RNNs, das ich gesehen habe, die Verwendung von BPTT empfohlen wird, fast so, als ob es für das richtige Lernen erforderlich wäre, was nicht der Fall ist.
Update: Ich habe eine Antwort hinzugefügt
Antworten:
Bearbeiten: Ich habe einen großen Fehler beim Vergleichen der beiden Methoden gemacht und muss meine Antwort ändern. Es stellt sich heraus, wie ich es getan habe, indem ich mich auf den aktuellen Zeitschritt beschränkte, und tatsächlich anfing, schneller zu lernen. Die schnellen Updates lernen die grundlegendsten Muster sehr schnell. Bei einem größeren Datensatz und einer längeren Einarbeitungszeit hat BPTT jedoch tatsächlich die Nase vorn. Ich habe eine kleine Stichprobe für ein paar Epochen getestet und angenommen, wer als Sieger anfängt. Dies führte mich jedoch zu einem interessanten Fund. Wenn Sie zu Beginn Ihres Trainings nur einen einzigen Zeitschritt zurückpropagieren, dann wechseln Sie zu BPTT und erhöhen Sie langsam, wie weit Sie zurückpropagieren, um eine schnellere Konvergenz zu erzielen.
quelle
Ein RNN ist ein Deep Neural Network (DNN), bei dem jede Schicht neue Eingaben annehmen kann, aber dieselben Parameter hat. BPT ist ein ausgefallenes Wort für Back Propagation in einem solchen Netzwerk, das selbst ein ausgefallenes Wort für Gradient Descent ist.
Angenommen , dass die Ausgänge RNN y t in jedem Schritt und e r r o r t = ( y t - y t ) 2y^t
Um die Gewichte zu lernen, benötigen wir Gradienten für die Funktion, um die Frage zu beantworten: "Wie stark wirkt sich eine Änderung des Parameters auf die Verlustfunktion aus?" und bewegen Sie die Parameter in die Richtung, die gegeben ist durch:
Das heißt, wir haben eine DNN, in der wir Feedback darüber erhalten, wie gut die Vorhersage auf jeder Schicht ist. Da eine Änderung des Parameters jede Schicht im DNN (Zeitschritt) ändert und jede Schicht zu den bevorstehenden Ausgaben beiträgt, muss dies berücksichtigt werden.
Nehmen Sie ein einfaches Ein-Neuron-Ein-Schicht-Netzwerk, um dies semi-explizit zu sehen:
Withδ the learning rate one training step is then:
What we see is that in order to calculate∇y^t+1 you need to calculate i.e roll out ∇y^t . What you propose is to t aber nicht weiter rekursiv. Ich gehe davon aus, dass Ihr Verlust so etwas wie ist
simply disregard the red partcalculate the red part forVielleicht trägt dann jeder Schritt eine grobe Richtung bei, die aggregiert ausreicht? Dies könnte Ihre Ergebnisse erklären, aber ich wäre sehr daran interessiert, mehr über Ihre Methode / Verlustfunktion zu erfahren! Wäre auch interessiert an einem Vergleich mit einem Zwei-Zeitschritt-Fenster von ANN.
edit4: Nach dem Lesen von Kommentaren scheint Ihre Architektur keine RNN zu sein.
RNN: Stateful - Verborgenen Zustand weiterleitenht auf unbestimmte Zeit
Dies ist Ihr Modell, aber das Training ist anders.
Ihr Modell: Zustandslos - Versteckter Zustand wird in jedem Schrittwiederhergestellt. Bearbeiten2: DNNs wurden mehr Verweise hinzugefügt. Bearbeiten3: Feste Abstufung und etwas Notation. Bearbeiten5: Die Interpretation Ihres Modells nach Ihrer Antwort / Erläuterung wurde korrigiert.quelle
"Entfaltung durch die Zeit" ist einfach eine Anwendung der Kettenregel,
Die Ausgabe einer RNN im Zeitschrittt , Ht ist eine Funktion der Parameter θ , die Eingabe xt und der vorherige Zustand, Ht - 1 (beachte das stattdessen Ht kann im Zeitschritt erneut transformiert werden t um die Ausgabe zu erhalten, ist das hier nicht wichtig). Erinnern Sie sich an das Ziel des Gefälleabstiegs: eine bestimmte Fehlerfunktion vorausgesetztL Schauen wir uns unseren Fehler für das aktuelle Beispiel (oder die aktuellen Beispiele) an und passen wir ihn an θ Auf diese Weise würde sich unser Fehler bei gleichem Beispiel verringern.
Wie genau hatθ Zu unserem aktuellen Fehler beitragen? Wir haben eine gewichtete Summe mit unserem aktuellen Input genommen,xt , so müssen wir durch die Eingabe backpropagieren, um zu finden ∇θa ( xt, Θ ) , um herauszufinden, wie man sich anpasst θ . Aber unser Fehler war auch das Ergebnis eines Beitrags vonHt - 1 , das war auch eine Funktion von θ , richtig? Also müssen wir es herausfinden∇θHt - 1 , das war eine Funktion von xt - 1 , θ und Ht - 2 . AberHt - 2 war auch eine Funktion eine Funktion von θ . Und so weiter.
quelle