Las series temporales son una disciplina ampliamente estudiada por sus múltiples aplicaciones en muchos sectores. Por ejemplo, los valores de las acciones en la bolsa, las visitas de usuarios en una web, suscripciones a una plataforma online, consumo eléctrico, etc. Generalmente se suele hablar de datos segmentados por su variable temporal en los que parece haber una cierta dependencia entre cada instante temporal y los anteriores.

Ejemplo de serie temporal.
A lo largo de este artículo desgranamos las diferentes partes de una serie temporal y cómo podemos aplicar las redes de neuronas para realizar predicciones sobre las mismas.
¿Qué es una serie temporal?
Una serie temporal se define como una sucesión de observaciones (datos o valores) de una variable tomadas en diferentes instantes temporales y ordenadas en base a los mismos. Más formalmente podemos definir una serie temporal a partir de las siguientes componentes generales:
Estacionariedad: refleja la variabilidad de la serie. Formalmente se define como proceso estacionario (o proceso estrictamente estacionario), un proceso estocástico cuya distribución de probabilidad en un instante de tiempo fijo o una posición fija es la misma para todos los instantes de tiempo o posiciones. Es decir, una serie cuya media y varianza permanecen constantes a lo largo de toda la serie.
Tendencia: refleja la evolución o el comportamiento de las observaciones a largo plazo. No es necesariamente lineal y puede ser creciente o decreciente.
- Componente cíclico: variaciones que aparecen en algunas series temporales y tiene relación con la tendencia. Toman forma de oscilaciones irregulares periódicas de más de un año de duración.
Estacionalidad: movimiento de oscilación a corto plazo (las estaciones, los meses). Siempre es un periodo de repetición conocido y fijo (no como los ciclos).
Componente aleatoria: Componentes con carácter aleatorio en torno a las dos anteriores: aleatoria (o residuo, suele ser ruido debido a fenómenos ocasionales externos) o transiente (producto de fenómenos aislados que no impactan en la tendencia).
En caso de buscar utilizar métodos estadísticos tradicionales (ARIMA, Prophet, etc), la serie temporal debe ser estacionaria para que las predicciones no estén sesgadas. En caso de no ser estacionaria la influencia de otras componentes que no son constantes (como la tendencia) provoca que la predicción no sea correcta. Es por esto que gran parte de estos métodos tradicionales de estudio y predicción se basan en intentar convertir la serie temporal a una serie equivalente estacionaria tras haber caracterizado las componentes principales.
Otra técnica utilizada para la predicción en series temporales son las redes de neuronas artificiales. Son una técnica de machine learning que aproxima funciones para caracterizar un conjunto y resolver diferentes tipos de problemas. La principal ventaja frente a métodos tradicionales es que no es necesario realizar el paso de feature engineering (extracción de características), si no que lo realiza la red automáticamente, en mayor o menor medida dependiendo del tipo de red. Esto, aplicado a las series temporales, quiere decir que la caracterización es automática.
En concreto existen un tipo de redes de neuronas, las LSTM (Long Short Term Memory), que funcionan muy bien con este tipo de casos de uso. Son redes que pueden almacenar cierto grado de memoria sobre el estado de la red con conjuntos de instancias anteriores. Esto las hace muy buenas en problemas donde las instancias tienen cierta tendencia heredada de observaciones anteriores como la series temporales.
¿Cómo funcionan las redes de neuronas?
Una red de neuronas (en ocasiones denominado “aproximador universal”) es un modelo de Machine Learning (disciplina que forma parte de la Inteligencia Artificial) que permite caracterizar un conjunto de datos por medio de una función matemática que aproxima la “salida” de la red. Esta salida corresponde con las solución objetivo del problema. Por ejemplo, en una regresión sobre una serie temporal sería el siguiente valor de la serie.

