Redes neurais recorrentes versus redes neurais recursivas: Qual é melhor para a PNL?

48

Existem redes neurais recorrentes e redes neurais recursivas. Ambos são geralmente indicados pela mesma sigla: RNN. Segundo a Wikipedia , o NN recorrente é de fato o NN recursivo, mas eu realmente não entendo a explicação.

Além disso, não acho o que é melhor (com exemplos ou mais) para o Processamento de linguagem natural. O fato é que, embora Socher use NN recursivo para PNL em seu tutorial , não consigo encontrar uma boa implementação de redes neurais recursivas e, quando pesquiso no Google, a maioria das respostas é sobre NN recorrente.

Além disso, existe outro DNN que se aplica melhor à PNL ou depende da tarefa da PNL? Redes de crenças profundas ou Autoencoders empilhados? (Parece que não encontro nenhum utilitário específico para ConvNets na PNL, e a maioria das implementações é com visão de máquina em mente).

Finalmente, eu realmente preferiria implementações DNN para C ++ (melhor ainda se tiver suporte a GPU) ou Scala (melhor se tiver suporte a Spark) em vez de Python ou Matlab / Octave.

Eu tentei o Deeplearning4j, mas está em constante desenvolvimento e a documentação está um pouco desatualizada e não consigo fazê-lo funcionar. Pena que tem a maneira de fazer as coisas da "caixa preta", muito parecido com o scikit-learn ou Weka, que é o que eu realmente quero.

crscardellino
fonte

Respostas:

42

Redes neurais recorrentes são recorrentes ao longo do tempo. Por exemplo, se você tiver uma sequência

x = ['h', 'e', ​​'l', 'l']

Essa sequência é alimentada a um único neurônio que possui uma única conexão consigo mesmo.

No passo 0 do tempo, a letra 'h' é fornecida como entrada.No passo 1, 'e' é fornecida como entrada. A rede, quando desdobrada ao longo do tempo, terá esta aparência.

RNN

Uma rede recursiva é apenas uma generalização de uma rede recorrente. Em uma rede recorrente, os pesos são compartilhados (e a dimensionalidade permanece constante) ao longo do comprimento da sequência, porque como você lida com pesos dependentes da posição quando encontra uma sequência no tempo de teste de comprimento diferente daquele que você viu no tempo do trem . Em uma rede recursiva, os pesos são compartilhados (e a dimensionalidade permanece constante) em cada nó pelo mesmo motivo.

Isso significa que todos os pesos W_xh serão iguais (compartilhados) e também será o peso W_hh. Isto é simplesmente porque é um único neurônio que foi desdobrado com o tempo.

É assim que uma Rede Neural Recursiva se parece. Rede Neural Recursiva

É bastante simples ver por que é chamada de Rede Neural Recursiva. Os filhos de cada nó pai são simplesmente um nó semelhante a esse nó.

A rede neural que você deseja usar depende do seu uso. No blog de Karpathy , ele está gerando caracteres um de cada vez, para que uma rede neural recorrente seja boa.

Mas se você deseja gerar uma árvore de análise, o uso de uma Rede Neural Recursiva é melhor porque ajuda a criar melhores representações hierárquicas.

Se você deseja fazer um aprendizado profundo em c ++, use o CUDA. Tem uma boa base de usuários e é rápido. Eu não sei mais sobre isso, então não posso comentar mais.

No python, o Theano é a melhor opção, pois fornece diferenciação automática, o que significa que, quando você está formando NNs grandes e estranhos, não precisa encontrar gradientes manualmente. O Theano faz isso automaticamente para você. Esse recurso não possui o Torch7.

O Theano é muito rápido, pois fornece wrappers C para código python e pode ser implementado em GPUs. Ele também possui uma incrível base de usuários, o que é muito importante para aprender algo novo.

Azrael
fonte
11

As grandes redes neurais recorrentes são consideradas talvez o modelo mais poderoso para a PNL. Um ótimo artigo escrito por A. Karpathy em Redes Neurais Recorrentes e modelagem em nível de personagem está disponível em http://karpathy.github.io/2015/05/21/rnn-effectiveness/

Tendo tentado um grande número de bibliotecas para aprendizado profundo (theano, caffe etc.). Eu sugeriria fortemente o uso do Torch7, que é considerado a ferramenta de ponta para NNs e é suportado pela NYU, Facebook AI e Google DeepMind. O Torch7 é baseado em lua e existem muitos exemplos com os quais você pode se familiarizar facilmente. Muitos códigos podem ser encontrados no github, um bom começo seria https://github.com/wojzaremba/lstm .

Finalmente, a beleza de lua é que LuaJIT pode ser injetado com muita facilidade em Java, Python, Matlab etc.

Yannis Assael
fonte
2
Sugira a leitura do blog de Karpathy. Realmente útil para entender a RNN.
SolessChong
1

Redes Neurais Recorrentes (RNN) basicamente se desdobram ao longo do tempo. É usado para entradas seqüenciais em que o fator tempo é o principal fator diferenciador entre os elementos da sequência. Por exemplo, aqui está uma rede neural recorrente usada para modelagem de linguagem que foi desenvolvida ao longo do tempo. Em cada etapa do tempo, além da entrada do usuário nessa etapa, ele também aceita a saída da camada oculta que foi calculada na etapa anterior.

RNN


Uma rede neural recursiva é mais como uma rede hierárquica em que não há realmente nenhum aspecto de tempo na sequência de entrada, mas a entrada deve ser processada hierarquicamente em forma de árvore. Aqui está um exemplo de como uma rede neural recursiva se parece. Ele mostra a maneira de aprender uma árvore de análise de uma sentença, recursivamente, obtendo a saída da operação executada em um pedaço menor do texto.

Redes Neurais Recursivas


[ NOTA ]:

LSTM e GRU são dois tipos de RNNs estendidos com o gate forget, que são altamente comuns na PNL.

LSTM

LSTM e GRU


Fórmula de células LSTM:

insira a descrição da imagem aqui

Benyamin Jafari
fonte