Warum sich in einem RNN zurück durch die Zeit ausbreiten?

14

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

Frobot
quelle
Eine interessante Richtung für diese Forschung wäre der Vergleich der Ergebnisse, die Sie mit Ihrem Problem erzielt haben, mit Benchmarks, die in der Literatur zu Standard-RNN-Problemen veröffentlicht wurden. Das wäre ein wirklich cooler Artikel.
Sycorax sagt Reinstate Monica
Ihr "Update: Ich habe eine Antwort hinzugefügt" hat die vorherige Bearbeitung durch Ihre Architekturbeschreibung und eine Abbildung ersetzt. Ist es absichtlich?
Amöbe sagt Reinstate Monica
Ja, ich habe es herausgenommen, weil es für die eigentliche Frage nicht relevant zu sein schien und viel Platz
Frobot
Nun, die Leute scheinen massive Probleme mit dem Verständnis Ihrer Architektur zu haben, daher sind zusätzliche Erklärungen nützlich. Sie können es Ihrer Antwort anstatt Ihrer Frage hinzufügen, wenn Sie es vorziehen.
Amöbe sagt Reinstate Monica

Antworten:

4

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.

Frobot
quelle
Vielen Dank für Ihr Update. In der Quelle dieses letzten Bildes sagt er dies über die Eins-zu-Eins- Einstellung: "Vanille-Verarbeitungsmodus ohne RNN, von einer Eingabe mit fester Größe zu einer Ausgabe mit fester Größe (z. B. Bildklassifizierung)." Das haben wir gesagt. Wenn es so ist, wie Sie es beschrieben haben, hat es keinen Status und es ist kein RNN. "Vorwärtsausbreitung über eine einzige Eingabe vor Rückwärtsausbreitung" - ich würde das eine ANN nennen. Aber diese funktionieren nicht so gut mit Text, so dass etwas nicht stimmt und ich keine Ahnung habe, was, weil ich nicht den Code habe
Ragulpr
Ich habe diesen Teil nicht gelesen und du hast recht. Das Modell, das ich benutze, ist eigentlich das "viele zu viele" ganz rechts. Ich nahm an, dass in der Eins-zu-Eins-Sektion wirklich viele davon miteinander verbunden waren und die Zeichnung es einfach ausgelassen hat. Aber das ist tatsächlich eine der Optionen ganz rechts, die mir nicht aufgefallen sind. Ich werde diesen Teil der Antwort bearbeiten, um mehr Sinn zu ergeben
Frobot,
Ich stellte mir vor, dass dies der Fall ist, deshalb bestand ich darauf, Ihre Verlustfunktion zu sehen. Wenn es zu viele viele ist Ihr Verlust ist verwandt mit und es ist gleich ein RNN und Sie sind sich ausbreitende / die gesamte Sequenz inputing aber dann nur Kürzen BPTT dh Sie‘ d berechnen den roten teil in meinem post aber nicht weiter rekursiv. errÖr=t(yt-y^t)2
Ragulpr
Meine Verlustfunktion summiert sich nicht mit der Zeit. Ich nehme eine Eingabe, erhalte eine Ausgabe, berechne dann einen Verlust und aktualisiere die Gewichte. Dann gehe ich zu t + 1 über, sodass es nichts zu summieren gibt. Ich werde die genaue Verlustfunktion zum ursprünglichen Beitrag
hinzufügen
Schreiben Sie einfach Ihren Code, ich rate nicht mehr, das ist albern.
Ragulpr
2

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

errort=(yty^t)2

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:

errort=2(yty^t)y^t

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:

y^t+1=f(a+bxt+cy^t)ay^t+1=f(a+bxt+cy^t)cay^tby^t+1=f(a+bxt+cy^t)(xt+cby^t)cy^t+1=f(a+bxt+cy^t)(y^t+ccy^t)y^t+1=f(a+bxt+cy^t)([0xty^t]+cy^t)

With δ the learning rate one training step is then:

[a~b~c~][abc]+δ(yty^t)y^t

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 simply disregard the red part calculate the red part for taber nicht weiter rekursiv. Ich gehe davon aus, dass Ihr Verlust so etwas wie ist

errÖr=t(yt-y^t)2

Vielleicht 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 weiterleiten htauf unbestimmte Zeit Statefull Dies ist Ihr Modell, aber das Training ist anders.

Ihr Modell: Zustandslos - Versteckter Zustand wird in jedem Schritt staatenlos wiederhergestellt. 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.

