Tutorial de RNN (Rede Neuronal Recurrente): Ejemplo de TensorFlow

¿Qué necesitamos un RNN?

La estructura de una red neuronal artificial es relativamente simple y se refiere principalmente a la multiplicación de matrice. Durante el primer paso, las entradas se multiplican por pesos inicialmente aleatorios, y sesgo, transformados con una función de activación y los valores de salida se utilizan para hacer una predicción. Este paso da una idea de lo lejos que está la red de la realidad.

La métrica aplicada es la pérdida. Cuanto mayor sea la función de pérdida, más tonto es el modelo. Para mejorar el conocimiento de la red, se requiere cierta optimización ajustando los pesos de la red. El descenso de gradiente estocástico es el método empleado para cambiar los valores de los pesos en la dirección de los derechos. Una vez realizado el ajuste, la red puede utilizar otro lote de datos para probar sus nuevos conocimientos.

El error, afortunadamente, es más bajo que antes, pero no lo suficientemente pequeño. El paso de optimización se realiza iterativamente hasta que se minimiza el error, es decir, no se puede extraer más información.

El problema con este tipo de modelo es que no tiene memoria. Significa que la entrada y la salida son independientes. En otras palabras, al modelo no le importa lo que vino antes. Plantea alguna pregunta cuando necesita predecir series temporales o oraciones porque la red necesita tener información sobre los datos históricos o palabras pasadas.

Para superar este problema, se ha desarrollado un nuevo tipo de arquitectura: Red neuronal recurrente (RNN en adelante)

En este tutorial, usted aprenderá.

¿Qué es RNN?

Una red neuronal recurrente se ve bastante similar a una red neuronal tradicional, excepto que se agrega un estado de memoria a las neuronas. El cálculo para incluir una memoria es simple.

Imagine un modelo simple con una sola neurona alimentada por un lote de datos. En una red neuronal tradicional, el modelo produce la salida multiplicando la entrada con el peso y la función de activación. Con un RNN, esta salida se envía de nuevo a sí mismo número de tiempo. Llamamos timestep la cantidad de tiempo que la salida se convierte en la entrada de la siguiente multiplicación matrice.

Por ejemplo, en la imagen de abajo, se puede ver que la red está compuesta por una neurona. La red calcula la multiplicación de matrices entre la entrada y el peso y añade no linealidad con la función de activación. Se convierte en la salida en t-1. Esta salida es la entrada de la segunda multiplicación de matrices.

A continuación, codificamos un RNN simple en tensorflow para entender el paso y también la forma de la salida.

La red se compone de:

  • Cuatro entradas
  • Seis neuronas
  • Pasos en 2 tiempos

La red procederá tal y como se muestra en la imagen de abajo.

La red se llama “recurrente” porque realiza la misma operación en cada cuadrado de activación. La red calculó los pesos de las entradas y la salida anterior antes de utilizar una función de activación.

Podemos construir la red con un marcador de posición para los datos, la etapa recurrente y la salida.

  1. Definir el marcador de posición para los datos

Aquí:

  • Ninguno: desconocido y tomará el tamaño del lote
  • n_timesteps: Número de veces que la red enviará la salida de vuelta a la neurona
  • n_inputs: Número de entradas por lote
  1. Definir la red recurrente

Como se mencionó en la imagen anterior, la red se compone de 6 neuronas. La red calculará dos productos de punto:

  • Datos de entrada con el primer conjunto de pesos (es decir, 6: igual al número de neuronas)
  • Salida anterior con un segundo conjunto de pesos (es decir, 6: correspondiente al número de salida)

Tenga en cuenta que, durante el primer avance, los valores de la salida anterior son iguales a ceros porque no tenemos ningún valor disponible.

El objeto para construir un RNN es tf.contrib.rnn.BasicRnCell con el argumento num_units para definir el número de entrada

Ahora que la red está definida, puede calcular las salidas y estados

Este objeto utiliza un bucle interno para multiplicar las matrices el número apropiado de veces.