Arquitectura de red de neuronas tradicional.
Tiene varias componentes principales:
Entrada ([latex] x_i [/latex]): matriz con los patrones de entrada en cada iteración. Deben ser numéricos.
Capa: Conjunto de neuronas completamente conectadas con la capa anterior.
Pesos ([latex] w_{in} [/latex]): matriz de pesos que multiplican a las entradas o activaciones. Estos pesos se actualizan durante el backpropagation, que es como se llama al proceso de aprendizaje. Además, normalmente se asocia a los pesos el bias ( [latex] b [/latex] ), una componente de sesgo que no depende de la entrada.
Función de activación: Función que determina la salida de cada neurona. Su entrada es la combinación lineal de salidas de la capa anterior y los pesos. Típicamente son funciones no lineales -sigmoid, tanh, ReLU, softplus-.
- Por ejemplo, para la primera neurona [latex] a_0 = f(x_0 \cdot w_{00} + x_1 \cdot w_{10} + \ldots{} + x_i \cdot w_{10} + b) [/latex]
El funcionamiento de una red de neuronas es lo que se suele llamar feedforward, que es esencialmente el comportamiento de la red al realizar las operaciones “hacia delante”. Este proceso se realiza tanto durante el entrenamiento como durante la inferencia, es el funcionamiento normal de la red.
Durante el proceso de feedforward lo que hace el algoritmo es, para cada neurona desde la capa de entrada hasta la de salida:
- Multiplicar cada una de las salidas de la capa anterior por los pesos de las conexiones entre la capa anterior y la actual y sumarlos. Esto es la combinación lineal de salidas de la capa anterior por pesos.
- Ejecuta la función de activación al resultado de la combinación lineal obtenida en el paso anterior. Este resultado es la salida de esta neurona. El vector resultante de la salida de cada neurona se considera la salida de cada capa.
Este proceso se repite hasta haber recorrido todas las capas. El resultado en la última capa (la capa de salida) se considera la salida de la red.
Existe otro procedimiento, llamado backpropagation, que es el que se realiza durante el entrenamiento de la red para actualizar los pesos entre capas. Esta modificación es la que incorpora el conocimiento que se extrae durante el entrenamiento al modelo final. Este modelo final no es más que la configuración de pesos de la red al final del entrenamiento, una vez optimizado el error.
Conceptualmente este algoritmo lo que hace es aplicar un algoritmo de optimización (como el descenso de gradiente) sobre el error entre la salida de la red durante el feedforward y la salida esperada. De esta forma se actualizan los pesos de todas las capas buscando minimizar el error. Este proceso se repite de forma iterativa hasta que la reducción del error sea poco significativa.
Debido a estas derivadas parciales que se realizan sobre las funciones sigmoidales, en las redes de neuronas entrenadas con descenso de gradiente se produce un problema cuando tienen muchas capas que se conoce como el problema del Vanishing Gradient. Cuantas más capas tiene que recorrer la propagación del error, más se atenúa, es decir, menos impacto tiene en la actualización de los pesos y menos aprende la red.
Las redes LSTM, además de tener una componente de memoria, no tienen el problema de Vanishing Gradient ya que el aprendizaje es algo diferente.
Una red LSTM (Long Short Term Memory) es un tipo de red recurrente donde parte de la entrada a cada capa es la salida (estado) de la capa en la iteración anterior. Este estado es el que dota a la red de «memoria».
En estas redes las neuronas se llaman células y tienen más complejidad que las neuronas de una red de neuronas tradicional. Las campas están compuestas por varias de estas células, y cada célula recibe como entrada la salida de la capa anterior ([latex] x_{t} [/latex]) y la salida de la misma célula en el instante de tiempo anterior ([latex] h_{t-1} [/latex]).

Arquitectura de una célula de LSTM. Fuente: http://colah.github.io/posts/2015-08-Understanding-LSTMs/
Las LSTM tienen las siguientes componentes principales, con alguna terminología diferente a las redes de neuronas tradicionales:
- Forget gate (puerta del olvido): decide qué información del contexto “olvidar”.
[latex]f=\sigma (W_f \cdot [ h_{t-1}, x_t] + b_{fg} )[/latex] - Input gate (puerta de entrada): genera el nuevo contexto en base al contexto anterior y la entrada.
[latex] i = \sigma(W_f \cdot [h_{t-1}, x_t] + b_{fg}) [/latex]
[latex] pc = \tanh(W_c \cdot [h_{t-1}, x_t] + b_{pc}) [/latex]
[latex] c = f \cdot c + i \cdot pc [/latex] - Output gate (puerta de salida): genera la salida de la red en base al nuevo contexto y la entrada.
[latex] o = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o ) [/latex]
[latex] h = o \cdot \tanh(c) [/latex]
En este caso el proceso de feedforward lo que hace es, para cada célula:
- Calcular la entrada combinada ( [latex] [h_{t-1}, x_t] [/latex] ) a partir de la entrada ([latex] x_t [/latex]) combinada la salida del instante anterior ([latex] h_{t-1} [/latex]).
- Calcular la salida de la forget gate por medio de la aplicación de una función sigmoide () a la entrada combinada. Esta salida se utiliza para filtrar del contexto del estado anterior aquello que debe olvidar.
- Calcular la salida de la input gate por medio de la entrada combinada ( [latex] [h_{t-1}, x_t] [/latex] ). A la entrada combinada se le aplica una función arco tangente ([latex] \tanh [/latex]) para obtener el nuevo contexto. Además, se aplica una función sigmoide ([latex] \sigma [/latex]) a la entrada combinada para filtrar la información nueva que realmente debe añadirse al contexto. Esta salida se añade al contexto filtrado por la forget gate.
- Se aplica una función sigmoide ([latex] \sigma [/latex]) a la entrada combinada y se combina con el arco tangente ([latex] \tanh [/latex]) del contexto. Esta es la salida de la célula ([latex] h_{t} [/latex]).
Este es el funcionamiento básico de las redes LSTM, aunque hay configuraciones diferentes en función de las características concretas de cada problema.
Conclusiones
Las LSTM son métodos de predicción de series temporales bastante versátiles y muy apropiados cuando la caracterización de la serie es compleja. Requieren únicamente de los datos de la serie temporal, pudiendo caracterizar series de casi cualquier tipo.
Sin embargo, las LSTM son modelos con mucha sensibilidad al ruido, por lo que si los nuevos valores de la serie están muy influenciados por variables no existentes en la serie, es probable que no funcionen bien.
Además, en muchos casos puede implicar una sobre ingeniería contraproducente. Por ejemplo, en series con una componente estacional muy fuerte las LSTM funcionan (generalmente) peor que modelos como Prophet. Este modelo caracteriza esa estacionalidad mucho mejor que una LSTM, que puede prestar atención a una ventana temporal en la que no se marque esa estacionalidad.
En última instancia lo importante es conocer bien las herramientas de las que se dispone y saber cuándo utilizar cada una de ellas.
Imagen: unsplash | @shaunak_mirashi
Deja un comentario