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:
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!
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