Uma Recurrent neural network (RNN) é uma arquitetura de Rede Neural que processa dados sequenciais, como palavra por palavra em uma frase ou informações através do tempo.
Algo notável na RNN é a capacidade de processar sequências independente do tamanho do vetor de entrada, não precisando ter um tamanho fixo para poder rodar a rede. Por exemplo, uma única rede poderia processar frases com 3, 5 ou 10 ou mais palavras.
Os tipos de arquitetura são como abaixo, onde a 'one to one' seria uma rede neural padrão, por exemplo, o exemplo da classificação de dígitos. Na 'one to many', um exemplo seria uma imagem como input, e output uma série de palavras formando uma legenda. Para a 'many to one', uma sequência de palavras como input e o output podendo ser o sentimento da frase. Numa arquitetura 'many to many', um exemplo seria tradução de texto.
Uma RNN é uma Rede neural normal que processa a informação através do tempo, assim, para poder interpretar os valores conforme passa o tempo
Em uma célula de RNN, as matrizes
Os neurônios podem ter qualquer função de ativação, mas o mais usado em uma RNN é a RELU para contrapor um dos problemas das RNNs, pois a derivada para valores positivos é 1, enquanto as derivadas de funções como a tangente hiperbólica e a sigmoide vão para 0 para argumentos muito grandes.
Na fase de propagar a informação, o input atual
Na fase de atualizar os pesos destas matrizes, há grandes problemas, se há uma sequência muito longa de
Se os valores forem maiores que 1, acaba produzindo a explosão do gradiente, que pode ser contornada com uma solução de "cortar o valor", reduzindo de fato numericamente o valor do gradiente para evitar isso.
Se os valores forem menores que 1, produz o desaparecimento do gradiente, não obtendo valores que façam aprender de fato, para contornar isso, há 3 formas úteis.
Este problema chamamos de Long-Term Dependencies, onde há uma dependência de tempo, no qual a rede precisa de vários inputs ao longo do tempo e acaba esquecendo de fato como prevêr os últimos inputs
1. Função de ativação: Usar RELU, no qual sua derivada é 1 na região positiva e 0 caso contrário, não produzindo resultados menores que 1 no gradiente na hora de atualizar. 2. Inicialização dos parâmetros: Inicializar as matrizes como a matriz identidade e bias igual a zero. 3. Células Portas: LSTM, GRU...
Uma das aplicações mais importantes para uma RNN, são as portas nas camadas ocultas, pelo qual elas evitam o desaparecimento do gradiente, fazendo com que possam aprender de forma eficaz grandes passagens no tempo.
Uma das portas implementadas mais simples e muito utilizadas nas RNNs é a LSTM.
Neste diagrama há 4 passos que consiste em uma célula LSTM;
-
Forget:
$f_t*C_{t-1}$ -
Store:
$+ i_t*\hat{C_t}$ -
Update:
$C_t$ -
Output:
$h_t$
Com esses 4 passos, a célula produz resultados que não farão desaparecer o gradiente e assim conduzir a informação para outras células de forma aprimorada.
Uma forma de ver isso é que
Há variações deste algorítmo, mas acabam por possuir pouca diferença dependendo da situações.
Este é um tipo de arquitetura que produz uma previsão com base na informação passada e futura, no qual o output $\hat{y}{t-1}$ é consequência das informações passadas de $h{t-1}$ e as futuras
Outro tipo de arquitetura onde a rede tem inputs, processa eles na fase de encode e no
É uma arquitetura de RNN que usa o output
É um modulo que faz com que a informação das RNN não perca informação quando tudo for mesclado em apenas um vetor
Alguns problemas que RNNs sofrem é por aprenderem com base em sequencias de informação, assim não podendo criar o paralelismo para poder treinar modelos, diminuindo sua velocidade de capacidade de aprendizagem.
Outro problema é com grandes informações que ao passar do tempo, podem criar a explosão ou desaparecimento do gradiente.