¿Qué parámetros deben utilizarse para la parada anticipada?

97

Estoy entrenando una red neuronal para mi proyecto usando Keras. Keras ha proporcionado una función para detenerse temprano. ¿Puedo saber qué parámetros deben observarse para evitar que mi red neuronal se sobreajuste mediante la detención anticipada?

AizuddinAzmán
fuente

Respuestas:

157

parada anticipada

La parada anticipada es básicamente detener el entrenamiento una vez que la pérdida comienza a aumentar (o en otras palabras, la precisión de la validación comienza a disminuir). Según los documentos se utiliza de la siguiente manera;

keras.callbacks.EarlyStopping(monitor='val_loss',
                              min_delta=0,
                              patience=0,
                              verbose=0, mode='auto')

Los valores dependen de su implementación (problema, tamaño de lote, etc.) pero generalmente para evitar el sobreajuste, usaría;

  1. Monitoree la pérdida de validación (necesita usar validación cruzada o al menos entrenar / probar conjuntos) estableciendo el monitor argumento en 'val_loss'.
  2. min_deltaes un umbral para cuantificar una pérdida en algún momento como mejora o no. Si la diferencia de pérdida es inferior min_delta, se cuantifica como sin mejora. Es mejor dejarlo como 0 ya que nos interesa cuándo empeora la pérdida.
  3. patienceEl argumento representa el número de épocas antes de detenerse una vez que su pérdida comienza a aumentar (deja de mejorar). Esto depende de su implementación, si usa lotes muy pequeños o una gran tasa de aprendizaje, su pérdida zig-zag (la precisión será más ruidosa), así que es mejor establecer un patienceargumento amplio . Si usa lotes grandes y una tasa de aprendizaje pequeña, su pérdida será más suave para que pueda usar un patienceargumento más pequeño . De cualquier manera, lo dejaré como 2 para darle más oportunidades al modelo.
  4. verbose decide qué imprimir, déjelo por defecto (0).
  5. modeEl argumento depende de la dirección que tenga la cantidad monitoreada (se supone que está disminuyendo o aumentando), ya que monitoreamos la pérdida, podemos usar min. Pero dejemos que Keras maneje eso por nosotros y configurémoslo paraauto

Entonces, usaría algo como esto y experimentaría trazando la pérdida por error con y sin parada anticipada.

keras.callbacks.EarlyStopping(monitor='val_loss',
                              min_delta=0,
                              patience=2,
                              verbose=0, mode='auto')

Para una posible ambigüedad sobre cómo funcionan las devoluciones de llamada, intentaré explicar más. Una vez que llama fit(... callbacks=[es])a su modelo, Keras llama a funciones predeterminadas de objetos de devolución de llamada dados. Estas funciones se pueden llamar on_train_begin, on_train_end, on_epoch_begin, on_epoch_endy on_batch_begin, on_batch_end. La devolución de llamada de detención anticipada se llama al final de cada época, compara el mejor valor monitoreado con el actual y se detiene si se cumplen las condiciones (cuántas épocas han pasado desde la observación del mejor valor monitoreado y es más que un argumento de paciencia, la diferencia entre el último valor es mayor que min_delta, etc.).

Como señaló @BrentFaust en los comentarios, el entrenamiento del modelo continuará hasta que se cumplan las condiciones de detención anticipada o se cumpla el epochsparámetro (predeterminado = 10) fit(). Establecer una devolución de llamada de detención anticipada no hará que el modelo se entrene más allá de su epochsparámetro. Por lo tanto, llamar a la fit()función con un epochsvalor mayor se beneficiaría más de la devolución de llamada de detención anticipada.

umutto
fuente
3
@AizuddinAzman close, min_deltaes un umbral para cuantificar el cambio en el valor monitoreado como una mejora o no. Entonces sí, si damos, monitor = 'val_loss'entonces se referirá a la diferencia entre la pérdida de validación actual y la pérdida de validación anterior. En la práctica, si da min_delta=0.1una disminución en la pérdida de validación (actual - anterior) menor que 0,1 no se cuantificaría, por lo tanto, se detendría el entrenamiento (si lo tiene patience = 0).
umutto
3
Tenga en cuenta que callbacks=[EarlyStopping(patience=2)]no tiene ningún efecto, a menos que se le asigne una época model.fit(..., epochs=max_epochs).
Brent Faust
1
@BrentFaust Ese es mi entendimiento también, escribí la respuesta suponiendo que el modelo se está entrenando con al menos 10 épocas (por defecto). Después de su comentario, me di cuenta de que puede haber un caso en el que el programador llame a fit con epoch=1un bucle for (para varios casos de uso) en el que esta devolución de llamada fallaría. Si hay ambigüedad en mi respuesta, intentaré expresarlo de una mejor manera.
umutto
4
@AdmiralWen Desde que escribí la respuesta, el código ha cambiado un poco. Si está utilizando la última versión de Keras, puede usar el restore_best_weightsargumento (aún no está en la documentación), que carga el modelo con los mejores pesos después del entrenamiento. Pero, para sus propósitos, usaría la ModelCheckpointdevolución de llamada con save_best_onlyargumento. Puede consultar la documentación, es sencillo de usar, pero debe cargar manualmente los mejores pesos después del entrenamiento.
umutto
1
@umutto Hola, gracias por la sugerencia de restore_best_weights, sin embargo no puedo usarlo, `es = EarlyStopping (monitor = 'val_acc', min_delta = 1e-4, paciencia = paciencia_, verbose = 1, restore_best_weights = True) TypeError: __init __ () obtuvo un argumento de palabra clave inesperado 'restore_best_weights'`. ¿Algunas ideas? keras 2.2.2, tf, 1.10 ¿cuál es tu versión?
Haramoz