Ragulpr
quelle
1
Vielen Dank für Ihre Antwort. Ich denke, Sie haben vielleicht falsch verstanden, was ich tue. Bei der Vorwärtsausbreitung mache ich nur einen Schritt, so dass es bei der Rückwärtsausbreitung auch nur einen Schritt gibt. Ich leite die Weiterleitung nicht über mehrere Eingaben in der Trainingssequenz weiter. Ich verstehe, was Sie mit einer groben Richtung meinen, die in Summe ausreicht, um zu lernen, aber ich habe meine Verläufe mit numerisch berechneten Verläufen überprüft und sie stimmen mit mehr als 10 Dezimalstellen überein. Die Stütze funktioniert gut. Ich benutze Kreuzentropieverlust.
Frobot
1
Ich arbeite daran, dasselbe Modell mit BPTT zu trainieren, um einen klaren Vergleich zu erhalten. Ich habe auch ein Modell trainiert, das diesen "Ein-Schritt" -Algorithmus verwendet, um vorherzusagen, ob ein Aktienkurs am nächsten Tag steigen oder fallen wird, was eine anständige Genauigkeit aufweist. Daher habe ich zwei verschiedene Modelle, um BPTT mit Single-Step-Back-Prop zu vergleichen.
Frobot
Wenn Sie nur einen Schritt weiterleiten, ist dies nicht eine zweischichtige ANN mit Merkmalseingabe des letzten Schritts in die erste Schicht, Merkmalseingabe in den aktuellen Schritt in der zweiten Schicht, aber mit denselben Gewichten / Parametern für beide Schichten? Ich würde ähnliche oder bessere Ergebnisse mit einer ANN erwarten, die Eingaben machty^t+1=f(xt,xt-1)Das heißt, es wird ein festes Zeitfenster der Größe 2 verwendet. Wenn es nur einen Schritt vorantreibt, kann es dann langfristige Abhängigkeiten lernen?
Ragulpr
1
Ich verwende ein Schiebefenster der Größe 1, aber die Ergebnisse unterscheiden sich erheblich von der Erstellung eines Schiebefensters der Größe 2 ANN mit Eingaben (xt, xt − 1). Ich kann es absichtlich überanpassen lassen, wenn ich einen riesigen Textkörper lerne, und es kann den gesamten Text mit 0 Fehlern reproduzieren, was die Kenntnis langfristiger Abhängigkeiten erfordert, die unmöglich wären, wenn Sie nur (xt, xt − 1) als Eingabe hätten. Die einzige Frage, die ich noch habe, ist, ob die Verwendung von BPTT die Abhängigkeiten verlängern würde, aber ehrlich gesagt sieht es nicht so aus.
Frobot
Schau dir meinen aktualisierten Beitrag an. Ihre Architektur ist kein RNN, sie ist zustandslos, sodass Langzeitabhängigkeiten, die nicht explizit in die Features eingebunden sind, nicht erlernt werden können. Vorherige Vorhersagen haben keinen Einfluss auf zukünftige Vorhersagen. Sie können dies so sehen, als oby^t-2y^t=0für ihre architektur. BPTT ist theoretisch identisch mit BP, wird jedoch auf einer RNN-Architektur ausgeführt. Sie können also nicht, aber ich verstehe, was Sie meinen, und die Antwort lautet Nein. Es wäre wirklich interessant, Experimente zu Stateful RNN zu sehen, aber nur einen BPTT-Schritt. ^^
Ragulpr
1

"Entfaltung durch die Zeit" ist einfach eine Anwendung der Kettenregel,

dF(G(x),h(x),m(x))dx=FGdGdx+Fhdhdx+Fmdmdx

Die Ausgabe einer RNN im Zeitschritt t, 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 tum die Ausgabe zu erhalten, ist das hier nicht wichtig). Erinnern Sie sich an das Ziel des Gefälleabstiegs: eine bestimmte Fehlerfunktion vorausgesetztLSchauen 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 θein(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.

Matthew Hampsey
quelle
Ich verstehe, warum Sie sich in einem traditionellen RNN durch die Zeit fortpflanzen. Ich versuche herauszufinden, warum ein traditionelles RNN mehrere Eingänge gleichzeitig für das Training verwendet, wenn es viel einfacher ist, jeweils nur einen zu verwenden, und auch funktioniert
Frobot,
Der einzige Sinn, in dem Sie mehrere Eingaben gleichzeitig in eine RNN eingeben können, besteht darin, mehrere Trainingsbeispiele als Teil eines Stapels einzugeben. Die Chargengröße ist willkürlich und die Konvergenz ist für jede Größe garantiert. Höhere Chargengrößen können jedoch zu genaueren Gradientenschätzungen und einer schnelleren Konvergenz führen.
Matthew Hampsey
Das habe ich nicht mit "mehrere Eingänge gleichzeitig" gemeint. Ich habe es nicht sehr gut formuliert. Ich meinte, dass Sie in der Regel mehrere Eingaben in der Trainingssequenz vorwärts und anschließend alle Eingaben rückwärts weiterleiten und anschließend die Gewichte aktualisieren. Die Frage ist also, warum es viel einfacher ist, sich durch eine ganze Sequenz zu verbreiten, wenn immer nur eine Eingabe gemacht wird
Frobot,
Ich denke, hier ist eine Klarstellung erforderlich. Wenn Sie "Eingaben" sagen, beziehen Sie sich auf mehrere Trainingsbeispiele oder auf mehrere Zeitschritte innerhalb eines einzelnen Trainingsbeispiels?
Matthew Hampsey
1
Ich werde bis zum Ende des heutigen Tages eine Antwort auf diese Frage posten. Ich habe eine BPTT-Version fertiggestellt, muss nur noch trainieren und vergleichen. Wenn Sie danach noch Code sehen möchten, lassen Sie mich wissen, was Sie sehen möchten, und ich glaube, ich könnte ihn noch posten
Frobot,