RNN z wieloma funkcjami

27

Mam trochę samouczącej się wiedzy związanej z algorytmami uczenia maszynowego (podstawowe rzeczy typu Losowy Las i Regresja Liniowa). Postanowiłem rozgałęzić się i zacząć uczyć RNN z Keras. Patrząc na większość przykładów, które zwykle wiążą się z prognozami giełdowymi, nie znalazłem żadnych podstawowych przykładów implementacji wielu funkcji innych niż 1 kolumna będąca datą funkcji, a druga to wynik. Czy brakuje mi kluczowej fundamentalnej rzeczy?

Jeśli ktoś ma przykład, byłbym bardzo wdzięczny.

Dzięki!

Rjay155
źródło
1
Nie wiesz, co rozumiesz przez „wiele funkcji”. Jeśli masz na myśli więcej niż jedną funkcję mającą wpływ na uczenie się, to po prostu używasz wielowymiarowej matrycy projektowej. Proszę o wyjaśnienie przez przykład lub coś.
horaceT
@horaceT Opracowałem multiple features tutaj bardziej szczegółowe pytanie o tym, jak używać RNN do prognoz szeregów czasowych z funkcjami zawierającymi dane liczbowe i dane nienumeryczne?
hhh

Odpowiedzi:

25

Rekurencyjne sieci neuronowe (RNN) są zaprojektowane do uczenia danych sekwencji. Jak się domyślacie, zdecydowanie mogą one przyjmować wiele funkcji! RNN Keras pobierają dane 2D ( T , F ) kroków czasu T i funkcje F (tutaj ignoruję wymiar wsadowy).

Jednak nie zawsze potrzebujesz lub nie potrzebujesz pośrednich kroków czasowych, t = 1, 2 ... ( T - 1). Dlatego Keras elastycznie obsługuje oba tryby. Aby wyprowadził wszystkie T timepeps, przekaż return_sequences=Truedo swojego RNN (np. LSTMLub GRU) na budowie. Jeśli chcesz tylko ostatniego pomiaru czasu t = T , użyj return_sequences=False(jest to ustawienie domyślne, jeśli nie przejdziesz return_sequencesdo konstruktora).

Poniżej znajdują się przykłady obu tych trybów.

Przykład 1: Nauka sekwencji

Oto szybki przykład szkolenia LSTM (typ RNN), który utrzymuje całą sekwencję. W tym przykładzie każdy punkt danych wejściowych ma 2 kroki czasowe, każdy z 3 funkcjami; dane wyjściowe mają 2 przedziały czasowe (ponieważ return_sequences=True), każdy z 4 punktami danych (ponieważ jest to rozmiar, który przekazuję 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)

Przykład 2: Nauka ostatniego pomiaru czasu

Z drugiej strony, jeśli chcesz wyszkolić LSTM, który generuje tylko ostatni timepep w sekwencji, musisz ustawić return_sequences=False(lub po prostu całkowicie usunąć go z konstruktora, ponieważ Falsejest to ustawienie domyślne). A następnie dane wyjściowe ( data_yw powyższym przykładzie) muszą zostać uporządkowane, ponieważ wystarczy podać tylko ostatni czas. Tak więc w tym drugim przykładzie każdy punkt danych wejściowych nadal ma 2 przebiegi czasowe, każdy z 3 funkcjami. Dane wyjściowe są jednak tylko pojedynczym wektorem dla każdego punktu danych, ponieważ spłaszczyliśmy wszystko do pojedynczego pomiaru czasu. Każdy z tych wektorów wyjściowych ma jednak nadal 4 cechy (ponieważ taki rozmiar przekazuję 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
źródło
Dziękuję za wspaniałe wyjaśnienie. Jaki jest związek między punktem danych nr 1 a punktem danych nr 2. Na przykład w pierwszej sytuacji, jeśli chcesz usunąć punkt danych 2 i umieścić go pod punktem danych 1, teraz mamy 4 kroki czasowe. Jak wpłynęłoby to na cały model?
Rjay155
Nie ma szczególnego związku między punktami danych. Dobry zestaw do uczenia głębokiego będzie zawierał dziesiątki tysięcy, a nawet miliony punktów danych. Jeden punkt danych = jedna próbka treningowa, to wszystko. Jeśli miałbyś „scalić” punkty danych nr 1 i nr 2, wówczas data_xpo prostu zawierałby jeden punkt danych, a ten punkt danych miałby cztery kroki czasowe, każdy z 3 wymiarów (i podobnie, musiałbyś scalić data_yw ten sam sposób). Liczba używanych kroków czasowych zależy po prostu od tego, co próbujesz wymodelować (oraz ile kroków czasowych jest odpowiednich dla tego procesu).
Adam Sypniewski
@Adam Sypniewski Mam pytanie dotyczące y. data_y = numpy.array ([# Datapoint 1 # Funkcje docelowe w czasie 2 [[105, 106, 107, 108], [0, 1]], # Datapoint 2 # Funkcje docelowe w czasie 2 [[205, 206, 207 , 208], [1, 0]]]), jeśli jedno z moich y jest cechami kategorycznymi. Jak bym to ustrukturyzował. Dzięki!
Hua Ye,
2
W takim przypadku powinieneś prawdopodobnie wprowadzić dane wyjściowe RNN do gęstej warstwy, aby każdy krok wyjściowy został odwzorowany na kategorie jednokierunkowe.
Adam Sypniewski
Jak możesz tutaj wyobrazić sobie wyniki? Przydałyby się niektóre wykresy.
hhh