Callback
Una callback è una funzione richiamata dal ciclo di addestramento in momenti prestabiliti, per esempio alla fine di ogni epoca, per aggiungere arresto anticipato, checkpoint o registrazione.
Una callback è una funzione passata a un'altra parte di codice, che la richiama quando si verifica un evento specifico. I gestori di eventi nelle interfacce utente, le funzioni di completamento nel codice asincrono e la funzione di confronto fornita a una routine di ordinamento sono tutti esempi di callback. Nei framework di deep learning, gli eventi corrispondono a punti del ciclo di addestramento, come l'inizio dell'addestramento, la fine di ogni batch o epoca e il completamento della validazione. Le callback registrate per un evento vengono eseguite in quel punto e hanno accesso allo stato del trainer, così gli utenti possono aggiungere l'arresto anticipato per contrastare l'overfitting, il salvataggio dei checkpoint, le pianificazioni del tasso di apprendimento o la registrazione dei log senza modificare il ciclo stesso.
Come si collegano le callback all'addestramento#
Un framework mantiene un elenco di callback per ogni evento identificato e le esegue tutte quando il ciclo raggiunge l'evento, passando l'oggetto trainer o model affinché la callback possa leggere le metriche e modificare le impostazioni. Keras le raccoglie nel proprio modulo keras.callbacks, PyTorch Lightning nelle sottoclassi di Callback e Hugging Face Transformers in TrainerCallback. I nomi dei metodi variano tra le librerie, ma gli eventi seguono lo stesso ciclo:
Poiché le callback vengono eseguite all'interno del ciclo, possono anche modificarlo: una callback che imposta un flag di arresto termina l'addestramento al termine dell'epoca corrente, mentre una che modifica l'ottimizzatore cambia tutti i passaggi successivi. Le callback per lo stesso evento vengono eseguite nell'ordine in cui sono state registrate e quelle a livello di batch vengono eseguite migliaia di volte per epoca; quindi, le operazioni lente, come il caricamento di file, vanno associate agli eventi a livello di epoca. Nell'addestramento distribuito, ogni processo esegue una propria copia del ciclo e delle relative callback, quindi quelle che registrano log e salvano checkpoint agiscono in genere solo sul processo principale, il rank 0, per evitare che più GPU scrivano lo stesso file.
Callback di addestramento comuni#
- Arresto anticipato: interrompe l'addestramento quando una metrica di validazione non migliora per un numero prestabilito di epoche, detto pazienza; in questo modo limita l'overfitting e riduce il consumo di risorse di calcolo.
EarlyStoppingdi Keras può anche ripristinare i migliori pesi osservati prima dell'arresto. - Salvataggio dei checkpoint: salva il modello a ogni epoca o ogni volta che una metrica monitorata migliora, in modo da conservare i pesi migliori e poter riprendere una sessione interrotta da un arresto anomalo. La callback
BackupAndRestoredi Keras usa lo stato salvato per riprendere automaticamente una sessione interrotta. - Pianificazione del tasso di apprendimento: riduce il tasso di apprendimento quando una metrica si stabilizza, come fa
ReduceLROnPlateaudi Keras, oppure segue una pianificazione fissa come il decadimento coseno. - Tracciamento degli esperimenti: invia le perdite, le metriche e le immagini di esempio a strumenti come TensorBoard, MLflow o Weights & Biases dopo ogni epoca.
- Ottimizzazione degli iperparametri: comunica il punteggio di ogni epoca a un ottimizzatore come Ray Tune, i cui scheduler interrompono in anticipo le prove poco promettenti.
Scrivere una callback personalizzata#
Ultralytics YOLO genera eventi identificati durante l'addestramento, la validazione, la predizione e l'esportazione, come on_train_epoch_end e on_fit_epoch_end; le sue integrazioni per MLflow, Comet, ClearML, TensorBoard e Ultralytics Platform sono registrate come callback per questi eventi. Questa callback legge la mAP50-95 di validazione dopo ogni epoca e interrompe una sessione di YOLO26 non appena raggiunge un obiettivo:
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)L'evento on_fit_epoch_end viene attivato dopo l'addestramento e la validazione dell'epoca, quindi trainer.metrics contiene già i punteggi di quell'epoca. Impostando trainer.stop, il trainer esce dal ciclo delle epoche, esegue la consueta validazione finale sui pesi migliori e salva i risultati, come accade quando viene raggiunto il limite integrato patience.
Callback e hook a confronto#
Spesso i due termini indicano la stessa cosa: PyTorch Lightning chiama hook i metodi implementati da una callback. In PyTorch, gli hook dei moduli registrati con register_forward_hook o register_full_backward_hook si collegano al passaggio forward o backward di un singolo livello, anziché a un evento del ciclo di addestramento; vengono usati per leggere le mappe delle caratteristiche a fini di visualizzazione o per esaminare e modificare i gradienti durante la backpropagation.










