Estoy intentando comprender la aplicación de alto nivel de las RNN al etiquetado de secuencias a través de (entre otros) el artículo de 2005 de Graves sobre clasificación de los fonemas.
Para resumir el problema: tenemos un gran conjunto de entrenamiento que consiste en (entrada) archivos de audio de frases individuales y (salida) tiempos de inicio, tiempos de parada y etiquetas etiquetadas por expertos para los fonemas individuales (incluyendo algunos fonemas "especiales" como el silencio, de manera que cada muestra en cada archivo de audio está etiquetada con algún símbolo de fonema).
La idea central del artículo es aplicar a este problema una RNN con células de memoria LSTM en la capa oculta. (Aplica varias variantes y otras técnicas como comparación. Por el momento sólo me interesa la LSTM unidireccional, para simplificar las cosas).
Creo que entiendo la arquitectura de la red: Una capa de entrada que corresponde a ventanas de 10 ms de los archivos de audio, preprocesados de forma estándar para el trabajo de audio; una capa oculta de células LSTM, y una capa de salida con una codificación de un solo disparo de todos los 61 símbolos telefónicos posibles.
Creo que entiendo las ecuaciones (intrincadas pero directas) del paso hacia delante y hacia atrás por las unidades LSTM. No son más que cálculos y la regla de la cadena.
Lo que no entiendo, después de leer varias veces este documento y otros similares, es cuando exactamente para aplicar el algoritmo de retropropagación y cuando exactamente para actualizar los distintos pesos de las neuronas.
Existen dos métodos plausibles:
1) Retroalimentación y actualización de fotogramas
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.
o,
2) Retroalimentación y actualización por frases:
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.
Tenga en cuenta que esta es una pregunta general sobre el entrenamiento de RNN utilizando el documento de Graves como un ejemplo puntiagudo (y personalmente relevante): Cuando se entrenan RNNs en secuencias, ¿se aplica backprop en cada paso de tiempo? ¿Se ajustan los pesos en cada paso de tiempo? O, en una analogía poco precisa con el entrenamiento por lotes en arquitecturas estrictamente de avance, ¿se acumulan los errores y se promedian en una secuencia concreta antes de aplicar la retropropulsión y las actualizaciones de peso?
¿O estoy más confundido de lo que creo?