Я использую рекуррентные нейронные сети в 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) есть ли способ обработки очень разреженных матриц при работе с временными рядами.
Любые комментарии или предложения будут приветствоваться!
Спасибо