Tenga en cuenta que la neurona recurente es una función de todas las entradas de los pasos de tiempo anteriores. Así es como la red construye su propia memoria. La información del tiempo anterior se puede propagar en el futuro. Esta es la magia de la red neuronal recurrente

Para fines explicativos, imprime los valores del estado anterior. La salida impresa arriba muestra la salida del último estado. Ahora imprime toda la salida, puede notar que los estados son la salida anterior de cada lote. Es decir, la salida anterior contiene la información sobre toda la secuencia.e

La salida tiene la forma de (3, 2, 6):

  • 3: Número de lotes
  • 2: Número del registro de tiempo
  • 6: Número de neuronas

La optimización de una red neuronal recurrente es idéntica a una red neuronal tradicional. Verá con más detalle cómo codificar la optimización en la siguiente parte de este tutorial.

Aplicaciones de RNN

RNN tiene múltiples usos, especialmente cuando se trata de predecir el futuro. En el sector financiero, RNN puede ser útil para predecir los precios de las acciones o el signo de la dirección del mercado de valores (es decir, positivo o negativo).

RNN es útil para un coche autónomo, ya que puede evitar un accidente automovilístico anticipando la trayectoria del vehículo.

RNN es ampliamente utilizado en análisis de texto, subtítulos de imágenes, análisis de sentimientos y traducción automática. Por ejemplo, se puede utilizar una revisión de película para entender la sensación que el espectador percibió después de ver la película. Automatizar esta tarea es muy útil cuando la compañía cinematográfica no tiene tiempo suficiente para revisar, etiquetar, consolidar y analizar las revisiones. La máquina puede hacer el trabajo con un mayor nivel de precisión.

Limitaciones de RNN

En teoría, se supone que RNN lleva la información hasta el tiempo. Sin embargo, es bastante difícil propagar toda esta información cuando el paso de tiempo es demasiado largo. Cuando una red tiene demasiadas capas profundas, se vuelve inentrenable. Este problema se llama: problema de gradiente de fuga. Si recuerda, la red neuronal actualiza el peso usando el algoritmo de descenso de gradiente. Los gradientes se vuelven más pequeños cuando la red avanza hacia abajo a las capas inferiores.

En conclusión, los gradientes permanecen constantes, lo que significa que no hay espacio para mejorar. El modelo aprende de un cambio en el degradado; este cambio afecta a la salida de la red. Sin embargo, si la diferencia en el gradiente es demasiado pequeña (es decir, los pesos cambian un poco), la red no puede aprender nada y, por lo tanto, la salida. Por lo tanto, una red que enfrenta un problema de gradiente de fuga no puede converger hacia una buena solución.

Mejora LSTM

Para superar el problema potencial del gradiente de fuga que enfrenta RNN, tres investigadores, Hochreiter, Schmidhuber y Bengio mejoraron el RNN con una arquitectura llamada Memoria Larga a Corto Plazo (LSTM). En resumen, LSMT proporciona a la red información relevante del pasado a tiempo más reciente. La máquina utiliza una mejor arquitectura para seleccionar y llevar la información a tiempo posterior.

La arquitectura LSTM está disponible en TensorFlow, Tf.contrib.rnn.lstmcell. LSTM está fuera del alcance del tutorial. Puede consultar la documentación oficial para obtener más información

RNN en series temporales

En este tutorial, utilizará un RNN con datos de series de tiempo. Las series temporales dependen del tiempo anterior, lo que significa que los valores pasados incluyen información relevante de la que la red puede aprender. La idea detrás de la predicción de series temporales es estimar el valor futuro de una serie, digamos, el precio de las acciones, la temperatura, el PIB, etc.

La preparación de datos para RNN y series temporales puede ser un poco complicada. En primer lugar, el objetivo es predecir el siguiente valor de la serie, es decir, utilizará la información anterior para estimar el valor en t + 1. La etiqueta es igual a la secuencia de entrada y se desplaza un punto por delante. En segundo lugar, el número de entrada se establece en 1, es decir, una observación por vez. Por último, el paso de tiempo es igual a la secuencia del valor numérico. Por ejemplo, si establece el paso de tiempo en 10, la secuencia de entrada devolverá diez veces consecutivas.

