Redes neuronales recurrentes vs recursivas: ¿cuál es mejor para la PNL?

48

Hay redes neuronales recurrentes y redes neuronales recursivas. Ambos generalmente se denotan con el mismo acrónimo: RNN. Según Wikipedia , los NN recurrentes son de hecho NN recursivos, pero realmente no entiendo la explicación.

Además, no parece encontrar cuál es mejor (con ejemplos más o menos) para el procesamiento del lenguaje natural. El hecho es que, aunque Socher utiliza Recursive NN para PNL en su tutorial , no puedo encontrar una buena implementación de redes neuronales recursivas, y cuando busco en Google, la mayoría de las respuestas son sobre Recurrent NN.

Además de eso, ¿hay otro DNN que se aplique mejor para PNL, o depende de la tarea de PNL? ¿Redes de creencias profundas o autoencoders apilados? (Parece que no encuentro ninguna utilidad particular para ConvNets en PNL, y la mayoría de las implementaciones son con visión artificial en mente).

Finalmente, realmente preferiría las implementaciones de DNN para C ++ (mejor aún si tiene soporte para GPU) o Scala (mejor si tiene soporte para Spark) en lugar de Python o Matlab / Octave.

Intenté Deeplearning4j, pero está en constante desarrollo y la documentación está un poco desactualizada y parece que no puedo hacer que funcione. Lástima porque tiene la "caja negra" como una forma de hacer las cosas, muy parecida a scikit-learn o Weka, que es lo que realmente quiero.

crscardellino
fuente

Respuestas:

42

Las redes neuronales recurrentes son recurrentes con el tiempo. Por ejemplo si tienes una secuencia

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

Esta secuencia se alimenta a una sola neurona que tiene una única conexión consigo misma.

En el paso de tiempo 0, la letra 'h' se da como entrada. En el paso de tiempo 1, 'e' se da como entrada. La red cuando se despliega con el tiempo se verá así.

RNN

Una red recursiva es solo una generalización de una red recurrente. En una red recurrente, los pesos se comparten (y la dimensionalidad permanece constante) a lo largo de la secuencia porque, ¿cómo lidiaría con los pesos dependientes de la posición cuando encuentre una secuencia en el momento de la prueba de diferente longitud a cualquiera que haya visto en el tiempo del tren? . En una red recursiva, los pesos se comparten (y la dimensionalidad permanece constante) en cada nodo por la misma razón.

Esto significa que todos los pesos W_xh serán iguales (compartidos) y también lo será el peso W_hh. Esto es simplemente porque es una neurona única que se ha desplegado a tiempo.

Así es como se ve una red neuronal recursiva . Red neuronal recursiva

Es bastante simple ver por qué se llama una red neuronal recursiva. Los hijos de cada nodo padre son simplemente un nodo similar a ese nodo.

La red neuronal que desea utilizar depende de su uso. En el blog de Karpathy , él está generando personajes uno a la vez, por lo que una red neuronal recurrente es buena.

Pero si desea generar un árbol de análisis, utilizar una red neuronal recursiva es mejor porque ayuda a crear mejores representaciones jerárquicas.

Si quieres hacer un aprendizaje profundo en c ++, usa CUDA. Tiene una buena base de usuarios y es rápido. No sé más sobre eso, así que no puedo comentar más.

En Python, Theano es la mejor opción porque proporciona una diferenciación automática, lo que significa que cuando se forman NN grandes e incómodas, no es necesario encontrar gradientes a mano. Theano lo hace automáticamente por ti. Torch7 carece de esta característica.

Theano es muy rápido, ya que proporciona envoltorios en C para el código de Python y se puede implementar en GPU. También tiene una base de usuarios increíble, que es muy importante mientras aprendes algo nuevo.

Azrael
fuente
11

Las redes neuronales recurrentes grandes se consideran quizás el modelo más poderoso para la PNL. Un gran artículo escrito por A. Karpathy sobre redes neuronales recurrentes y modelado de nivel de personaje está disponible en http://karpathy.github.io/2015/05/21/rnn-effectiveness/

Después de haber probado una gran cantidad de bibliotecas para el aprendizaje profundo (theano, caffe, etc.). Sugeriría encarecidamente el uso de Torch7, que se considera la herramienta de vanguardia para NN y es compatible con NYU, Facebook AI y Google DeepMind. Torch7 se basa en lua y hay tantos ejemplos con los que puede familiarizarse fácilmente. Se puede encontrar mucho código en github, un buen comienzo sería https://github.com/wojzaremba/lstm .

Finalmente, la belleza de lua es que LuaJIT se puede inyectar muy fácilmente en Java, Python, Matlab, etc.

Yannis Assael
fuente
2
Sugerir leer el blog de Karpathy. Realmente entusiasta en la comprensión de RNN.
SolessChong
1

Las redes neuronales recurrentes (RNN) se desarrollan básicamente con el tiempo. Se utiliza para entradas secuenciales donde el factor tiempo es el principal factor diferenciador entre los elementos de la secuencia. Por ejemplo, aquí hay una red neuronal recurrente utilizada para modelar el lenguaje que se ha ido desarrollando a lo largo del tiempo. En cada paso de tiempo, además de la entrada del usuario en ese paso de tiempo, también acepta la salida de la capa oculta que se calculó en el paso de tiempo anterior.

RNN


Una red neuronal recursiva es más como una red jerárquica donde realmente no hay un aspecto de tiempo en la secuencia de entrada, pero la entrada debe procesarse jerárquicamente en forma de árbol. Aquí hay un ejemplo de cómo se ve una red neuronal recursiva. Muestra la forma de aprender un árbol de análisis de una oración tomando recursivamente el resultado de la operación realizada en un fragmento más pequeño del texto.

Redes neuronales recursivas


[ NOTA ]:

LSTM y GRU son dos tipos de RNN extendidos con la puerta de olvidar, que son muy comunes en PNL.

LSTM

LSTM y GRU


Fórmula de células LSTM:

ingrese la descripción de la imagen aquí

Benyamin Jafari
fuente