Рекуррентные нейронные сети для временных рядов: поиск лучшей архитектуры - PullRequest
0 голосов
/ 30 мая 2019

Я использую рекуррентные нейронные сети в Python (используя Keras) для задачи исследования многомерного временного ряда. Чтобы подвести итог проблемы: у меня есть около 60 временных рядов с трехдневными единицами времени. Я подаю их в NN, чтобы предсказать значение около 20 из этих временных рядов, а затем оцениваю производительность модели на основе того, насколько точно она правильно ранжирует три верхних значения из 20 серий интересов по каждому разу. Блок. Я делаю это для 5 отдельных объектов (то есть групп): длина временного ряда варьируется от примерно 400 точек как минимум до 2k. «Проблема» заключается в том, что временные ряды для всех групп и для всех переменных Чрезвычайно редки. Значения находятся в диапазоне [0; 1], но количество значений 0 составляет более 90/95% от всех ячеек матрицы.

Как я и предполагал, я использую рекуррентные нейронные сети, в частности ванильные RNN, LSTM, GRU, для сравнения производительности. В настоящее время ванильные RNN работают лучше, чем два других. Мне было интересно, почему. Может ли быть так, что процессы памяти временного ряда не так длинны, чтобы оправдать петли обратной связи и ворота памяти? Кроме того, не могли бы вы порекомендовать мне хорошие способы настройки гиперпараметров моих сетей?

В настоящее время я пробую гиперпараметры / конфигурации:

просмотр: 1,2,5,10,20 единиц размер партии: 10, 20, 30 эпохи: 50, 100 активация: сигмовидная, softmax ранняя остановка: проверка потери (после 10 равных) количество нейронов: 6, 100 n слоев: 1 входной слой, 1 плотный оптимизатор: Адам

Есть предложения по изменению архитектуры? Кроме того, стоит отметить, что (1) Точность валидации обычно увеличивается в первые эпохи, а затем остается стабильной для всех групп. Является ли это красным флагом того, что что-то не работает должным образом, или просто сеть находит проблему достаточно легко и быстро сходится? (2) производительность не изменяется вообще между рН с sigmoid или softmax.

Это центральная часть кода:

lb = [1,2,5,10,20]
batch = [10,20,30]
epochs_nr = [50, 100]
activation = ['sigmoid', 'softmax']
neuron_cnt_rnn = 6
#architecture = ['SimpleRNN', 'GRU', 'LSTM']



for i in epochs_nr:
    for j in lb:
        for k in batch:
            for l in activation:


                    # reshape into X=t and Y=t+1
                        look_back = j
                        trainX, trainY = create_dataset(train, look_back)
                        testX, testY = create_dataset(test, look_back)

                        # reshape input to be [samples, time steps, features]
                        trainX = np.reshape(trainX, (trainX.shape[0], look_back, trainX.shape[2]))
                        testX = np.reshape(testX, (testX.shape[0], look_back, testX.shape[2]))

                # pprint(trainX[0,:,:])
                # print(trainX.shape)

                        epochs_cnt = i
                        batch_size_cnt = k

                    # create and fit the LSTM network
                        model = Sequential()
                        model.add(LSTM(neuron_cnt_rnn, input_shape=( look_back,nr_features)))
                        #model.add(Dropout(dropout))
                        model.add(Dense(nr_features,activation='sigmoid', kernel_initializer='glorot_uniform'))

                        model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.001, 
                                                                                      beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False), 
                                                                                      metrics=['accuracy','mae'])
                        tensorboard = TensorBoard(log_dir="logs/{}".format(time()))
                        callbacks = [EarlyStopping(monitor='val_loss', patience=10),
                                     ModelCheckpoint(filepath='best_model.h5', monitor='val_loss', save_best_only=True)]
                        history=model.fit(trainX, 
                                  trainY, 
                                  validation_data=(testX,testY),
                                  epochs=epochs_cnt, 
                                  batch_size=batch_size_cnt, 
                                  verbose=2, 
                                  callbacks=callbacks)
                        #_, train_acc = model.evaluate(trainX, trainY, verbose=0)
                        #_, test_acc = model.evaluate(testX, testY, verbose=0)

                        score = model.evaluate(testX,testY,batch_size=batch_size_cnt)

В настоящее время для целей моей работы модели работают довольно хорошо, достигая довольно высоких уровней ранжирования, как я определил в своей работе, однако мне было любопытно понять, почему

1) Ванильные RNN работают лучше, чем LSTM и GRU 2) нет разницы между softmax и сигмовидной 3) NN сходится довольно быстро 4) есть ли способ обработки очень разреженных матриц при работе с временными рядами.

Любые комментарии или предложения будут приветствоваться!

Спасибо

...