es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cuál es la forma estándar de entrenar un script de PyTorch hasta la convergencia?

¿Cuál es la forma estándar de detectar si un modelo ha convergido? Iba a registrar 5 pérdidas con intervalos de confianza del 95% cada una y si todas estuvieran de acuerdo, detendría el script. Supongo que el entrenamiento hasta la convergencia ya debe estar implementado en PyTorch o PyTorch Lightning en algún lugar. No necesito una solución perfecta, solo la forma estándar de hacerlo automáticamente, es decir, detenerse cuando haya convergido.

Mi solución es fácil de implementar. Una vez que se crea un criterio y se cambia la reducción a none. Luego, se obtendrá un tensor de tamaño [B]. Cada vez que se registre, se almacenará eso y su intervalo de confianza del 95% (o desviación estándar si lo prefieres, pero eso es mucho menos preciso). Luego, cada vez que se agregue una nueva pérdida con su intervalo de confianza, asegúrate de que siga siendo de tamaño 5 (o 10) y que las 5 pérdidas estén dentro de un 95% de intervalo de confianza entre sí. Luego, si eso es cierto, detenerse.

Puedes calcular el intervalo de confianza con esto:

def torch_compute_confidence_interval(data: Tensor,
                                      confidence: float = 0.95
                                      ) -> Tensor:
    """
    Calcula el intervalo de confianza para una muestra dada de un conjunto de datos.
    """
    n = len(data)
    mean: Tensor = data.mean()
    se: Tensor = data.std(unbiased=True) / (n**0.5)
    t_p: float = float(scipy.stats.t.ppf((1 + confidence) / 2., n - 1))
    ci = t_p * se
    return mean, ci

y puedes crear el criterio de la siguiente manera:

loss: nn.Module = nn.CrossEntropyLoss(reduction='none')

entonces la pérdida de entrenamiento ahora tiene un tamaño [B].

nota que sé cómo entrenar con un número fijo de épocas, así que no estoy realmente buscando eso, solo el criterio de detención para cuando se detiene cuando el modelo parece haber convergido, lo que una persona haría cuando ve su curva de aprendizaje pero automáticamente.

ref:
https://forums.pytorchlightning.ai/t/what-is-the-standard-way-to-halt-a-script-when-it-has-converged/1415

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La forma estándar de detectar si un modelo ha convergido es monitorear la pérdida de entrenamiento y validación a lo largo del tiempo y ver si se estabilizan. Un enfoque común es hacer un seguimiento del promedio móvil de la pérdida durante un cierto número de épocas y detener el entrenamiento una vez que deja de mejorar. Otro enfoque es verificar si la diferencia entre la pérdida actual y la pérdida anterior es menor que un umbral determinado.

    En PyTorch y PyTorch Lightning, puedes utilizar la detención anticipada para detener automáticamente el script cuando el modelo ha convergido. La detención anticipada funciona monitoreando una métrica (por ejemplo, pérdida de validación) y deteniendo el entrenamiento cuando la métrica deja de mejorar durante un cierto número de épocas. Esto se implementa en el callback ‘EarlyStopping’ de PyTorch Lightning, que se puede agregar al ‘Trainer’ para detener el entrenamiento cuando el modelo ha convergido.

    Para utilizar la detención anticipada, necesitas definir un “monitor” que especifique la métrica a monitorear (por ejemplo, pérdida de validación) y la dirección a optimizar (por ejemplo, minimizar). Luego puedes pasar el monitor al callback ‘EarlyStopping’, junto con el número de épocas que esperar antes de detenerse (‘patience’) y la mejora mínima requerida para considerar que el modelo ha mejorado (‘min_delta’).

    Aquí tienes un ejemplo de código para utilizar el ‘EarlyStopping’ de PyTorch Lightning con un monitor para la pérdida de validación:

    import pytorch_lightning as pl
    
    # define el monitor (pérdida de validación en este caso)
    monitor = pl.callbacks.EarlyStoppingMonitor("val_loss", mode="min")
    
    # define el callback de detención anticipada con una paciencia de 5 épocas
    early_stop = pl.callbacks.EarlyStopping(monitor=monitor, patience=5, min_delta=0.001)
    
    # pasa el callback de detención anticipada al entrenador
    trainer = pl.Trainer(callbacks=[early_stop])
    

    Con esta configuración, el ‘Trainer’ detendrá el entrenamiento cuando la pérdida de validación deje de mejorar durante 5 épocas consecutivas (es decir, cuando el modelo ha convergido). Ten en cuenta que es posible que necesites ajustar los parámetros (por ejemplo, “patience”, “min_delta”) según tu modelo y conjunto de datos específico.

Comments are closed.