Em uma rede neural recorrente, você costuma encaminhar a propagação por várias etapas de tempo, "desenrolar" a rede e depois propagá-la pela sequência de entradas.
Por que você não atualiza apenas os pesos após cada etapa individual da sequência? (o equivalente a usar um comprimento de truncamento de 1, para que não haja nada para desenrolar) Isso elimina completamente o problema de gradiente de fuga, simplifica bastante o algoritmo, provavelmente reduziria as chances de ficar preso em mínimos locais e, o mais importante, parece funcionar bem . Treinei um modelo dessa maneira para gerar texto e os resultados pareciam comparáveis aos resultados dos modelos treinados pelo BPTT. Só estou confuso com isso, porque todo tutorial sobre RNNs que eu vi diz usar BPTT, quase como se fosse necessário para o aprendizado adequado, o que não é o caso.
Atualização: adicionei uma resposta
Respostas:
Edit: Eu cometi um grande erro ao comparar os dois métodos e tenho que mudar minha resposta. Acontece que eu estava fazendo isso, apenas voltando a propagação na etapa atual, realmente começa a aprender mais rápido. As atualizações rápidas aprendem os padrões mais básicos muito rapidamente. Mas em um conjunto de dados maior e com mais tempo de treinamento, o BPTT de fato sai por cima. Eu estava testando uma pequena amostra por apenas algumas épocas e presumi que quem começar a ganhar a corrida será o vencedor. Mas isso me levou a uma descoberta interessante. Se você iniciar a propagação de seu treinamento de volta apenas uma única etapa, mude para BPTT e aumente lentamente a distância de propagação, obtendo uma convergência mais rápida.
fonte
Uma RNN é uma Rede Neural Profunda (DNN), na qual cada camada pode receber novas entradas, mas tem os mesmos parâmetros. BPT é uma palavra chique para Propagação Traseira em uma rede que, por si só, é uma palavra chique para Gradient Descent.
Digamos que o RNN saídas Y t em cada passo e e r r o r t = ( y t - y t ) 2y^t
Para aprender os pesos, precisamos de gradientes para que a função responda à pergunta "quanto uma alteração no parâmetro afeta a função de perda?" e mova os parâmetros na direção dada por:
Ou seja, temos um DNN onde obtemos feedback sobre o quão boa é a previsão em cada camada. Como uma mudança no parâmetro alterará todas as camadas no DNN (timestep) e cada camada contribuirá para as próximas saídas, isso precisa ser levado em consideração.
Pegue uma rede simples de uma camada de neurônios e uma para ver isso de forma semi-explícita:
Com a um passo de treinamento taxa de aprendizagem é então: [ ~ um ~ b ~ cδ
Talvez cada passo contribua com uma direção bruta que seja suficiente em agregação? Isso poderia explicar seus resultados, mas eu estaria realmente interessado em saber mais sobre sua função de método / perda! Também estaria interessado em uma comparação com uma ANN com duas janelas com timestep.
edit4: Depois de ler os comentários, parece que sua arquitetura não é uma RNN.
Seu modelo: Sem estado - estado oculto reconstruído em cada etapaedit2: adicionou mais refs aos DNNs edit3: passo fixo corrigido e algumas notações edit5: corrigiu a interpretação do seu modelo após sua resposta / esclarecimento.fonte
fonte