RNNs: Wann BPTT anwenden und / oder Gewichte aktualisieren?


15

Ich versuche, die Anwendung von RNNs auf hoher Ebene auf die Sequenzmarkierung über (unter anderem) Graves 'Artikel über die Phonemklassifizierung von 2005 zu verstehen .

Um das Problem zusammenzufassen: Wir haben ein großes Trainingsset, das aus (Eingabe-) Audiodateien einzelner Sätze und (Ausgabe-) von Experten gekennzeichneten Startzeiten, Stoppzeiten und Beschriftungen für einzelne Phoneme (einschließlich einiger "spezieller" Phoneme wie Stille) besteht. so dass jedes Sample in jeder Audiodatei mit einem Phonemsymbol gekennzeichnet ist.)

Der Schwerpunkt des Papiers besteht darin, eine RNN mit LSTM-Speicherzellen in der verborgenen Schicht auf dieses Problem anzuwenden. (Er wendet zum Vergleich mehrere Varianten und verschiedene andere Techniken an. Ich interessiere mich momentan NUR für das unidirektionale LSTM, um die Dinge einfach zu halten.)

Ich glaube, ich verstehe die Architektur des Netzwerks: Eine Eingabeschicht, die 10-ms-Fenstern der Audiodateien entspricht und auf eine Weise vorverarbeitet ist, die für die Audioarbeit Standard ist; eine verborgene Schicht von LSTM-Zellen und eine Ausgabeschicht mit einer One-Hot-Codierung aller möglichen 61 Telefonsymbole.

Ich glaube, ich verstehe die (komplizierten, aber einfachen) Gleichungen des Vorwärts- und Rückwärtsdurchlaufs durch die LSTM-Einheiten. Sie sind nur Kalkül und die Kettenregel.

Was ich nach mehrmaligem Lesen dieses und mehrerer ähnlicher Artikel nicht verstehe, ist, wann genau der Backpropagation-Algorithmus angewendet werden muss und wann genau die verschiedenen Gewichte in den Neuronen aktualisiert werden müssen.

Es gibt zwei plausible Methoden:

1) Frame-weise Backprop und Update

Load a sentence.  
Divide into frames/timesteps.  
For each frame:
- Apply forward step
- Determine error function
- Apply backpropagation to this frame's error
- Update weights accordingly
At end of sentence, reset memory
load another sentence and continue.

oder,

2) Satzweise Backprop und Update:

Load a sentence.  
Divide into frames/timesteps.  
For each frame:
- Apply forward step
- Determine error function
At end of sentence:
- Apply backprop to average of sentence error function
- Update weights accordingly
- Reset memory
Load another sentence and continue.

Beachten Sie, dass dies eine allgemeine Frage zum RNN-Training ist, wobei das Graves-Papier als spitzes (und persönlich relevantes) Beispiel verwendet wird: Wird beim Training von RNNs auf Sequenzen bei jedem Zeitschritt Backprop angewendet? Werden die Gewichte bei jedem Zeitschritt angepasst? Oder werden in einer losen Analogie zum Batch-Training für streng Feed-Forward-Architekturen Fehler akkumuliert und über eine bestimmte Sequenz gemittelt, bevor Backprop- und Gewichtsaktualisierungen angewendet werden?

Oder bin ich noch verwirrter als ich denke?

Antworten:


25