Mira el gráfico a continuación, hemos representado los datos de series de tiempo a la izquierda y una secuencia de entrada fictiva a la derecha. Crear una función para devolver un conjunto de datos con valor aleatorio para cada día de enero de 2001 a diciembre de 2016

Salida

La parte derecha del gráfico muestra todas las series. Comienza desde 2001 y termina en 2019 No tiene sentido alimentar todos los datos en la red, en su lugar, necesita crear un lote de datos con una longitud igual al paso de tiempo. Este lote será la variable X. La variable Y es la misma que X pero desplazada por un período (es decir, desea pronosticar t+1).

Ambos vectores tienen la misma longitud. Puedes verlo en la parte derecha del gráfico anterior. La línea representa los diez valores de la entrada X, mientras que los puntos rojos son los diez valores de la etiqueta, Y. Tenga en cuenta que, la etiqueta comienza un período por delante de X y termina un período después.

Construye un RNN para predecir series temporales en TensorFlow

Ahora, es el momento de construir su primer RNN para predecir la serie anterior. Debe especificar algunos hiperparámetros (los parámetros del modelo, es decir, número de neuronas, etc.) para el modelo:

  • Número de entrada: 1
  • Paso de tiempo (ventanas en series de tiempo): 10
  • Número de neuronas: 120
  • Número de salida: 1

Su red aprenderá de una secuencia de 10 días y contendrá 120 neuronas recurrentes. Alimenta el modelo con una entrada, es decir, un día. Siéntase libre de cambiar los valores para ver si el modelo ha mejorado.

Antes de construir el modelo, debe dividir el dataset en un conjunto de trenes y un conjunto de pruebas. El conjunto de datos completo tiene 222 puntos de datos; utilizará el primer punto 201 para entrenar el modelo y los últimos 21 puntos para probar su modelo.

Después de definir un tren y un conjunto de pruebas, debe crear un objeto que contenga los lotes. En estos lotes, tiene valores X e Y. Recuerde que los valores X están un período retrasado. Por lo tanto, se utilizan las primeras 200 observaciones y el paso de tiempo es igual a 10. El objeto X_Batches debe contener 20 lotes de tamaño 10*1. y_batches tiene la misma forma que el objeto X_batches pero con un punto por delante.

Paso 1) Crear el tren y probar

En primer lugar, convierte la serie en una matriz numpy; luego define las ventanas (es decir, el número de tiempo de que la red aprenderá), el número de entrada, salida y el tamaño del conjunto de trenes.

Después de eso, simplemente divide la matriz en dos datasets.

Paso 2) Crear la función para devolver X_Batches y y_batches

Para hacerlo más fácil, puede crear una función que devuelva dos matrices diferentes, una para X_Batches y otra para y_batches.

Vamos a escribir una función para construir los lotes.

Tenga en cuenta que, los lotes X están retrasados por un período (tomamos el valor t-1). La salida de la función debe tener tres dimensiones. Las primeras dimensiones equivalen al número de lotes, la segunda al tamaño de las ventanas y la última al número de entradas.

La parte difícil es seleccionar los puntos de datos correctamente. Para los puntos de datos X, elija las observaciones de t = 1 a t = 200, mientras que para el punto de datos Y, devuelva las observaciones de t = 2 a 201. Una vez que tenga los puntos de datos correctos, es sencillo cambiar la forma de la serie.

Para construir el objeto con los lotes, debe dividir el dataset en diez lotes de igual longitud (es decir, 20). Puede utilizar el método de reforma y pasar -1 para que la serie sea similar al tamaño del lote. El valor 20 es el número de observaciones por lote y 1 es el número de entradas.

Debe hacer el mismo paso pero para la etiqueta.

Tenga en cuenta que, debe cambiar los datos al número de tiempo que desea pronosticar. Por ejemplo, si desea predecir un tiempo por delante, entonces cambia la serie por 1. Si desea pronosticar dos días, cambie los datos por 2.

