Callback
Una función de retorno de llamada es una función que el bucle de entrenamiento invoca en eventos establecidos, como el final de cada época, para añadir parada temprana, puntos de control o registros.
Una devolución de llamada es una función que se pasa a otra parte del código y que esta invoca cuando se produce un evento concreto. Los controladores de eventos de las interfaces de usuario, las funciones de finalización del código asíncrono y la función de comparación que se pasa a una rutina de ordenación son ejemplos de devoluciones de llamada. En los marcos de aprendizaje profundo, los eventos son puntos del bucle de entrenamiento, como el inicio del entrenamiento, el final de cada lote o época y el momento en que termina la validación. Las devoluciones de llamada registradas para un evento se ejecutan en ese momento con acceso al estado del entrenador, de modo que los usuarios pueden añadir parada temprana para evitar el sobreajuste, guardar puntos de control, programar la tasa de aprendizaje o registrar datos sin modificar el propio bucle.
Cómo se conectan las devoluciones de llamada al entrenamiento#
Un marco mantiene una lista de devoluciones de llamada para cada evento con nombre y las ejecuta todas cuando el bucle llega a ese evento; les pasa el objeto del entrenador o del modelo para que puedan leer métricas y cambiar ajustes. Keras las reúne en su módulo keras.callbacks, PyTorch Lightning en subclases de Callback y Hugging Face Transformers en TrainerCallback. Los nombres de los métodos varían entre bibliotecas, pero los eventos siguen el mismo bucle:
Como las devoluciones de llamada se ejecutan dentro del bucle, también pueden modificarlo: una devolución de llamada que activa una señal de parada termina el entrenamiento al acabar la época actual, y otra que modifica el optimizador cambia cada paso posterior. Las devoluciones de llamada de un mismo evento se ejecutan en el orden en que se registraron; las de nivel de lote se ejecutan miles de veces por época, así que conviene reservar tareas lentas, como subir archivos, para los eventos de nivel de época. En el entrenamiento distribuido, cada proceso ejecuta su propia copia del bucle y de las devoluciones de llamada, por lo que las de registro de datos y guardado de puntos de control suelen actuar solo en el proceso principal, rango 0, para evitar escribir el mismo archivo desde varias GPU.
Devoluciones de llamada habituales en el entrenamiento#
- Parada temprana: Detiene el entrenamiento cuando una métrica de validación no mejora durante un número determinado de épocas, llamado paciencia; así limita el sobreajuste y ahorra capacidad de cálculo.
EarlyStoppingde Keras también puede restaurar los mejores pesos observados antes de detenerse. - Guardado de puntos de control: Guarda el modelo en cada época o cuando mejora una métrica supervisada, para conservar los mejores pesos y poder reanudar una ejecución interrumpida por un fallo. La devolución de llamada
BackupAndRestorede Keras usa el estado guardado para reanudar automáticamente una ejecución interrumpida. - Programación de la tasa de aprendizaje: Reduce la tasa de aprendizaje cuando una métrica se estanca, como hace
ReduceLROnPlateaude Keras, o sigue una programación fija, como el decaimiento cosenoidal. - Seguimiento de experimentos: Envía pérdidas, métricas e imágenes de muestra a herramientas como TensorBoard, MLflow o Weights & Biases al final de cada época.
- Ajuste de hiperparámetros: envía la puntuación de cada época a un optimizador, como Ray Tune, cuyos planificadores detienen pronto los ensayos poco prometedores.
Cómo escribir una devolución de llamada personalizada#
Ultralytics YOLO activa eventos con nombre durante el entrenamiento, la validación, la predicción y la exportación, como on_train_epoch_end y on_fit_epoch_end; sus propias integraciones con MLflow, Comet, ClearML, TensorBoard y Ultralytics Platform se registran como devoluciones de llamada para esos eventos. Esta devolución de llamada lee el mAP50-95 de validación al final de cada época y detiene una ejecución de YOLO26 en cuanto alcanza un objetivo:
from ultralytics import YOLO
def stop_at_target(trainer):
"""Stop training once validation mAP50-95 reaches 0.6."""
score = trainer.metrics["metrics/mAP50-95(B)"]
print(f"Epoch {trainer.epoch + 1}: mAP50-95 {score:.3f}")
if score >= 0.6:
trainer.stop = True # the trainer ends the run after this epoch
model = YOLO("yolo26n.pt")
model.add_callback("on_fit_epoch_end", stop_at_target) # runs after each epoch's validation
model.train(data="coco8.yaml", epochs=20)El evento on_fit_epoch_end se activa después del entrenamiento y la validación de la época, así que trainer.metrics ya contiene las puntuaciones de esa época. Al establecer trainer.stop, el entrenador sale del bucle de épocas, ejecuta la validación final habitual con los mejores pesos y guarda los resultados, igual que cuando se alcanza el límite integrado patience.
Funciones de retorno frente a hooks#
A menudo, las dos palabras designan lo mismo: PyTorch Lightning llama hooks a los métodos que implementa una devolución de llamada. En PyTorch, los hooks de módulo registrados con register_forward_hook o register_full_backward_hook se conectan al paso hacia delante o hacia atrás de una única capa, en vez de a un evento del bucle de entrenamiento; se usan para consultar los mapas de características con fines de visualización o para inspeccionar y modificar los gradientes durante la retropropagación.










