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;
- 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'
.
min_delta
es 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.
patience
El 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 patience
argumento amplio . Si usa lotes grandes y una tasa de aprendizaje pequeña, su pérdida será más suave para que pueda usar un patience
argumento más pequeño . De cualquier manera, lo dejaré como 2 para darle más oportunidades al modelo.
verbose
decide qué imprimir, déjelo por defecto (0).
mode
El 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_end
y 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 epochs
pará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 epochs
parámetro. Por lo tanto, llamar a la fit()
función con un epochs
valor mayor se beneficiaría más de la devolución de llamada de detención anticipada.
min_delta
es 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 damin_delta=0.1
una 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 tienepatience = 0
).callbacks=[EarlyStopping(patience=2)]
no tiene ningún efecto, a menos que se le asigne una épocamodel.fit(..., epochs=max_epochs)
.epoch=1
un 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.restore_best_weights
argumento (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 laModelCheckpoint
devolución de llamada consave_best_only
argumento. Puede consultar la documentación, es sencillo de usar, pero debe cargar manualmente los mejores pesos después del entrenamiento.