Essa questão atinge algumas qualidades muito importantes de RNNs e DNNs em geral. Responderei a cada uma das suas sub-perguntas, embora não na mesma ordem (tentarei destacar onde faço)
Compartilhamento de parâmetros
Primeiro, a qualidade mais importante das RNNs é chamada de compartilhamento de parâmetros . Dados sequenciais são normalmente inseridos em camadas separadas. Para uma entrada de comprimento 20, uma rede RNN teria 20 camadas. Os mesmos parâmetros internos são usados para cada camada, portanto, todas as 20 camadas usam os mesmos pesosW e preconceito b. Compare isso com um perceptron de múltiplas camadas que teria 20 pesos e desvios separados.
O compartilhamento de parâmetros tem vários benefícios:
- Agora temos muito menos parâmetros. Há 1 bloco repetido em vez de 20 camadas separadas. Uma redução de 20x!
- Isso multiplica efetivamente os dados de treinamento. A camada recorrente começa a aprender com cada palavra em uma única frase de exemplo, enquanto cada camada em um MLP aprende com uma única palavra por frase.
- Nossa rede agora é muito mais flexível. Podemos treinar frases com até 20 palavras e, em seguida, generalizar para uma frase com 25 palavras, adicionando mais etapas ou usando um RNN dinâmico
Arquitetura de rede
Você pergunta sobre ativações tanh e sigmóide. Para responder a isso, precisamos falar sobre arquiteturas RNN específicas. O RNN simples discutido acima tem uma única ativação. RNNs simples tendem a criar o problema de gradientes de fuga (ou explosão!) Devido à aplicação repetida dos mesmos pesos e função de ativação.
Blocos RNN bloqueados (como GRUs e LSTMs) usam mecanismos de bloqueio para passar ativações para dentro e fora da memória e combinar estados de memória com entrada para gerar a saída de cada bloco. Por esse motivo, os portões podem impedir que o gradiente se propague para trás. Sigmoid é uma função de ativação comum para portões, porque esmaga as ativações para (0,1) --- 0 para completamente a ativação e 1 permite que ela passe. Qualquer função de ativação decente com um perfil de compressão semelhante funciona, no entanto. Curiosamente, sigmoide duro é bastante comum nos dias de hoje.
Além dos portões, os blocos RNN fechados têm um estado interno para o qual a ativação varia bastante. Como o gating limita o gradiente backprop, temos muita flexibilidade nessa ativação. Não precisa ser esmagado, por exemplo, e é aqui que as ativações retificadoras (relu, elu, islu, etc.) são frequentemente vistas. Tanh também é uma escolha perfeitamente sensata.
Com relação a vieses e pesos, cada ativação em uma célula RNN geralmente tem seu próprio peso e viés. Portanto, uma GRU possui 3 ativações (ocultas, atualizadas e redefinidas) e cada uma possui seu próprio peso e tendência. No entanto, lembre-se de que, como RNN, cada um deles é reutilizado para cada passo de tempo.
Retrocesso
Isso cobre a passagem direta muito bem, mas você também faz uma pergunta importante sobre como o erro se propaga para trás. Existem dois métodos para abordar isso.
Forçar professor
Para RNNs que produzem uma previsão a cada etapa do tempo (como prever o resultado das etapas a seguir, tradução ou reconhecimento de fonemas), a obrigatoriedade do professor é um método para isolar cada etapa da RNN. Ao remover essas dependências, o Teacher Forcing permite que a RNN use backprop convencional com a regra de cadeia.
Mas como isso funciona? As redes de forçadores de professores têm arquiteturas de trem e teste separadas. Para treinamento, a cada passot, a entrada xt é concatenado com o destino anterior, yt - 1. Imagine isso para uma rede encarregada de prever o seguinte caractere. A rede acabou de tentar prever o caractere para o timestep anterior. Mas, em vez disso, usamos o caractere observado nesse momento (sabemos disso porque estamos na fase de treinamento). Assim, o erro na timestept depende apenas do valor observado em t - 1 e a entrada em t. Assim, removemos quaisquer conexões ao longo do tempo da rede.
No teste, não sabemos o valor real a cada passo do tempo, então substituímos yt - 1 com a saída da camada anterior ot - 1. Nesse caso, as conexões temporais retornaram, mas apenas para a fase de teste.
Back Propagation Through Time
Mas não precisamos recorrer à força do professor. A propagação de retorno ao longo do tempo nos permite aplicar o algoritmo de backprop às RNNs. Considere a rede comn timesteps e uma entrada xestado oculto h, resultado oe valor observado y para cada timestep.
O BPTT funciona nas seguintes etapas.
- Calcular o gradiente ∇ot para cada ot,ytpar. (Isso pode ser feito de uma só vez.)
- Calcular o gradiente ∇htpara cada timestep, começando com o último timestep e trabalhando iterativamente para trás. (Isso deve ser feito um de cada vez.)
- Isso nos dá n arestas para cada parâmetro interno de nossa RNN. O truque para atualizar os parâmetros é encontrar a contribuição do gradiente para cada passo de tempo (por exemplo,∇Wt mesmo que tenhamos apenas um W) e, em seguida, somando esses gradientes para atualizar os parâmetros internos.
Leitura adicional
Eu recomendo o capítulo 10 do Deep Learning de Goodfellow, Bengio e Courville para obter mais informações sobre RNNs. Além disso, o livro RNN da Graves é fantástico para detalhes de nível superior