RNN con múltiples funciones

27

Tengo un poco de conocimiento autodidacta trabajando con algoritmos de aprendizaje automático (el material básico de tipo de bosque aleatorio y regresión lineal). Decidí diversificarme y comenzar a aprender RNN con Keras. Al observar la mayoría de los ejemplos, que generalmente involucran predicciones de acciones, no he podido encontrar ningún ejemplo básico de múltiples funciones que se implementen, aparte de 1 columna que es la fecha de la característica y la otra la salida. ¿Hay algo fundamental que me falta o algo así?

Si alguien tiene un ejemplo, lo agradecería mucho.

¡Gracias!

Rjay155
fuente
1
No estoy seguro de lo que quiere decir con "funciones múltiples". Si quiere decir que más de una característica tiene un impacto en el aprendizaje, entonces simplemente use una matriz de diseño multivariante. Por favor aclarar con un ejemplo o algo.
horaceT
@horaceT Expliqué multiple features aquí , una pregunta más específica sobre cómo usar RNN para predicciones de series de tiempo con características que contienen datos numéricos y datos no numéricos.
hhh

Respuestas:

25

Las redes neuronales recurrentes (RNN) están diseñadas para aprender datos de secuencia. Como supones, ¡definitivamente pueden tomar múltiples características como entrada! Los RNN de Keras toman entradas 2D ( T , F ) de pasos de tiempo T y características F (estoy ignorando la dimensión del lote aquí).

Sin embargo, no siempre necesita o desea los pasos de tiempo intermedios, t = 1, 2 ... ( T - 1). Por lo tanto, Keras admite de manera flexible ambos modos. Para que emita todos los pasos de tiempo T , pase return_sequences=Truea su RNN (por ejemplo, LSTMo GRU) en la construcción. Si solo desea el último paso de tiempo t = T , use return_sequences=False(este es el valor predeterminado si no pasa return_sequencesal constructor).

A continuación hay ejemplos de ambos modos.

Ejemplo 1: aprender la secuencia

Aquí hay un ejemplo rápido de entrenamiento de un LSTM (tipo de RNN) que mantiene la secuencia completa. En este ejemplo, cada punto de datos de entrada tiene 2 pasos de tiempo, cada uno con 3 características; los datos de salida tienen 2 pasos de tiempo (porque return_sequences=True), cada uno con 4 puntos de datos (porque ese es el tamaño al que paso LSTM).

import keras.layers as L
import keras.models as M

import numpy

# The inputs to the model.
# We will create two data points, just for the example.
data_x = numpy.array([
    # Datapoint 1
    [
        # Input features at timestep 1
        [1, 2, 3],
        # Input features at timestep 2
        [4, 5, 6]
    ],
    # Datapoint 2
    [
        # Features at timestep 1
        [7, 8, 9],
        # Features at timestep 2
        [10, 11, 12]
    ]
])

# The desired model outputs.
# We will create two data points, just for the example.
data_y = numpy.array([
    # Datapoint 1
    [
        # Target features at timestep 1
        [101, 102, 103, 104],
        # Target features at timestep 2
        [105, 106, 107, 108]
    ],
    # Datapoint 2
    [
        # Target features at timestep 1
        [201, 202, 203, 204],
        # Target features at timestep 2
        [205, 206, 207, 208]
    ]
])

# Each input data point has 2 timesteps, each with 3 features.
# So the input shape (excluding batch_size) is (2, 3), which
# matches the shape of each data point in data_x above.
model_input = L.Input(shape=(2, 3))

# This RNN will return timesteps with 4 features each.
# Because return_sequences=True, it will output 2 timesteps, each
# with 4 features. So the output shape (excluding batch size) is
# (2, 4), which matches the shape of each data point in data_y above.
model_output = L.LSTM(4, return_sequences=True)(model_input)

# Create the model.
model = M.Model(input=model_input, output=model_output)

# You need to pick appropriate loss/optimizers for your problem.
# I'm just using these to make the example compile.
model.compile('sgd', 'mean_squared_error')

# Train
model.fit(data_x, data_y)

Ejemplo 2: Aprendiendo el último paso de tiempo

