25 votos

¿Qué causa caídas repentinas en los errores de entrenamiento/prueba al entrenar una red neuronal?

He visto trazados de error de prueba/entrenamiento que caen repentinamente en ciertos épocas varias veces durante el entrenamiento de la red neuronal, y me pregunto qué causa estos saltos de rendimiento:

Error de prueba de ResNet

Esta imagen se ha tomado del Github de Kaiming He, pero trazados similares aparecen en muchos artículos.

0 votos

Un artículo relacionado: Smith et al. 2018 No descompongas la tasa de aprendizaje, aumenta el tamaño del lote, openreview.net/forum?id=B1Yy1BxCZ

11voto

cwhy Puntos 116

Cambiaron la tasa de aprendizaje. Nota que la caída es exactamente en los 30 y 60 epochs, obviamente establecida manualmente por alguien.

0 votos

En la sección 3.4, se explica que la tasa de aprendizaje se divide por 10 cuando el error se estabiliza.

3voto

Alex Avlonitis Puntos 1

Si te refieres al artículo ResNet (Aprendizaje residual profundo para el reconocimiento de imágenes), se lee lo siguiente: "La tasa de aprendizaje comienza en 0.1 y se divide por 10 cuando el error se estanca". Por lo tanto, la razón del descenso es la actualización en la tasa de aprendizaje.

2voto

Richard Huber Puntos 21

Piensa en el "paisaje de optimización". Por ejemplo, si tuvieras una red con solo dos pesos, podrías trazar todas las combinaciones de estos dos pesos en una superficie, donde la altura en cada punto representa la cantidad de error que tu función de coste devuelve si usas esa coordenada (x, y) como tus dos pesos. Estás tratando de moverte al punto más bajo en esta superficie para obtener el menor nivel de error.
El problema a veces es que la superficie puede volverse bastante loca, especialmente en redes con millones de parámetros en lugar de solo dos. Puedes quedarte atascado en puntos de silla donde el progreso se ralentiza, y luego de repente eres lanzado de nuevo cuesta abajo.
Aquí tienes una animación para ayudar a visualizar esto
ingresar descripción de la imagen aquí
Como puedes ver, los algoritmos de descenso de gradiente más básicos se quedan atascados en estas posiciones mucho más fácilmente.
Puede haber otras causas para esto también, pero esta es la que se escucha con más frecuencia. Podría ser posible que una red tenga un montón de unidades con activaciones saturadas (o en el caso de relu, una unidad que solo está siendo activada por un número muy pequeño de entradas de entrenamiento), y a medida que una unidad sale de la saturación, desencadena una reacción en cadena que saca al resto de la saturación y los pesos de repente reciben un impulso de flujo de gradiente? No he investigado nada parecido, pero estaría interesado si alguien tiene alguna otra razón para agregar.

1voto

needhelp Puntos 9

Comprender las curvas de pérdida ruidosa en Keras (TensorFlow 2.13)

Si estás utilizando Keras, entonces esta puede ser la razón:

TLDR: Esto es un artefacto de suavizado debido a la forma en que Keras utiliza medias móviles para todas sus pérdidas y métricas.

Esta respuesta es la misma que en https://stackoverflow.com/questions/72119572/keras-loss-value-significant-jump

¿Por qué las curvas de pérdida saltan?

Me tomó bastante tiempo entender por qué había saltos entre épocas durante el entrenamiento, y noté que muchos otros estaban discutiendo problemas similares en varios foros. Busqué errores en mi propio proceso de entrenamiento e intenté comprender los detalles internos. Al final, este es simplemente un caso de mala documentación y un artefacto de suavizado.

La razón de estos saltos es un poco sutil. Keras, un popular framework de IA, calcula sus métricas y pérdidas como medias móviles durante una época. Esto puede hacer que tu curva de pérdida se vea bastante ruidosa al principio del entrenamiento. Sin embargo, con el tiempo se suaviza. Pero aquí está el truco: en la siguiente época, la pérdida en realidad es mucho menor que el promedio de la época anterior. Esto crea esa curva escalonada en tu gráfico de entrenamiento.

Si deseas visualizar la pérdida de lote sin suavizar, puedes usar un callback personalizado. Normalmente solo heredo el callback de TensorBoard de Keras y añado lo que necesito, pero por supuesto puedes crear tu propio callback independiente como se hace aquí https://stackoverflow.com/questions/72119572/keras-loss-value-significant-jump

import tensorflow as tf

class CustomKerasTensorBoard(tf.keras.callbacks.TensorBoard):
    def on_epoch_begin(self, epoch, logs=None):
        self.previous_loss_sum = 0
        super().on_epoch_begin(epoch, logs)

    def on_train_batch_end(self, batch, logs=None):
        current_loss_sum = (batch + 1) * logs["loss"]
        current_loss = current_loss_sum - self.previous_loss_sum
        self.previous_loss_sum = current_loss_sum
        logs["loss_raw"] = current_loss
        super().on_train_batch_end(batch, logs)

Y agréguelo a tu llamada model.fit/model.evaluate/model.predict.

Aquí tienes una representación gráfica para ayudarte a entender mejor el concepto:

enter image description here

El gráfico superior muestra la precisión de la clasificación. El gráfico del medio muestra la pérdida. El inferior ilustra la pérdida de lote en crudo, que he dejado sin suavizar. Por lo tanto, cuando veas esos saltos aparentemente erráticos en tu curva de pérdida, recuerda que es parte del proceso de suavizado, y tu entrenamiento podría estar progresando muy bien. ¡Mantén la calma y sigue adelante!

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X