Introducción a las redes neuronales recurrentes

Conocidas en inglés como Recurrent Neural Networks (RNNs) son un tipo de redes neuronales para procesar datos en forma de sucesiones, así como las redes convolucionales están especializadas para processar cuadrículas de valores, las RNNs están especializadas para procesar secuencias de valores x(1),,x(τ).

La idea que diferencia a ese tipo de redes con las redes multicapa simples es el hecho de compartir parámetros entre distintas partes de un modelo. Compartir parámetros permite extender y aplicar el modelo a ejemplos de distintas formas (diferentes longitudes, en este caso) y generalizar entre ellos. Si tuviéramos parámetros separados para cada valor del índice de tiempo, no podríamos generalizar a longitudes de secuencia no observadas durante el entrenamiento, ni compartir la solidez estadística entre distintas longitudes de secuencia y entre distintas posiciones en el tiempo. Tal uso compartido es particularmente importante cuando una pieza específica de información puede aparecer en múltiples posiciones dentro de la secuencia.

Esta idea también esta presente en las redes convolucionales ya que la salida de la convolución es una secuencia donde cada miembro de la salida es una función de un pequeño número de miembros vecinos de la entrada. En el caso de las RNNs cada miembro de la salida es una función de los miembros anteriores de la salida. Cada miembro de la salida se genera utilizando la misma regla de actualización aplicada a las salidas anteriores.

Una red neuronal recurrente se parece mucho a una red neuronal de propagación hacia adelante, excepto que también tiene conexiones que apuntan hacia atrás. Veamos la red neuronal recurrente más simple posible, compuesta por una neurona que recibe entradas, produce una salida y envía esa salida de regreso a sí misma. Como se muestra en siguiente imagen a la izquierda. En cada paso de tiempo t (también llamado marco (frame)), esta neurona recurrente recibe las entradas x(t) así como su propia salida del paso de tiempo anterior, y(t1). Dado que no hay una salida previa en el primer paso de tiempo, generalmente se establece en 0. Podemos representar esta pequeña red contra el eje del tiempo, como se muestra en la imagen a la derecha. Esto se llama desenrollar (unrolling) la red a través del tiempo (es la misma neurona recurrente representada una vez por paso de tiempo).

diagrama una neurona recurrente

Se puede crear fácilmente una capa de neuronas recurrentes. En cada paso de tiempo t, cada neurona recibe tanto el vector de entrada x(t) como el vector de salida del paso de tiempo anterior y(t1), como se muestra en la siguiente imagen. Observe que tanto las entradas como las salidas son vectores ahora (cuando había una sola neurona, la salida era un escalar).

diagrama de una capa de una red neuronal recurrente

Cada neurona recurrente tiene dos conjuntos de pesos: uno para las entradas x(t) y el otro para las salidas del paso de tiempo anterior, y(t1). Llamemos a estos vectores de peso wx y wy. Si consideramos toda la capa recurrente en lugar de solo una neurona recurrente, podemos colocar todos los vectores de peso en dos matrices de peso, Wx y Wy. El vector de salida de toda la capa recurrente se puede calcular prácticamente como se podría esperar, como se muestra en la siguiente ecuación (b es el vector de sesgos y ϕ() es la función de activación. y(t)=ϕ(WxTx(t)+WyTy(t1)+b) Al igual que con las redes neuronales de propagación hacia adelante, podemos calcular la salida de una capa recurrente de una sola vez para un minilote completo colocando todas las entradas en el paso de tiempo t en una matriz de entrada X(t) Y(t)=ϕ(X(t)Wx+Y(t1)Wy+b)=ϕ([X(t)Y(t1)]W+b) donde W=[WxWy]

Celdas de memoria

Dado que la salida de una neurona recurrente en el paso de tiempo t es una función de todas las entradas de los pasos de tiempo anteriores, se podría decir que tiene una forma de memoria. Una parte de una red neuronal que conserva algún estado a lo largo de los pasos de tiempo se denomina celda de memoria (o simplemente celda). Una sola neurona recurrente, o una capa de neuronas recurrentes, es una celda muy básica, capaz de aprender solo patrones cortos (normalmente de unos 10 pasos de longitud, pero esto varía según la tarea).

En general, el estado de una celda en el paso de tiempo t, denotado h(t) (la "h" es por "hidden" (oculto)), es una función de algunas entradas en ese paso de tiempo y su estado en el paso de tiempo anterior: h(t)=f(h(t1),x(t)). Su salida en el paso de tiempo t, denotada y(t), también es una función del estado anterior y de las entradas actuales. En el caso de las celdas básicas que hemos analizado hasta ahora, la salida es simplemente igual al estado, pero en celdas más complejas esto no siempre es así, como se muestra en la siguiente imagen.

diagrama del estado oculto de una neurona recurrente

Tipos de RNNs

Podemos diferenciar estas redes por el tipo de entrada y salida.

Secuencia a secuencia

Es útil para predecir series temporales como precios de acciones: se le ingresan los precios de los últimos N días y debe generar los precios desplazados un día hacia el futuro (es decir, desde hace N1 días hasta mañana). diagrama de rnn secuencia a secuencia

Secuencia a vector

Podrías alimentar a la red una secuencia de entradas e ignorar todas las salidas excepto la última. Por ejemplo, podrías alimentar a la red una secuencia de palabras correspondientes a una reseña de una película, y la red generaría un puntaje de sentimiento (por ejemplo, de -1 [odio] a +1 [amor]). diagrama de rnn secuencia a vector

Vector a secuencia

Podrías introducir en la red el mismo vector de entrada una y otra vez en cada paso de tiempo y dejar que genere una secuencia. Esta es una red de vector a secuencia. Por ejemplo, la entrada podría ser una imagen (o la salida de una CNN) y la salida podría ser un título para esa imagen. diagrama de rnn vector a secuencia

Secuencia a vector a secuencia

Podría tener una red de secuencia a vector, llamada codificador (encoder), seguida de una red de vector a secuencia, llamada decodificador (decoder). Por ejemplo, esto podría usarse para traducir una oración de un idioma a otro. Usted alimentaría a la red con una oración en un idioma, el codificador convertiría esta oración en una única representación vectorial y luego el decodificador decodificaría este vector en una oración en otro idioma. diagrama de rnn secuencia a vector a secuencia

Referencias