Razones de pérdida de Nan de aprendizaje profundo


Tal vez una pregunta demasiado general, pero ¿puede alguien explicar qué causaría que una Red Neuronal Convolucional divergiera?

Específicos:

Estoy usando el modelo iris_training de Tensorflow con algunos de mis propios datos y sigo obteniendo

ERROR:tensorflow:Modelo divergido con pérdida = NaN.

Rastreo...

Tensorflow.contrib.aprender.python.aprender.Monitor.NanLossDuringTrainingError: pérdida de NaN durante el entrenamiento.

El rastreo se originó con línea:

 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")

He intentado ajustar el optimizador, usando un cero para la tasa de aprendizaje, y no usando ningún optimizador. Se agradece cualquier información sobre las capas de red, el tamaño de los datos, etc.

Author: Zroach, 2016-10-14

4 answers

Hay muchas cosas que he visto que hacen que un modelo diverja.

  1. Una tasa de aprendizaje demasiado alta. A menudo se puede decir si este es el caso si la pérdida comienza a aumentar y luego diverge hasta el infinito.

  2. No estoy familiarizado con el DNNClassifier, pero supongo que utiliza la función de costo de entropía cruzada categórica. Esto implica tomar el registro de la predicción que diverge a medida que la predicción se acerca a cero. Es por eso que la gente suele añadir un pequeño epsilon valor a la predicción para evitar esta divergencia. Supongo que el DNNClassifier probablemente hace esto o utiliza el tensorflow opp para ello. Probablemente no es el problema.

  3. Otros problemas de estabilidad numérica pueden existir, como la división por cero, donde agregar el epsilon puede ayudar. Otro menos obvio si la raíz cuadrada que es derivada puede divergir si no se simplifica correctamente cuando se trata de números de precisión finita. Una vez más dudo que este sea el problema en el caso de la DNNClassifier.

  4. Es posible que tenga un problema con los datos de entrada. Intente llamar a assert not np.any(np.isnan(x)) en los datos de entrada para asegurarse de que no está introduciendo la nan. También asegúrese de que todos los valores de destino sean válidos. Finalmente, asegúrese de que los datos estén normalizados correctamente. Probablemente quieras tener los píxeles en el rango [-1, 1] y no [0, 255].

  5. Las etiquetas deben estar en el dominio de la función de pérdida, por lo que si se utiliza una función de pérdida basada en logarítmica, todas las etiquetas deben ser no negativas (como anotado por evan pu y los comentarios a continuación).

 38
Author: chasep255,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-30 00:42:38

Si estás entrenando para entropía cruzada, quieres agregar un pequeño número como 1e-8 a tu probabilidad de salida.

Debido a que log (0) es infinito negativo, cuando su modelo entrenado lo suficiente la distribución de salida será muy sesgada, por ejemplo, digamos que estoy haciendo una salida de clase 4, al principio mi probabilidad se ve como

0.25 0.25 0.25 0.25

Pero hacia el final la probabilidad probablemente se verá como

1.0 0 0 0

Y tomas una entropía cruzada de esta distribución todo explotará. La solución es añadir artificialmente un pequeño número a todos los términos para evitar esto.

 3
Author: Evan Pu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-27 00:45:00

Si usa enteros como objetivos, se asegura de que no sean simétricos a 0.

Es decir, no utilice las clases -1, 0, 1. Utilice en su lugar 0, 1, 2.

 0
Author: yper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-14 09:13:07

Si desea recopilar más información sobre el error y si el error ocurre en las primeras iteraciones, le sugiero que ejecute el experimento en modo solo CPU (sin GPU). El mensaje de error será mucho más específico.

Fuente: https://github.com/tensorflow/tensor2tensor/issues/574

 0
Author: Kevin Johnsrude,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-14 18:40:42