Потеря и оценка многомерного прогноза LSTM

У меня есть архитектура модели CNN-RNN с двунаправленной LSTMS для проблемы регрессии временных рядов. Моя потеря не сходится более чем за 50 эпох. Каждая эпоха насчитывает 20 тысяч образцов. Убыток продолжает колебаться в диапазоне 0,001–0,01.

batch_size=1
epochs = 50
model.compile(loss='mean_squared_error', optimizer='adam')   
trainingHistory=model.fit(trainX,trainY,epochs=epochs,batch_size=batch_size,shuffle=False)
  1. Я попытался обучить модель с неверно спаренными данными X и Y, для которых потеря остается около 0,5, можно ли сделать разумный вывод, что мои X и Y имеют нелинейную зависимость, которую моя модель может изучить через больше эпох?
  2. Прогнозы моей модели фиксируют паттерн, но со смещением я использую расстояние динамического деформирования времени, чтобы вручную проверить точность прогнозов, есть ли лучший способ?

Модель:

model = Sequential()
model.add(LSTM(units=128, dropout=0.05, recurrent_dropout=0.35, return_sequences=True, batch_input_shape=(batch_size,featureSteps,input_dim)))
model.add(LSTM(units=32, dropout=0.05, recurrent_dropout=0.35, return_sequences=False))
model.add(Dense(units=2, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])

person Subrat    schedule 29.09.2017    source источник


Ответы (1)


Если вы тестировали:

  • Неверные данные: потеря ~ 0,5
  • Правильные данные: потеря ~ 0,01

Тогда ваша модель действительно способна чему-то научиться.

Там есть несколько возможностей:

  1. Ваши выходные данные не попадают в диапазон активации последнего слоя
  2. Ваша модель достигла предела для текущей скорости обучения (шаги обновления градиента слишком велики и больше не могут улучшить модель).
  3. Ваша модель не подходит для этой задачи.
  4. В ваших данных есть некоторая степень случайности

Случай 1:

Убедитесь, что ваш Y находится в пределах диапазона вашей последней функции активации.

  • Для tanh (по умолчанию LSTM) все данные Y должны быть от -1 до + 1.
  • Для sigmoid от 0 до 1
  • Для softmax от 0 до 1, но убедитесь, что ваше последнее измерение не равно 1, иначе все результаты всегда будут равны 1.
  • Для relu от 0 до бесконечности
  • Для linear любое значение

Сходимость идет лучше, если у вас ограниченная активация вместо той, которая идет до бесконечности.
В первом случае вы можете перекомпилировать (после обучения) модель с более низкой скоростью обучения, обычно мы делим ее на 10, где значение по умолчанию это 0.0001:

Случай 2:

Если данные в порядке, попробуйте уменьшить скорость обучения после того, как ваша модель застаивается.

Скорость обучения по умолчанию для адама составляет 0.0001, мы часто делим ее на 10:

from keras.optimizers import Adam

#after training enough with the default value: 
model.compile(loss='mse', optimizer=Adam(lr=0.00001)
trainingHistory2 = model.fit(.........)

#you can even do this again if you notice that the loss decreased and stopped again:
model.compile(loss='mse',optimizer=Adam(lr=0.000001)

Если проблема заключалась в скорости обучения, это заставит вашу модель изучить больше, чем она уже сделала (вначале могут быть некоторые трудности, пока оптимизатор не настроится сам).

Случай 3:

Если у вас ничего не получилось, возможно, пришло время увеличить возможности модели. Может быть, добавить больше единиц к слоям, добавить больше слоев или даже изменить модель.

Случай 4:

С этим, наверное, ничего не поделать ...

Но если вы увеличили модель, как в случае 3, будьте осторожны с переобучением (сохраните некоторые тестовые данные, чтобы сравнить потерю теста с потерей обучения).

Слишком хорошие модели могут просто запомнить ваши данные вместо того, чтобы изучать важные идеи о них.

person Daniel Möller    schedule 25.10.2017
comment
Не могли бы вы прокомментировать эту историю тренировок: {'acc': [0,54, 0,62, 0,70, 0,77, 0,81, 0,84, 0,85, 0,86, 0,88, 0,89], 'loss': [0,69, 0,64, 0,56, 0,47, 0,40, 0,35, 0,32, 0,29, 0,27, 0,24], 'val_acc': [0,52, 0,52, 0,51, 0,50, 0,51, 0,50, 0,52, 0,53, 0,51, 0,49], 'val_loss': [0,69, 0,75, 0,81, 0,99, 1.03, 1.09, 1.04, 1.16, 1.13, 1.35]} - person Subrat; 18.12.2017
comment
Похоже на переоснащение. Когда обучающие данные улучшаются, а тестовые - хуже. Это означает, что ваша модель учится запоминать данные обучения. (У него слишком много параметров, может быть, слишком много слоев или слишком много единиц). Люди часто используют отсеивающие слои, чтобы уменьшить переобучение. Вы также можете попробовать модели меньшего размера. (Предполагается, что ваши данные проверки и данные обучения верны, выбраны без предвзятости и т. Д.) - person Daniel Möller; 18.12.2017
comment
Я добавил свою модель в вопрос. Пожалуйста, посмотрите. Поскольку я только пытаюсь доказать наличие обучаемых отношений в моих X и Y, и я получаю немного лучшую точность (на 2% лучше @ 53%) с моими правильно подобранными данными, могу ли я сделать вывод о существовании? Причина, по которой я не уверен, заключается в том, что моя кривая потерь не похожа на популярные L-образные кривые. - person Subrat; 18.12.2017
comment
Как я уже сказал, ваша кривая - это кривая переобучения. Вам нужно сделать модель меньшего размера. Модель менее способная. К сожалению, точного ответа на вопрос о наилучшем размере нет. Вы должны тестировать, пока ваша кривая не начнет вести себя по-другому. Ваша модель в настоящее время запоминает результаты обучения (потому что ваша модель слишком хороша). Он ничего не узнает о тестовых данных. - person Daniel Möller; 18.12.2017