Причины глубокого обучения Nan

Возможно, слишком общий вопрос, но может ли кто-нибудь объяснить, что может вызвать сверхочную нейронную сеть?

Особенности:

Я использую модель tisorflow iris_training с некоторыми моими собственными данными и продолжаю получать

ОШИБКА: тензорный поток: модель расходится с потерей = NaN.

Traceback...

tensorflow.contrib.learn.python.learn.monitors.NanLossDuringTrainingError: потеря NaN во время обучения.

Трассировка возникла с помощью строки:

 tf.contrib.learn.DNNClassifier(feature_columns=feature_columns,
                                        hidden_units=[300, 300, 300],
                                        #optimizer=tf.train.ProximalAdagradOptimizer(learning_rate=0.001, l1_regularization_strength=0.00001),                                                          
                                        n_classes=11,
                                        model_dir="/tmp/iris_model")

Я попытался настроить оптимизатор, используя ноль для скорости обучения и не используя оптимизатор. Любое понимание сетевых уровней, размера данных и т.д. Оценивается.

Ответ 1

Я видел много вещей, которые заставляют модель расходиться.

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

  2. Я не знаком с DNNClassifier, но я предполагаю, что он использует функцию категориальной кросс-энтропийной стоимости. Это включает ведение журнала прогноза, который расходится, когда прогноз приближается к нулю. Вот почему люди обычно добавляют небольшое значение эпсилон к прогнозу, чтобы предотвратить это расхождение. Я полагаю, что DNNClassifier, вероятно, делает это или использует для него тензор потока. Вероятно, не проблема.

  3. Могут существовать и другие проблемы со стабильностью чисел, такие как деление на ноль, когда может помочь добавление эпсилона. Еще один менее очевидный, если квадратный корень, производная которого может расходиться, если не будет должным образом упрощен при работе с числами конечной точности. Еще раз я сомневаюсь, что это проблема в случае DNNClassifier.

  4. У вас могут быть проблемы с входными данными. Попробуйте вызвать assert not np.any(np.isnan(x)) для входных данных, чтобы убедиться, что вы не вводите nan. Также убедитесь, что все целевые значения действительны. Наконец, убедитесь, что данные правильно нормализованы. Возможно, вы хотите, чтобы пиксели были в диапазоне [-1, 1], а не [0, 255].

  5. Метки должны находиться в области функции потерь, поэтому при использовании логарифмической функции потерь все метки должны быть неотрицательными (как отмечено evan pu и комментариями ниже).

Ответ 2

Если вы тренируетесь для кросс-энтропии, вы хотите добавить небольшое количество, например 1е-8, к вашей вероятности выхода.

Поскольку log (0) является отрицательной бесконечностью, когда ваша модель достаточно подготовлена, распределение выходных данных будет сильно искажено, например, я делаю вывод класса 4, в начале моя вероятность выглядит как

0.25 0.25 0.25 0.25

но к концу вероятность, вероятно, будет выглядеть как

1.0 0 0 0

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

Ответ 3

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

I.e., не используйте классы -1, 0, 1. Используйте вместо этого 0, 1, 2.

Ответ 4

В моем случае я получил NAN при установке удаленных целочисленных меток. то есть:

  • Ярлыки [0..100] обучение прошло нормально,
  • Метки [0..100] плюс одна дополнительная метка 8000, затем я получил NAN.

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

РЕДАКТИРОВАТЬ Вы можете увидеть эффект в следующем простом коде:

from keras.models import Sequential
from keras.layers import Dense, Activation
import numpy as np

X=np.random.random(size=(20,5))
y=np.random.randint(0,high=5, size=(20,1))

model = Sequential([
            Dense(10, input_dim=X.shape[1]),
            Activation('relu'),
            Dense(5),
            Activation('softmax')
            ])
model.compile(optimizer = "Adam", loss = "sparse_categorical_crossentropy", metrics = ["accuracy"] )

print('fit model with labels in range 0..5')
history = model.fit(X, y, epochs= 5 )

X = np.vstack( (X, np.random.random(size=(1,5))))
y = np.vstack( ( y, [[8000]]))
print('fit model with labels in range 0..5 plus 8000')
history = model.fit(X, y, epochs= 5 )

Результат показывает NAN после добавления метки 8000:

fit model with labels in range 0..5
Epoch 1/5
20/20 [==============================] - 0s 25ms/step - loss: 1.8345 - acc: 0.1500
Epoch 2/5
20/20 [==============================] - 0s 150us/step - loss: 1.8312 - acc: 0.1500
Epoch 3/5
20/20 [==============================] - 0s 151us/step - loss: 1.8273 - acc: 0.1500
Epoch 4/5
20/20 [==============================] - 0s 198us/step - loss: 1.8233 - acc: 0.1500
Epoch 5/5
20/20 [==============================] - 0s 151us/step - loss: 1.8192 - acc: 0.1500
fit model with labels in range 0..5 plus 8000
Epoch 1/5
21/21 [==============================] - 0s 142us/step - loss: nan - acc: 0.1429
Epoch 2/5
21/21 [==============================] - 0s 238us/step - loss: nan - acc: 0.2381
Epoch 3/5
21/21 [==============================] - 0s 191us/step - loss: nan - acc: 0.2381
Epoch 4/5
21/21 [==============================] - 0s 191us/step - loss: nan - acc: 0.2381
Epoch 5/5
21/21 [==============================] - 0s 188us/step - loss: nan - acc: 0.2381

Ответ 5

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

Источник: https://github.com/tensorflow/tensor2tensor/issues/574

Ответ 6

Метки должны быть в диапазоне от 0 до количества классов.

Ответ 7

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