Потеря проверки намного выше, чем потеря обучения - PullRequest
1 голос
/ 31 марта 2019

Я очень плохо знаком с моделями глубокого обучения и пытаюсь обучить модели с несколькими временными рядами, используя LSTM с Keras Sequential. В течение 50 лет проводится 25 наблюдений в год = 1250 выборок, поэтому не уверен, возможно ли вообще использовать LSTM для таких небольших данных. Тем не менее, у меня есть тысячи переменных функций, не считая временных задержек. Я пытаюсь предсказать последовательность следующих 25 временных шагов данных. Данные нормализованы между 0 и 1. Моя проблема в том, что, несмотря на попытки многих очевидных корректировок, я не могу получить потерю проверки LSTM где-нибудь близко к потере обучения (я думаю, что это слишком много).

Я попытался отрегулировать количество узлов на скрытый слой (25-375), количество скрытых слоев (1-3), выпадение (0,2-0,8), batch_size (25-375) и разделение поезда / теста (90 %: 10% - 50% -50%). Ничто на самом деле не имеет большого значения для различий между потерями при проверке / потере обучения.

# SPLIT INTO TRAIN AND TEST SETS
# 25 observations per year; Allocate 5 years (2014-2018) for Testing
n_test = 5 * 25
test = values[:n_test, :]
train = values[n_test:, :]

# split into input and outputs
train_X, train_y = train[:, :-25], train[:, -25:]
test_X, test_y = test[:, :-25], test[:, -25:]

# reshape input to be 3D [samples, timesteps, features]
train_X = train_X.reshape((train_X.shape[0], 5, newdf.shape[1]))
test_X = test_X.reshape((test_X.shape[0], 5, newdf.shape[1]))
print(train_X.shape, train_y.shape, test_X.shape, test_y.shape)


# design network
model = Sequential()
model.add(Masking(mask_value=-99, input_shape=(train_X.shape[1], train_X.shape[2])))
model.add(LSTM(375, return_sequences=True))
model.add(Dropout(0.8))
model.add(LSTM(125, return_sequences=True))
model.add(Dropout(0.8))
model.add(LSTM(25))
model.add(Dense(25))
model.compile(loss='mse', optimizer='adam')
# fit network
history = model.fit(train_X, train_y, epochs=20, batch_size=25, validation_data=(test_X, test_y), verbose=2, shuffle=False)

Эпоха 19/20 - 14 с - потеря: 0,0512 - потери по величине: 188,9568

Эпоха 20/20 - 14 с - потеря: 0,0510 - потеря по величине: 188,9537

ссылка на участок потери Вала / Потери поезда

Полагаю, я, должно быть, делаю что-то явно не так, но не могу этого понять, так как я новичок. Я надеюсь либо получить некоторую полезную потерю проверки (по сравнению с обучением), либо знаю, что мои данные наблюдений просто недостаточно велики для полезного моделирования LSTM. Любая помощь или предложения высоко ценится, спасибо!

1 Ответ

1 голос
/ 31 марта 2019

Переоснащение

В общем, если вы видите гораздо большую потерю при проверке, чем потеря при обучении, то это признак того, что ваша модель переоснащается - она ​​изучает «суеверия», то есть шаблоны, которые случайно оказались истинными вваши тренировочные данные, но не имеют основы в реальности, и, следовательно, не соответствуют действительности в ваших проверочных данных.

Как правило, это признак того, что у вас "слишком мощная" модель, слишком много параметров, которые способнызапоминания ограниченного количества обучающих данных.В вашей конкретной модели вы пытаетесь узнать почти миллион параметров (попробуйте распечатать model.summary()) из тысячи точек данных - это не разумно, обучение может извлекать / сжимать информацию из данных, а не создавать ее из воздуха.

Каков ожидаемый результат?

Первый вопрос, который вы должны задать (и ответить!) Перед построением модели, касается ожидаемой точности.У вас должна быть разумная нижняя граница (что такое тривиальная базовая линия? Для прогнозирования временных рядов, например, линейная регрессия может быть равна одному) и верхняя граница (что может предсказать эксперт-человек, учитывая те же входные данные и ничего больше?).

Многое зависит от характера проблемы.Вы действительно должны спросить, достаточно ли этой информации , чтобы получить хороший ответ?Для многих проблем реального времени с предсказанием временных рядов ответ - нет - будущее состояние такой системы зависит от многих переменных, которые невозможно определить, просто взглянув на исторические измерения - чтобы разумно предсказать следующее значение, вам необходимоввести много внешних данных, кроме исторических цен.Есть классическая цитата Тьюки: «Комбинация некоторых данных и болезненное стремление к ответу не гарантируют, что разумный ответ может быть извлечен из данного массива данных».

...