В моей машинной тренировке происходит резкое увеличение потерь. Есть ли конкретная c причина и как ее можно устранить? - PullRequest
1 голос
/ 02 мая 2020

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

 tf.keras.layers.Conv1D(filters=32, kernel_size=5,
                      strides=1, padding="causal",
                      activation="relu",
                      input_shape=x_train_single.shape[-2:]),
  tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(32, return_sequences=True)),
  tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(32, return_sequences=True)),
  tf.keras.layers.Dense(1),
  tf.keras.layers.Lambda(lambda x: x * 100)

Epoch 64/100
50/50 [==============================] - 21s 420ms/step - loss: 0.2506 - mae: 0.5902 - lr: 1.8197e-05
Epoch 65/100
50/50 [==============================] - 21s 417ms/step - loss: 0.2608 - mae: 0.6035 - lr: 1.9055e-05
Epoch 66/100
50/50 [==============================] - 21s 418ms/step - loss: 0.2683 - mae: 0.6048 - lr: 1.9953e-05
Epoch 67/100
50/50 [==============================] - 21s 417ms/step - loss: 0.7993 - mae: 1.2234 - lr: 2.0893e-05
Epoch 68/100
50/50 [==============================] - 21s 420ms/step - loss: 1.8172 - mae: 2.2769 - lr: 2.1878e-05
Epoch 69/100
50/50 [==============================] - 21s 417ms/step - loss: 5.6831 - mae: 6.1442 - lr: 2.2909e-05
Epoch 70/100
50/50 [==============================] - 21s 423ms/step - loss: 4.5647 - mae: 5.0645 - lr: 2.3988e-05
Epoch 71/100
50/50 [==============================] - 21s 418ms/step - loss: 0.9771 - mae: 1.4475 - lr: 2.5119e-05
Epoch 72/100
50/50 [==============================] - 21s 419ms/step - loss: 0.1717 - mae: 0.4792 - lr: 2.6303e-05

введите описание изображения здесь

1 Ответ

1 голос
/ 02 мая 2020

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

  1. Измените размер партии. Обычно идея тем больше, чем быстрее сходимость. Может помочь, это не очень помогло в моем случае.
  2. Измените свою скорость обучения или используйте API обратных вызовов tenorflow для обучения затуханию.
  3. Если вы хотите изменить свою архитектуру, вы можно попробовать сеть ГРУ. Говорят, что это обычно решает проблему взрыва градиентов, которые могут иметь LSTM. Тем не менее, в определенных случаях использования они могут работать хуже. Хорошо, что вы все еще можете использовать двунаправленную нейронную сеть с GRU, поэтому изменения в вашем коде будут (вероятно) минимальными.
  4. Единственное, что помогло мне, - нормализация моих данных. Сначала я думал, что мне это на самом деле не нужно, так как я работал со скоростями транспортных средств, но после этого я был поражен точностью. Поэтому я бы посоветовал взглянуть на нормализацию / стандартизацию данных.
  5. Другой способ, который может помочь, - это пакетная нормализация. Я не пробовал это самостоятельно, но говорят, что это полезно в этом случае.
  6. Используйте другой оптимизатор.

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

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