Ich gehe davon aus, dass es sich um wiederkehrende neuronale Netze (RNNs) handelt, die bei jedem Zeitschritt eine Ausgabe erzeugen (wenn die Ausgabe nur am Ende der Sequenz verfügbar ist, ist es nur sinnvoll, am Ende Backprop auszuführen). RNNs in dieser Einstellung werden häufig unter Verwendung einer verkürzten Backpropagation durch die Zeit (BPTT) trainiert, die nacheinander an "Blöcken" einer Sequenz arbeitet. Das Verfahren sieht folgendermaßen aus:

  1. Vorwärtsdurchlauf: Durchlaufen Sie die nächsten und berechnen Sie die Eingabe-, ausgeblendeten und Ausgabezustände.k1
  2. Berechnen Sie den Verlust, summiert über die vorherigen Zeitschritte (siehe unten).
  3. Rückwärtsdurchlauf: Berechnen Sie den Gradienten des Verlusts für alle Parameter, der sich über die vorherigen Zeitschritte angesammelt hat (dies erfordert, dass alle Aktivierungen für diese gespeichert wurden). Clip-Verläufe, um das explodierende Gradientenproblem zu vermeiden (kommt selten vor).k2
  4. Aktualisieren Sie die Parameter (dies erfolgt einmal pro Block, nicht schrittweise bei jedem Zeitschritt).
  5. Wenn Sie mehrere Blöcke einer längeren Sequenz verarbeiten, speichern Sie den verborgenen Status im letzten Zeitschritt (wird verwendet, um den verborgenen Status für den Beginn des nächsten Blocks zu initialisieren). Wenn wir das Ende der Sequenz erreicht haben, setzen Sie den Speicher / versteckten Zustand zurück und gehen Sie zum Anfang der nächsten Sequenz (oder zum Anfang derselben Sequenz, wenn es nur eine gibt).
  6. Wiederholen Sie ab Schritt 1.

Wie der Verlust summiert wird, hängt von und . Wenn beispielsweise , wird der Verlust über die letzten summiert , aber die Prozedur ist anders, wenn (siehe Williams und Peng 1990).k1k2k1=k2k1=k2k2>k1

Gradientenberechnung und Aktualisierungen werden alle Zeitschritte durchgeführt, da dies rechnerisch billiger ist als die Aktualisierung bei jedem Zeitschritt. Das mehrmalige Aktualisieren pro Sequenz (dh das Einstellen von kleiner als die Sequenzlänge) kann das Training beschleunigen, da Gewichtsaktualisierungen häufiger sind.k1k1

Die Backpropagation wird nur für , da sie rechnerisch billiger ist als die zum Anfang der Sequenz (für die alle gespeichert und wiederholt verarbeitet werden müssten). Auf diese Weise berechnete Gradienten sind eine Annäherung an den über alle Zeitschritte berechneten "wahren" Gradienten. Aufgrund des Problems des verschwindenden Gradienten tendieren Gradienten jedoch nach einer gewissen Anzahl von Zeitschritten dazu, sich Null zu nähern. Eine Ausbreitung über diese Grenze hinaus würde keinen Nutzen bringen. Wenn Sie zu kurz kann dies die zeitliche Skala einschränken, über die das Netzwerk lernen kann. Der Speicher des Netzwerks ist jedoch nicht auf beschränkt, da die verborgenen Einheiten Informationen über diesen Zeitraum hinaus speichern können (zk2k2k2).

Neben rechnerischen Überlegungen hängen die richtigen Einstellungen für und von der Statistik der Daten ab (z. B. der zeitlichen Skala der Strukturen, die für die Erzeugung guter Ergebnisse relevant sind). Sie hängen wahrscheinlich auch von den Details des Netzwerks ab. Beispielsweise gibt es eine Reihe von Architekturen, Initialisierungstricks usw., mit denen das Problem des abklingenden Gradienten gemindert werden soll.k1k2

