Взрыв в функции потерь, автоэнкодер LSTM - PullRequest
1 голос
/ 20 марта 2020

Я тренируюсь с автокодером LSTM, но функция потерь случайным образом срабатывает, как показано на рисунке ниже: screenshot of explosion in loss function Я пытался сделать несколько вещей, чтобы предотвратить это, отрегулировав размер партии, откорректировав количество нейроны в моих слоях, но, кажется, ничто не помогает. Я проверил свои входные данные, чтобы увидеть, содержит ли они значения null / infinity, но это не так, они также нормализованы. Вот мой код для справки:

model = Sequential()
model.add(Masking(mask_value=0, input_shape=(430, 3)))
model.add(LSTM(100, dropout=0.2, recurrent_dropout=0.2, activation='relu'))
model.add(RepeatVector(430))
model.add(LSTM(100, dropout=0.2, recurrent_dropout=0.2, activation='relu', return_sequences=True))
model.add(TimeDistributed(Dense(3)))
model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])

context_paths = loadFile()
X_train, X_test = train_test_split(context_paths, test_size=0.20)

history = model.fit(X_train, X_train, epochs=1, batch_size=4, verbose=1, validation_data=(X_test, X_test))

Функция потерь взрывается в случайные моменты времени, иногда раньше, иногда позже. Я прочитал эту ветку о возможных проблемах, но на данный момент, после попытки нескольких вещей, я не уверен, что делать, чтобы предотвратить случайный взлет функции потери. Любой совет приветствуется. Кроме этого, я вижу, что моя точность не очень сильно увеличивается, поэтому проблемы могут быть взаимосвязаны.

Ответы [ 2 ]

1 голос
/ 22 марта 2020

Два основных момента:

1-й пункт Как подчеркнул Даниэль Мёллер: не используйте «relu» для LSTM, оставьте стандартную активацию «tanh».

2-й пункт: Один из способов исправить взрывной градиент - использовать clipnorm или clipvalue для оптимизатора

Попробуйте что-то подобное для последних двух строк

Для clipnorm :

opt = tf.keras.optimizers.Adam(clipnorm=1.0)

Для clipvalue :

opt = tf.keras.optimizers.Adam(clipvalue=0.5)

См. Этот пост для получения справки (предыдущая версия TF): Как применить градиентное обрезание в TensorFlow?

И этот пост для общего объяснения: https://machinelearningmastery.com/how-to-avoid-exploding-gradients-in-neural-networks-with-gradient-clipping/

0 голосов
/ 22 марта 2020

Две основные проблемы:

  • Не используйте 'relu' для LSTM, оставьте стандартную активацию 'tanh'. Поскольку LSTM являются «рекуррентными», им очень легко накапливать растущие или уменьшающиеся значения до такой степени, что числа становятся бесполезными.
  • Проверьте диапазон ваших данных X_train и X_test. Убедитесь, что они не слишком большие. Что-то между -4 и +4 вроде хорошо. Вам следует подумать о нормализации ваших данных, если они еще не нормализованы.

Обратите внимание, что «точность» не имеет смысла для задач, которые не классифицируются. (Я заметил, что ваша последняя активация «линейная», так что вы не проводите классификацию, верно?)


Наконец, если две подсказки выше не работают. Проверьте, есть ли у вас пример со всеми нулями, это может быть создание последовательности «полная маска», и это «может» (я не знаю) вызвать ошибку.

(X_train == 0).all(axis=[1,2]).any() #should be false
...