Ahora que la función está definida, puede llamarla para crear los lotes.

Puede imprimir la forma para asegurarse de que las dimensiones son correctas.

Debe crear el conjunto de pruebas con solo un lote de datos y 20 observaciones.

Tenga en cuenta que, usted pronostica días tras días, significa que el segundo valor previsto se basará en el valor verdadero del primer día (t+1) del dataset de prueba. De hecho, se conocerá el verdadero valor.

Si desea pronosticar t+2 (es decir, dos días antes), debe usar el valor predicho t+1; si va a predecir t+3 (tres días antes), debe usar el valor predicho t+1 y t+2. Tiene sentido que, es difícil predecir con precisión t+n días por delante.

Muy bien, su tamaño de lote está listo, puede construir la arquitectura RNN. Recuerda, tienes 120 neuronas recurrentes.

Paso 3) Construir el modelo

Para crear el modelo, debe definir tres partes:

1. La variable con los tensores
2. El RNN
3. La pérdida y la optimización

Paso 3.1) Variables

Debe especificar las variables X e y con la forma adecuada. Este paso es trivial. El tensor tiene la misma dimensión que los objetos X_Batches y y_batches.

Por ejemplo, el tensor X es un marcador de posición (consulte el tutorial sobre Introducción a Tensorflow para refrescar su mente acerca de la declaración de variables) tiene tres dimensiones:

  • Nota: tamaño del lote
  • n_windows: Longitud de las ventanas. es decir, el número de veces que el modelo mira hacia atrás
  • n_input: Número de entrada

El resultado es:

Paso 3.2) Crear el RNN

En la segunda parte, debe definir la arquitectura de la red. Como antes, se utiliza el objeto BasicRnCell y dynamic_rnn del estimador de TensorFlow.

La siguiente parte es un poco más complicada, pero permite un cálculo más rápido. Debe transformar la salida de ejecución en una capa densa y luego convertirla de nuevo para tener la misma dimensión que la entrada.

Paso 3.3) Crear la pérdida y la optimización

La optimización del modelo depende de la tarea que esté realizando. En el tutorial anterior sobre CNN, su objetivo era clasificar imágenes, en este tutorial, el objetivo es ligeramente diferente. Se le pide que haga una predicción sobre una variable continua en comparación con una clase.

Esta diferencia es importante porque cambiará el problema de optimización. El problema de optimización para una variable continua es minimizar el error cuadrado medio. Para construir estas métricas en TF, puede usar:

  • tf.reduce_sum (tf.square (salidas – y))

El resto del código es el mismo que antes; usa un optimizador de Adam para reducir la pérdida (es decir, MSE):

  • tf.train.adamOptimizer (learning_rate=learning_rate)
  • optimizer.minimize (pérdida)

Eso es todo, puedes empacar todo y tu modelo está listo para entrenar.

Usted entrenará el modelo usando 1500 épocas e imprimirá la pérdida cada 150 iteraciones. Una vez que el modelo está entrenado, se evalúa el modelo en el conjunto de pruebas y se crea un objeto que contiene las predicciones.

Por fin, puede trazar el valor real de la serie con el valor previsto. Si su modelo se corrige, los valores predecidos deben colocarse encima de los valores reales.

Como puede ver, el modelo tiene margen de mejora. Depende de usted cambiar los hiperparámetros como las ventanas, el tamaño del lote del número de neuronas recurrentes.

Resumen

Una red neuronal recurrente es una arquitectura robusta para tratar series temporales o análisis de texto. La salida del estado anterior es retroalimentación para preservar la memoria de la red a lo largo del tiempo o secuencia de palabras.

En TensorFlow, puede usar los siguientes códigos para entrenar una red neuronal recurrente para series temporales:

Parámetros del modelo


Definir el modelo

Construir la optimización

Entrenar el modelo
0 replies

Leave a Reply

Want to join the discussion?
Feel free to contribute!

Leave a Reply

Your email address will not be published. Required fields are marked *