Estou tentando entender a aplicação de alto nível das RNNs para rotular sequências via (entre outros) o artigo de Graves, de 2005, sobre classificação de fonemas.
Para resumir o problema: Temos um grande conjunto de treinamento que consiste em arquivos de áudio (de entrada) de frases únicas e horários de início rotulados por especialistas, horários de parada e rótulos de fonemas individuais (incluindo alguns fonemas "especiais", como silêncio, de modo que cada amostra em cada arquivo de áudio seja rotulada com algum símbolo de fonema.)
O objetivo do papel é aplicar um RNN com células de memória LSTM na camada oculta a esse problema. (Ele aplica várias variantes e várias outras técnicas como comparação. No momento, só estou interessado no LSTM unidirecional, para manter as coisas simples.)
Eu acredito que entendo a arquitetura da rede: Uma camada de entrada correspondente a janelas de 10 ms dos arquivos de áudio, pré-processadas de maneira padrão para o trabalho de áudio; uma camada oculta de células LSTM e uma camada de saída com um código quente de todos os 61 símbolos de telefone possíveis.
Acredito que compreendo as equações (intrincadas, mas diretas) da passagem para frente e para trás através das unidades LSTM. Eles são apenas cálculo e a regra da cadeia.
O que eu não entendo, depois de ler este artigo e vários similares várias vezes, é quando exatamente aplicar o algoritmo de retropropagação e quando exatamente atualizar os vários pesos nos neurônios.
Existem dois métodos plausíveis:
1) Backprop frame-wise e atualização
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.
ou,
2) Backprop sentimental e atualização:
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.
Observe que esta é uma pergunta geral sobre o treinamento da RNN usando o artigo de Graves como um exemplo apontado (e pessoalmente relevante): Ao treinar RNNs em sequências, o backprop é aplicado a cada passo do tempo? Os pesos são ajustados a cada passo do tempo? Ou, em uma analogia frouxa ao treinamento em lote em arquiteturas estritamente feed-forward, são acumulados erros e calculados a média de uma sequência específica antes da aplicação das atualizações de backprop e peso?
Ou estou ainda mais confuso do que penso?