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?