Ihre Option 1 ('Frame-weise Backprop') entspricht der Einstellung von auf und auf die Anzahl der vom Satzanfang bis zum aktuellen Punkt. Option 2 (' Backprop') entspricht dem Setzen von und auf die Satzlänge. Beides sind gültige Ansätze (mit Rechen- / Leistungsüberlegungen wie oben; # 1 wäre für längere Sequenzen ziemlich rechenintensiv). Keiner dieser Ansätze würde als "abgeschnitten" bezeichnet, da die Rückausbreitung über die gesamte Sequenz erfolgt. Andere Einstellungen von und sind möglich; Ich werde unten einige Beispiele auflisten.k11k2k1k2k1k2

Referenzen, die verkürzte BPTT beschreiben (Verfahren, Motivation, praktische Probleme):

  • Sutskever (2013) . Training wiederkehrender neuronaler Netze.
  • Mikolov (2012) . Statistische Sprachmodelle basierend auf neuronalen Netzen.
    • Unter Verwendung von Vanille-RNNs zur Verarbeitung von Textdaten als Folge von Wörtern empfiehlt er, auf 10-20 Wörter und auf 5 Wörterk1k2
    • Das Durchführen mehrerer Aktualisierungen pro Sequenz (dh kleiner als die Sequenzlänge) funktioniert besser als das Aktualisieren am Ende der Sequenzk1
    • Das einmalige Durchführen von Updates pro Block ist besser als inkrementell (was instabil sein kann).
  • Williams und Peng (1990) . Ein effizienter gradientenbasierter Algorithmus für das Online-Training wiederkehrender Netzwerkverläufe.
    • Ursprünglicher (?) Vorschlag des Algorithmus
    • Sie diskutieren die Wahl von und (die sie und ). Sie berücksichtigen nur .k1k2hhk2k1
    • Hinweis: Sie verwenden den Ausdruck "BPTT (h; h ')" oder "den verbesserten Algorithmus", um auf das zu verweisen, was die anderen Referenzen als "abgeschnittenes BPTT" bezeichnen. Sie verwenden den Ausdruck "abgeschnittenes BPTT", um den Sonderfall zu bezeichnen, in dem .k1=1

Andere Beispiele mit abgeschnittenem BPTT:

  • (Karpathy 2015). char-rnn.
    • Beschreibung und Code
    • Vanilla RNN, das Textdokumente verarbeitet, dokumentiert jeweils ein Zeichen. Ausgebildet, um den nächsten Charakter vorherzusagen. Zeichen. Netzwerk zum Generieren von neuem Text im Stil des Schulungsdokuments mit amüsanten Ergebnissen.k1=k2=25
  • Gräber (2014) . Generieren von Sequenzen mit wiederkehrenden neuronalen Netzen.
    • Siehe Abschnitt zum Generieren simulierter Wikipedia-Artikel. LSTM-Netzwerk verarbeitet Textdaten als Folge von Bytes. Trainiert, um das nächste Byte vorherzusagen. Bytes. LSTM-Speicher wird alle Bytes zurückgesetzt.10 , 000k1=k2=10010,000
  • Sak et al. (2014) . Auf dem Kurzzeitgedächtnis basierende wiederkehrende neuronale Netzwerkarchitekturen für die Spracherkennung mit großem Wortschatz.
    • Modifizierte LSTM-Netzwerke, die Sequenzen von akustischen Merkmalen verarbeiten. .k1=k2=20
  • Ollivier et al. (2015) . Trainieren Sie wiederkehrende Netzwerke online ohne Rückverfolgung.
    • In diesem Artikel ging es darum, einen anderen Lernalgorithmus vorzuschlagen, der jedoch mit abgeschnittenem BPTT verglichen wurde. Verwendete Vanille-RNNs, um Folgen von Symbolen vorherzusagen. erwähne es hier nur, um zu sagen, dass sie .k1=k2=15
  • Hochreiter und Schmidhuber (1997) . Langes Kurzzeitgedächtnis.
    • Sie beschreiben ein modifiziertes Verfahren für LSTMs

Dies ist eine hervorragende Antwort, und ich wünschte, ich hätte das Ansehen in diesem Forum, um ihm eine beträchtliche Prämie zu gewähren. Besonders nützlich sind die konkrete Diskussion von k1 gegen k2, um meine beiden Fälle gegen eine allgemeinere Verwendung zu kontextualisieren, und numerische Beispiele dafür.
Novak
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.