Si, por otro lado, desea entrenar un LSTM que solo genera el último paso de tiempo en la secuencia, entonces debe configurarlo return_sequences=False(o simplemente eliminarlo del constructor por completo, ya que Falsees el valor predeterminado). Y luego sus datos de salida ( data_yen el ejemplo anterior) deben reorganizarse, ya que solo necesita proporcionar el último paso de tiempo. Entonces, en este segundo ejemplo, cada punto de datos de entrada todavía tiene 2 pasos de tiempo, cada uno con 3 características. Sin embargo, los datos de salida son solo un vector para cada punto de datos, porque hemos aplanado todo a un solo paso de tiempo. Sin embargo, cada uno de estos vectores de salida todavía tiene 4 características (porque ese es el tamaño al que paso LSTM).

import keras.layers as L
import keras.models as M

import numpy

# The inputs to the model.
# We will create two data points, just for the example.
data_x = numpy.array([
    # Datapoint 1
    [
        # Input features at timestep 1
        [1, 2, 3],
        # Input features at timestep 2
        [4, 5, 6]
    ],
    # Datapoint 2
    [
        # Features at timestep 1
        [7, 8, 9],
        # Features at timestep 2
        [10, 11, 12]
    ]
])

# The desired model outputs.
# We will create two data points, just for the example.
data_y = numpy.array([
    # Datapoint 1
    # Target features at timestep 2
    [105, 106, 107, 108],
    # Datapoint 2
    # Target features at timestep 2
    [205, 206, 207, 208]
])

# Each input data point has 2 timesteps, each with 3 features.
# So the input shape (excluding batch_size) is (2, 3), which
# matches the shape of each data point in data_x above.
model_input = L.Input(shape=(2, 3))

# This RNN will return timesteps with 4 features each.
# Because return_sequences=False, it will output 2 timesteps, each
# with 4 features. So the output shape (excluding batch size) is
# (2, 4), which matches the shape of each data point in data_y above.
model_output = L.LSTM(4, return_sequences=False)(model_input)

# Create the model.
model = M.Model(input=model_input, output=model_output)

# You need to pick appropriate loss/optimizers for your problem.
# I'm just using these to make the example compile.
model.compile('sgd', 'mean_squared_error')

# Train
model.fit(data_x, data_y)
Adam Sypniewski
fuente
Gracias por tu gran explicación. ¿Cuál es la relación entre el punto de datos n. ° 1 y el punto de datos n. ° 2? Por ejemplo, en la primera situación, si fuera a eliminar el punto de datos 2 y colocarlo debajo del punto de datos 1, ahora tenemos 4 pasos de tiempo. ¿Cómo afectaría eso al modelo en su conjunto?
Rjay155
No existe una relación especial entre los puntos de datos. Un buen conjunto de capacitación de aprendizaje profundo tendrá muchas decenas de miles o incluso millones de puntos de datos. Un punto de datos = una muestra de entrenamiento, eso es todo. Si tuviera que "fusionar" los puntos de datos # 1 y # 2, entonces data_xsimplemente contendría un único punto de datos, y ese punto de datos tendría cuatro pasos de tiempo, cada uno de 3 dimensiones (y de manera similar, tendría que fusionarse data_yde la misma manera). El número de pasos de tiempo que usa simplemente depende de lo que está tratando de modelar (y cuántos pasos de tiempo son relevantes para ese proceso).
Adam Sypniewski
@ Adam Sypniewski Tengo una pregunta sobre la y. data_y = numpy.array ([# Datapoint 1 # Funciones de destino en el paso 2 [[105, 106, 107, 108], [0, 1]], # Datapoint 2 # Funciones de destino en el paso 2 [[205, 206, 207 , 208], [1, 0]]]) si una de mis y es características categóricas. ¿Cómo estructuraría esto? ¡Gracias!
Hua Ye
2
En ese caso, probablemente debería alimentar la salida del RNN en una capa densa, de modo que cada paso de tiempo de salida se asigne en categorías de un punto.
Adam Sypniewski
¿Cómo puedes visualizar los resultados aquí? Algunas parcelas serían útiles.
hhh