Избегайте переобучения с большой сетью LSTM на небольшом объеме данных

Aug 19 2020

Я повторно отправляю этот вопрос из AI.SE здесь, поскольку я думаю, что он, возможно, был не по теме AI.SE ...

1. Контекст

Я изучаю методы мониторинга здоровья и практикуюсь с набором данных C-MAPSS . Цель состоит в том, чтобы предсказать оставшийся полезный срок службы (RUL) двигателя с учетом серии измерений датчиков. О наборе данных C-MAPSS существует обширная литература, включая как классические (не-DL) методы машинного обучения, так и подходы на основе DL. Несколько лет назад сети на основе LSTM показали многообещающие результаты (см. Сеть долгосрочной краткосрочной памяти для оценки оставшегося полезного срока службы, Чжэн и др. , 2017 ), и я пытаюсь воспроизвести эти результаты.

Набор данных C-MAPSS содержит небольшой объем данных. Подмножество FD001 имеет, например, только 100 серий безотказных работ. Когда я предварительно обрабатываю его для получения временных рядов фиксированной длины, я могу получить до ~ 20 000 кадровых рядов. В упомянутой выше статье с использованием LSTM они используют два скрытых слоя LSTM по 64 единицы каждый и два полностью связанных слоя с 8 нейронами каждый (~ 55 000 параметров).

2. Проблема

LSTM вызывают большое количество параметров, поэтому при обучении такой сети может возникнуть переобучение. Я могу использовать регуляризацию L1 или L2, отсев, сеть по-прежнему будет в значительной степени завышена по сравнению с набором данных. Сохраняя ту же архитектуру, я не могу достичь оценок и RMSE в документе в наборе для проверки, и здесь всегда есть переоснащение.

Однако одна вещь, которая работает, - это уменьшение количества единиц слоев LSTM. Ожидается, что при наличии всего 24 единиц вместо 64 на слой сеть имеет гораздо меньше параметров (~ 9000) и не представляет собой переобучения. Оценки и RMSE немного хуже, чем в статье, но это лучшее, что я могу пока получить. Хотя эти результаты меня устраивают, мне любопытно, как авторам статьи удалось избежать переобучения в своей сети LSTM (64,64).

3. Вопрос

LSTM великолепны, но они вызывают множество параметров, которые мешают правильному обучению на небольшом наборе данных: мне интересно, есть ли какой-либо метод для решения этой конкретной проблемы. Не могли бы вы посоветовать, как избежать переобучения сети на основе LSTM на небольшом наборе данных?

4. Информация

Ниже я приведу дополнительную информацию о моей сети и результатах:

Сетевая архитектура

model = keras.models.Sequential([
    keras.layers.LSTM(24, return_sequences=True, kernel_regularizer=keras.regularizers.l1(0.01),
                      input_shape=input_shape),
    keras.layers.Dropout(0.2),
    keras.layers.LSTM(24, return_sequences=False, kernel_regularizer=keras.regularizers.l1(0.01)),
    keras.layers.Dropout(0.2),
    keras.layers.Dense(8, activation='relu', kernel_regularizer=keras.regularizers.l2()),
    keras.layers.Dropout(0.2),
    keras.layers.Dense(8, activation='relu', kernel_regularizer=keras.regularizers.l2(), bias_regularizer=keras.regularizers.l2()),
    keras.layers.Dense(1, activation='relu')
])

Баллы (набор для проверки)

  • Работа: Оценка = 16,14; RMSE = 338
  • Мой LSTM (64, 64): оценка = 26,47; RMSE = 3585 (подходит больше)
  • Мой LSTM (24, 24): оценка = 16,82; RMSE = 515

Изменить: результаты решения, предложенного @ hH1sG0n3

  • LSTM (64, 64) с recurrent_dropout=0.3: Оценка = 16,36; RMSE = 545

Ответы

2 hH1sG0n3 Aug 19 2020 at 19:39

Вы можете проверить пару гиперпараметров, которые, похоже, вы не тестируете в приведенном выше коде:

  • Отсечение градиента: большие обновления весов во время обучения могут вызвать числовое переполнение или потерю значимости, часто называемое «взрывными градиентами».
# configure your optimizer with gradient norm clipping
opt = SGD(lr=0.01, momentum=0.9, clipnorm=1.0)
  • Повторное выпадение: выпадение, которое применяется к повторяющемуся входному сигналу модулей уровня LSTM.
keras.layers.LSTM(24, kernel_regularizer=keras.regularizers.l1(0.01), ..., recurrent_dropout=0.3)
  • Stateful: ясно ли из статьи, сохраняет ли модель свое состояние с каждой итерацией обучения. Вы также можете поэкспериментировать с этим.
keras.layers.LSTM(24, kernel_regularizer=keras.regularizers.l1(0.01), ..., stateful=True)
shepan6 Aug 19 2020 at 17:51

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

Очевидно, моя первая интуиция подсказывает уменьшить количество слоев (например, удалить второй слой LSTM, например), но это, очевидно, изменит общую архитектуру модели, так что она будет иметь меньше слоев, чем модель, описанная в статье.

Другое особенно очевидное предложение - сделать некоторую форму увеличения данных, чтобы искусственно увеличить количество выборок, используя набор данных, который у вас есть в настоящее время.

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