Вопрос или проблема
Я создал две разные модели для прогноза нагрузки. Датасет имеет шесть признаков. Метрика оценки производительности – это средняя абсолютная процентная ошибка (MAPE). Обе модели основаны на LSTM. Вот первая модель и ее производительность.
model = Sequential()
model.add(LSTM(20, input_shape=(1,6),init="uniform", return_sequences=True)) #входная форма (1,5) до (1,6)
model.add(LSTM(20,init="uniform", activation='relu'))
model.add(Dense(256,init="uniform", activation='relu'))
model.add(Dense(256,init="uniform", activation='relu'))
model.add(Dense(1,init="uniform", activation='relu'))
На 30 эпохах:
- TRAIN loss = 3.7549, TEST LOSS : 3.5419
- Необходимое время: 5.9089 минут
Вторая модель – это stacked-LSTM. Вот код:
model = Sequential()
model.add(LSTM(20, input_shape=(1,6),init="uniform", return_sequences=True)) #входная форма (1,5) до (1,6)
model.add(LSTM(20,init="uniform", activation='relu',return_sequences=True))
model.add(LSTM(20,init="uniform", activation='relu',return_sequences=True))
model.add(LSTM(20,init="uniform", activation='relu',return_sequences=True))
model.add(LSTM(20,init="uniform", activation='relu'))
model.add(Dense(1,init="uniform", activation='relu'))
На 30 эпохах:
- TRAIN loss = 5.0825, TEST LOSS : 5.1821
- Необходимое время: 5.7295 минут
В обоих случаях я собрал модели следующим образом:
model.compile(loss="mean_absolute_percentage_error", optimizer="adam", metrics=['acc'])
Определенно, вторая модель работает лучше. Но почему вторая модель (stacked-lstm) работает не так хорошо? И как я могу улучшить результат? Для первой модели после 150 эпох градиент исчезает, когда ошибка составляет около 3.01. Я нацелен на значение меньше 2.
LSTM особенно хорошо работает с временными рядами. Я предполагаю, что эти признаки не зависят друг от друга во времени, поэтому не идеально использовать LSTM или любой другой вариант RNN.
Удалите слои LSTM, уменьшите число нейронов, используйте регуляризатор, dropout.
Также использование ReLU на последнем слое не имеет смысла. Если это задача регрессии, просто используйте линейную активацию вместо этого.
Чтобы уменьшить ошибку, выполните настройку гиперпараметров с помощью случайного поиска или сеточного поиска.
Ответ или решение
Объяснение различий в производительности двух моделей LSTM и способы улучшения
При построении моделей для прогнозирования нагрузки важно понимать, что различные архитектуры могут демонстрировать разное качество работы. В этом случае вы создали две модели LSTM, но столкнулись с проблемами в производительности. Давайте разберем возможные причины и пути улучшения.
Анализ производительности моделей
-
Структура моделей:
- Первая модель имеет две LSTM-слоя и два полносвязных слоя. Она, кажется, более сбалансирована, так как количество параметров умеренно, что может объяснять её хорошую производительность при меньших потерях (TRAIN loss = 3.7549, TEST LOSS = 3.5419).
- Вторая модель использует стекированные LSTM (четыре слоя LSTM) и, как следствие, имеет значительно больше параметров. Хотя такая глубина может быть полезна для захвата сложных паттернов, в данном случае это не дало ожидаемого результата (TRAIN loss = 5.0825, TEST LOSS = 5.1821).
-
Проблема переобучения:
- Судя по потерям, вторая модель может переобучаться, особенно если количество данных ограничено. Более сложные модели часто чувствительнее к малым объемам данных и могут "запоминать" тренировочные примеры, вместо того чтобы обучаться общей закономерности.
-
Активация и выходные слои:
- В последнем слое первой модели вы используете активацию ReLU, которая ограничивает выходные значения (в диапазоне [0,∞]), что не совсем подходит для задач регрессии. Лучше использовать линейную активацию для выхода, чтобы модель могла предсказать любые значения.
-
Функция потерь:
- Используемая метрика – MAPE – может быть подвержена искажениям в случаях с нулевыми значениями. Убедитесь, что ваши данные корректированы, и не содержат нулевых значений в целевой переменной.
Рекомендации по улучшению производительности
-
Изменение архитектуры модели:
- Рассмотрите возможность уменьшения числа слоев LSTM в стекированной модели. Для начала можно попробовать оставить два LSTM слоя, как в первой модели, и протестировать различные комбинации.
-
Регуляризация и дроп-аут:
- Добавьте слои дропаута между LSTM слоями для предотвращения переобучения. Попробуйте добавить, например,
Dropout(0.2)
после каждого LSTM слоя.
- Добавьте слои дропаута между LSTM слоями для предотвращения переобучения. Попробуйте добавить, например,
-
Оптимизация гиперпараметров:
- Используйте методы оптимизации, такие как Grid Search или Randomized Search, для определения наилучших значений гиперпараметров (число нейронов, скорость обучения, размер батча и т. д.).
-
Исследование временных зависимостей:
- Обратите внимание на то, действительно ли ваши фичи имеют временные зависимости. Если нет, возможно, вам стоит рассмотреть другие архитектуры, например, сверточные нейронные сети или деревья решений, которые могут быть более подходящими.
-
Увеличение эпох и наблюдение за потерями:
- Если первая модель сталкивается с проблемой исчезающего градиента, попробуйте использовать более эффективные объекты оптимизации, такие как Adam с увеличением начальной скорости обучения, или адаптивные методы обучения.
Заключение
Разные архитектуры LSTM могут вести себя по-разному в зависимости от сложности задачи и характеристик данных. Ваша первая модель явно демонстрирует лучшую производительность, и следующие шаги должны сосредоточиться на её доработке и оптимизации. Экспериментируйте, анализируйте результаты и настраивайте гиперпараметры для достижения желаемого уровня точности. Успехов в ваших дальнейших исследованиях!