Posted on August 27, 2015
Recurrent Neural Networks
Los humanos no empiezan su pensamiento desde cero cada segundo. Mientras lees este ensayo, entiendes cada palabra basándote en tu comprensión de las palabras anteriores. No tiras todo a la basura y empiezas a pensar desde cero otra vez. Tus pensamientos tienen persistencia.
Las redes neuronales tradicionales no pueden hacer esto, y parece una deficiencia importante. Por ejemplo, imagina que quieres clasificar qué tipo de evento está ocurriendo en cada momento de una película. No está claro cómo una red neuronal tradicional podría utilizar su razonamiento sobre los eventos anteriores de la película para informar sobre los posteriores.
Las redes neuronales recurrentes abordan este problema. Son redes con bucles en ellas, permitiendo que la información persista.
En el diagrama anterior, un trozo de red neuronal, \(A\), mira alguna entrada \(x_t\) y emite un valor \(h_t\). Un bucle permite pasar información de un paso de la red al siguiente.
Estos bucles hacen que las redes neuronales recurrentes parezcan algo misteriosas. Sin embargo, si se piensa un poco más, resulta que no son tan diferentes de una red neuronal normal. Una red neuronal recurrente puede considerarse como múltiples copias de la misma red, cada una de las cuales pasa un mensaje a su sucesora. Consideremos lo que ocurre si desenrollamos el bucle:
Esta naturaleza de cadena revela que las redes neuronales recurrentes están íntimamente relacionadas con las secuencias y las listas. Son la arquitectura natural de las redes neuronales para usar esos datos.
¡Y ciertamente se usan! En los últimos años, ha habido un éxito increíble aplicando las RNN a una gran variedad de problemas: reconocimiento del habla, modelado del lenguaje, traducción, subtitulación de imágenes… La lista continúa. Dejaré la discusión de las increíbles hazañas que se pueden lograr con las RNN para el excelente artículo del blog de Andrej Karpathy, The Unreasonable Effectiveness of Recurrent Neural Networks. Pero son realmente sorprendentes.
Esencial para estos éxitos es el uso de «LSTMs», un tipo muy especial de red neuronal recurrente que funciona, para muchas tareas, mucho mejor que la versión estándar. Casi todos los resultados interesantes basados en redes neuronales recurrentes se consiguen con ellas. Son estas LSTM las que explorará este ensayo.
El problema de las dependencias a largo plazo
Una de las atracciones de las RNN es la idea de que podrían ser capaces de conectar la información anterior con la tarea actual, como el uso de fotogramas de vídeo anteriores podría informar la comprensión del fotograma actual. Si las RNN pudieran hacer esto, serían extremadamente útiles. ¿Pero pueden hacerlo? Depende.
A veces, sólo necesitamos mirar la información reciente para realizar la tarea presente. Por ejemplo, consideremos un modelo lingüístico que intenta predecir la siguiente palabra basándose en las anteriores. Si intentamos predecir la última palabra de «las nubes están en el cielo», no necesitamos más contexto: es bastante obvio que la siguiente palabra será cielo. En estos casos, en los que la distancia entre la información relevante y el lugar en el que se necesita es pequeña, las RNN pueden aprender a utilizar la información pasada.
Pero también hay casos en los que necesitamos más contexto. Considere la posibilidad de intentar predecir la última palabra del texto «Me crié en Francia… hablo francés con fluidez». La información reciente sugiere que la siguiente palabra es probablemente el nombre de un idioma, pero si queremos acotar qué idioma, necesitamos el contexto de Francia, desde más atrás. Es totalmente posible que la brecha entre la información relevante y el punto en el que se necesita sea muy grande.
Desgraciadamente, a medida que esa brecha crece, las RNN son incapaces de aprender a conectar la información.
En teoría, las RNN son absolutamente capaces de manejar esas «dependencias a largo plazo». Un humano podría elegir cuidadosamente los parámetros para que resolvieran problemas de juguete de este tipo. Lamentablemente, en la práctica, las RNN no parecen ser capaces de aprenderlas. El problema fue explorado en profundidad por Hochreiter (1991) y Bengio, et al. (1994), quienes encontraron algunas razones fundamentales por las que podría ser difícil.
¡Afortunadamente, las LSTMs no tienen este problema!
Redes LSTM
Las redes de memoria a largo plazo – normalmente llamadas simplemente «LSTMs» – son un tipo especial de RNN, capaces de aprender dependencias a largo plazo. Fueron introducidas por Hochreiter & Schmidhuber (1997), y fueron refinadas y popularizadas por mucha gente en trabajos posteriores.1 Funcionan tremendamente bien en una gran variedad de problemas, y ahora son ampliamente utilizadas.
Las LSTMs están explícitamente diseñadas para evitar el problema de la dependencia a largo plazo. Recordar información durante largos periodos de tiempo es prácticamente su comportamiento por defecto, no algo que les cueste aprender.
Todas las redes neuronales recurrentes tienen la forma de una cadena de módulos de red neuronal que se repiten. En las RNN estándar, este módulo de repetición tendrá una estructura muy simple, como una sola capa tanh.
LSTMs también tienen esta estructura similar a la de una cadena, pero el módulo de repetición tiene una estructura diferente. En lugar de tener una sola capa de red neuronal, hay cuatro, que interactúan de una manera muy especial.
No te preocupes por los detalles de lo que sucede. Más adelante veremos el diagrama LSTM paso a paso. Por ahora, vamos a tratar de sentirnos cómodos con la notación que vamos a utilizar.
En el diagrama anterior, cada línea lleva un vector completo, desde la salida de un nodo a las entradas de otros. Los círculos rosas representan operaciones puntuales, como la suma de vectores, mientras que los recuadros amarillos son capas de la red neuronal aprendidas. Las líneas que se fusionan denotan concatenación, mientras que una línea que se bifurca denota que su contenido se copia y las copias van a diferentes lugares.
La idea central detrás de las LSTM
La clave de las LSTM es el estado de la célula, la línea horizontal que atraviesa la parte superior del diagrama.
El estado de la célula es una especie de cinta transportadora. Corre en línea recta por toda la cadena, con sólo algunas interacciones lineales menores. Es muy fácil que la información fluya a lo largo de ella sin cambios.
La LSTM tiene la capacidad de eliminar o añadir información al estado de la célula, cuidadosamente regulada por estructuras llamadas puertas.
Las puertas son una forma de dejar pasar información opcionalmente. Están compuestas por una capa de red neuronal sigmoide y una operación de multiplicación puntual.
La capa sigmoide produce números entre cero y uno, que describen la cantidad de cada componente que se debe dejar pasar. Un valor de cero significa «no dejar pasar nada», mientras que un valor de uno significa «dejar pasar todo».
Una LSTM tiene tres de estas puertas, para proteger y controlar el estado de la célula.
Paso a paso de la LSTM
El primer paso en nuestra LSTM es decidir qué información vamos a desechar del estado de la célula. Esta decisión la toma una capa sigmoidea llamada «capa de puerta de olvido». Se ve en \ (h_{t-1}\) y \ (x_t\), y las salidas de un número entre \ (0\) y \ (1\) para cada número en el estado de la célula \ (C_{t-1}\). Un \(1\) representa «mantener completamente esto», mientras que un \(0\) representa «deshacerse completamente de esto.»
Volvamos a nuestro ejemplo de un modelo de lenguaje tratando de predecir la siguiente palabra basada en todas las anteriores. En un problema de este tipo, el estado de la celda podría incluir el género del sujeto actual, para poder utilizar los pronombres correctos. Cuando vemos un nuevo sujeto, queremos olvidar el género del sujeto anterior.
El siguiente paso es decidir qué información nueva vamos a almacenar en el estado de la celda. Esto tiene dos partes. Primero, una capa sigmoidea llamada «capa de entrada» decide qué valores vamos a actualizar. A continuación, una capa tanh crea un vector de nuevos valores candidatos, \tilde{C}_t\), que podrían añadirse al estado. En el siguiente paso, vamos a combinar estos dos para crear una actualización del estado.
En el ejemplo de nuestro modelo de lenguaje, querríamos añadir el género del nuevo sujeto al estado de la célula, para reemplazar el antiguo que estamos olvidando.
Ahora es el momento de actualizar el antiguo estado de la célula, \(C_{t-1}\), en el nuevo estado de la célula \(C_t\). Los pasos anteriores ya decidieron qué hacer, sólo tenemos que hacerlo realmente.
Multiplicamos el estado antiguo por \(f_t\), olvidando las cosas que decidimos olvidar antes. A continuación, añadimos \(i_t*\tilde{C}_t). Estos son los nuevos valores candidatos, escalados por lo que decidimos actualizar cada valor de estado.
En el caso del modelo de lenguaje, aquí es donde realmente dejaríamos la información sobre el género del antiguo sujeto y añadiríamos la nueva información, como decidimos en los pasos anteriores.
Por último, tenemos que decidir lo que vamos a emitir. Esta salida se basará en el estado de nuestra celda, pero será una versión filtrada. Primero, ejecutamos una capa sigmoidea que decide qué partes del estado de la célula vamos a emitir. A continuación, ponemos el estado de la célula a través de \(\tanh\) (para empujar los valores para estar entre \(-1\) y \(1\)) y se multiplican por la salida de la puerta sigmoide, por lo que sólo la salida de las partes que decidimos.
Para el ejemplo del modelo de lenguaje, ya que acaba de ver un sujeto, es posible que desee la salida de la información pertinente a un verbo, en caso de que eso es lo que viene a continuación. Por ejemplo, podría emitir si el sujeto es singular o plural, para que sepamos en qué forma debe conjugarse un verbo si eso es lo que sigue.
Variantes de la memoria a largo plazo
Lo que he descrito hasta ahora es una LSTM bastante normal. Pero no todas las LSTM son iguales a las anteriores. De hecho, parece que casi todos los artículos sobre LSTMs utilizan una versión ligeramente diferente. Las diferencias son menores, pero vale la pena mencionar algunas de ellas.
Una variante popular de LSTM, introducida por Gers & Schmidhuber (2000), es añadir «conexiones de mirilla». Esto significa que dejamos que las capas de compuertas miren el estado de la célula.
El diagrama anterior añade mirillas a todas las compuertas, pero muchos trabajos darán algunas mirillas y otras no.
Otra variante es utilizar compuertas de olvido y de entrada acopladas. En lugar de decidir por separado qué olvidar y a qué debemos añadir nueva información, tomamos esas decisiones conjuntamente. Sólo olvidamos cuando vamos a introducir algo en su lugar. Sólo introducimos nuevos valores en el estado cuando olvidamos algo más antiguo.
Una variación ligeramente más dramática de la LSTM es la Unidad Recurrente Cerrada, o GRU, introducida por Cho, et al. (2014). Combina las puertas de olvido y de entrada en una sola «puerta de actualización». También fusiona el estado de la célula y el estado oculto, y realiza algunos otros cambios. El modelo resultante es más simple que los modelos LSTM estándar, y ha ido ganando popularidad.
Estas son solo algunas de las variantes de LSTM más notables. Hay muchas otras, como Depth Gated RNNs de Yao, et al. (2015). También hay algún enfoque completamente diferente para abordar las dependencias a largo plazo, como Clockwork RNNs de Koutnik, et al. (2014).
¿Cuál de estas variantes es la mejor? ¿Importan las diferencias? Greff, et al. (2015) hacen una buena comparación de las variantes populares, encontrando que todas son más o menos iguales. Jozefowicz, et al. (2015) probaron más de diez mil arquitecturas RNN, encontrando algunas que funcionaban mejor que las LSTM en ciertas tareas.
Conclusión
Antes mencioné los notables resultados que la gente está logrando con las RNN. Esencialmente, todos ellos se logran utilizando LSTMs. Realmente funcionan mucho mejor para la mayoría de las tareas
Escritos como un conjunto de ecuaciones, los LSTMs parecen bastante intimidantes. Esperemos que el recorrido paso a paso en este ensayo los haya hecho un poco más accesibles.
Las LSTMs fueron un gran paso en lo que podemos lograr con las RNN. Es natural preguntarse: ¿hay otro gran paso? Una opinión común entre los investigadores es: «¡Sí! ¡Hay un siguiente paso y es la atención!» La idea es dejar que cada paso de una RNN escoja información para mirar de alguna colección más grande de información. Por ejemplo, si se utiliza una RNN para crear un pie de foto que describa una imagen, podría escoger una parte de la imagen para mirarla por cada palabra que emita. De hecho, Xu, et al. (2015) hacen exactamente esto – ¡podría ser un punto de partida divertido si quieres explorar la atención! Ha habido una serie de resultados realmente emocionantes utilizando la atención, y parece que hay muchos más a la vuelta de la esquina…
La atención no es el único hilo conductor emocionante en la investigación de las RNN. Por ejemplo, las Grid LSTMs de Kalchbrenner, et al. (2015) parecen extremadamente prometedoras. Los trabajos que utilizan RNNs en modelos generativos – como Gregor, et al. (2015), Chung, et al. (2015), o Bayer & Osendorfer (2015)- también parecen muy interesantes. Los últimos años han sido una época apasionante para las redes neuronales recurrentes, ¡y los próximos prometen serlo aún más!
Agradecimientos
Agradezco a varias personas que me han ayudado a entender mejor las LSTM, que han comentado las visualizaciones y que han aportado sus comentarios a este post.
Estoy muy agradecido a mis colegas de Google por sus útiles comentarios, especialmente a Oriol Vinyals, Greg Corrado, Jon Shlens, Luke Vilnis e Ilya Sutskever. También doy las gracias a muchos otros amigos y colegas por dedicar su tiempo a ayudarme, como Dario Amodei y Jacob Steinhardt. Estoy especialmente agradecido a Kyunghyun Cho por su correspondencia extremadamente reflexiva sobre mis diagramas.
Antes de este post, practiqué la explicación de las LSTM durante dos series de seminarios que impartí sobre redes neuronales. Gracias a todos los que participaron en ellos por su paciencia conmigo, y por sus comentarios.
-
Además de los autores originales, mucha gente contribuyó al LSTM moderno. Una lista no exhaustiva es: Felix Gers, Fred Cummins, Santiago Fernández, Justin Bayer, Daan Wierstra, Julian Togelius, Faustino Gómez, Matteo Gagliolo y Alex Graves.