RNN's com vários recursos

27

Eu tenho um pouco de conhecimento autodidata trabalhando com algoritmos de Machine Learning (o material básico do tipo Floresta Aleatória e Regressão Linear). Decidi ramificar-me e começar a aprender RNN's com Keras. Ao analisar a maioria dos exemplos, que geralmente envolvem previsões de ações, não consegui encontrar nenhum exemplo básico de vários recursos sendo implementados, exceto uma coluna sendo a data do recurso e a outra a saída. Há uma coisa fundamental fundamental que me falta ou algo assim?

Se alguém tem um exemplo, eu agradeceria muito.

Obrigado!

Rjay155
fonte
11
Não sabe o que você quis dizer com "vários recursos". Se você quer dizer que mais de um recurso tem impacto no aprendizado, basta usar uma matriz de design multivariada. Pls esclarecer por um exemplo ou algo assim.
horaceT
@horaceT Eu elaborei multiple features aqui , uma pergunta mais específica sobre como usar a RNN para previsões de séries temporais com recursos que contêm dados numéricos e não numéricos?
Hhh

Respostas:

25

Redes neurais recorrentes (RNNs) são projetadas para aprender dados de sequência. Como você adivinha, eles definitivamente podem usar vários recursos como entrada! Os RNNs de Keras recebem entradas 2D ( T , F ) dos timesteps T e apresentam F (estou ignorando a dimensão do lote aqui).

No entanto, você nem sempre precisa ou deseja os intervalos de tempo intermediários, t = 1, 2 ... ( T - 1). Portanto, o Keras oferece suporte flexível aos dois modos. Para que ele produza todos os timestados T , passe return_sequences=Truepara o seu RNN (por exemplo, LSTMou GRU) na construção. Se você deseja apenas o último timestep t = T , use return_sequences=False(este é o padrão se você não passar return_sequencespara o construtor).

Abaixo estão exemplos de ambos os modos.

Exemplo 1: aprendendo a sequência

Aqui está um exemplo rápido de treinamento de um LSTM (tipo de RNN) que mantém toda a sequência. Neste exemplo, cada ponto de dados de entrada possui 2 timesteps, cada um com 3 recursos; os dados de saída têm 2 timesteps (porque return_sequences=True), cada um com 4 pontos de dados (porque esse é o tamanho para o qual passo 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)

Exemplo 2: aprendendo o último timestep

Se, por outro lado, você deseja treinar um LSTM que produz apenas o último timestep na sequência, é necessário definir return_sequences=False(ou apenas removê-lo do construtor completamente, já que Falseé o padrão). E então seus dados de saída ( data_yno exemplo acima) precisam ser reorganizados, pois você só precisa fornecer o último timestep. Portanto, neste segundo exemplo, cada ponto de dados de entrada ainda possui 2 intervalos de tempo, cada um com 3 recursos. Os dados de saída, no entanto, são apenas um único vetor para cada ponto de dados, porque reduzimos tudo a um único passo de tempo. Porém, cada um desses vetores de saída ainda possui quatro recursos (porque esse é o tamanho que eu passo 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
fonte
Obrigado por sua ótima explicação. Qual é a relação entre o ponto de dados nº 1 e o ponto de dados nº 2. Por exemplo, na primeira situação, se você remover o ponto de dados 2 e colocá-lo no ponto de dados 1, agora temos quatro etapas de tempo. Como isso afetaria o modelo como um todo?
Rjay155
Não há relacionamento especial entre os pontos de dados. Um bom conjunto de treinamento de aprendizado profundo terá muitas dezenas de milhares ou até milhões de pontos de dados. Um ponto de dados = uma amostra de treinamento, é tudo. Se você "mesclasse" os pontos de dados 1 e 2, data_xsimplesmente conteria um único ponto de dados e esse ponto de dados teria quatro timestaps, cada uma com três dimensões (e da mesma forma, você precisaria mesclar data_yda mesma maneira). O número de timestaps que você usa simplesmente depende do que você está tentando modelar (e quantos timestaps são relevantes para esse processo).
Adam Sypniewski
@ Adam Sypniewski Tenho uma pergunta sobre o y. data_y = numpy.array ([# Datapoint 1 # Recursos de destino no timestep 2 [[105, 106, 107, 108], [0, 1]], # Datapoint 2 # Recursos de destino no timestep 2 [[205, 206, 207 , 208], [1, 0]]]) se um dos meus y for características categóricas. Como eu estruturaria isso. THX!
Hua Ye
2
Nesse caso, você provavelmente deve alimentar a saída do RNN em uma camada densa, para que cada passo de saída seja mapeado em categorias muito quentes.
Adam Sypniewski
Como você pode visualizar os resultados aqui? Algumas parcelas seriam úteis.
Hhh