Keras
Deep Learning
LSTM
Machine Learning
Python
GRU
RNN
En muchos problemas del mundo real, los datos se presentan en forma secuencial: palabras en una oración, precios bursátiles a lo largo del tiempo, notas musicales en una melodía o señales fisiológicas medidas en intervalos regulares. Para abordar este tipo de problemas, no basta con analizar datos de manera aislada; es necesario contar con modelos capaces de captar la dependencia entre los elementos de una secuencia.
Las Redes Neuronales Recurrentes (RNN, por sus siglas en inglés) fueron diseñadas precisamente con ese objetivo: permitir que un modelo aprenda dependencias temporales en los datos, incorporando una forma de memoria interna.
Una red neuronal recurrente es una arquitectura de red que, a diferencia de una red neuronal tradicional (feedforward), incorpora ciclos en su estructura. Esto le permite mantener un estado interno que se actualiza con cada nueva entrada y que influye en las decisiones futuras del modelo.
La idea clave detrás de una RNN es que la salida del modelo en un instante depende no solo de la entrada actual, sino también del estado interno acumulado hasta ese momento.
En una red neuronal recurrente, el proceso de cómputo en cada paso temporal puede representarse de forma simplificada así:
x_t
: entrada en el tiempo t
.h_t
: estado oculto en el tiempo t
, que se actualiza como función de x_t
y del estado anterior h_{t-1}
.y_t
: salida del modelo en el tiempo t
.La actualización del estado y la generación de la salida puede formalizarse con estas ecuaciones:
1h_t = tanh(W_hh * h_{t-1} + W_xh * x_t + b_h) y_t = W_hy * h_t + b_y
El estado h_t
actúa como una memoria dinámica, que se va ajustando conforme el modelo avanza por la secuencia. Las RNN son especialmente útiles en tareas donde el contexto es esencial. Algunos ejemplos incluyen:
Aunque las RNN pueden, en teoría, aprender dependencias a largo plazo, en la práctica sufren un fenómeno conocido como desvanecimiento o explosión del gradiente durante el entrenamiento, lo que dificulta su capacidad para recordar información lejana en el tiempo.
Esto limita su eficacia en tareas donde es importante capturar relaciones entre eventos que están muy separados en la secuencia. Para superar las limitaciones de las RNN tradicionales, se desarrollaron arquitecturas mejoradas:
Ambas variantes son hoy en día el estándar de facto cuando se trabaja con secuencias.
El siguiente ejemplo muestra cómo construir una red RNN sencilla utilizando la biblioteca Keras en Python:
1from keras.models import Sequential 2from keras.layers import SimpleRNN, Dense 3 4model = Sequential() 5model.add(SimpleRNN(64, input_shape=(timesteps, features))) 6model.add(Dense(1, activation='sigmoid')) 7model.compile(optimizer='adam', loss='binary_crossentropy')
Este modelo puede adaptarse para tareas como clasificación de sentimientos o predicción de eventos binarios a partir de secuencias.