Callback
Колбэк — это функция, которую цикл обучения вызывает при наступлении заданных событий, например в конце каждой эпохи, чтобы добавить раннюю остановку, сохранение контрольных точек или журналирование.
Колбэк — это функция, переданная другой части кода, которая вызывает ее при наступлении определенного события. Обработчики событий в пользовательских интерфейсах, функции завершения в асинхронном коде и функция сравнения, переданная процедуре сортировки, — все это колбэки. В фреймворках глубокого обучения событиями служат точки цикла обучения, например начало обучения, завершение каждого пакета или эпохи, а также момент окончания валидации. Зарегистрированные для события колбэки выполняются в соответствующий момент и получают доступ к состоянию обучающего процесса, поэтому пользователи могут добавлять раннюю остановку для борьбы с переобучением, сохранение контрольных точек, расписания изменения скорости обучения или логирование, не изменяя сам цикл.
Как колбэки подключаются к обучению#
Фреймворк хранит список колбэков для каждого именованного события и вызывает каждый из них, когда цикл доходит до этого события. Колбэку передается объект обучающего процесса или модели, чтобы он мог читать метрики и менять настройки. Keras собирает колбэки в модуле keras.callbacks, PyTorch Lightning — в подклассах Callback, а Transformers от Hugging Face — в TrainerCallback. Названия методов в разных библиотеках отличаются, но события происходят в одном и том же цикле:
Колбэки выполняются внутри цикла, поэтому они могут менять его ход: колбэк, устанавливающий флаг остановки, завершает обучение после текущей эпохи, а колбэк, изменяющий оптимизатор, влияет на все последующие шаги. Колбэки одного события выполняются в порядке регистрации, а колбэки на уровне пакетов запускаются тысячи раз за эпоху, поэтому длительные операции, например загрузку файлов, стоит выполнять на уровне эпох. При распределенном обучении каждый процесс запускает собственную копию цикла и колбэков, поэтому колбэки логирования и сохранения контрольных точек обычно работают только в главном процессе с рангом 0, чтобы несколько GPU не записывали один и тот же файл.
Распространенные колбэки для обучения#
- Ранняя остановка: прекращает обучение, если метрика на валидационной выборке не улучшается заданное число эпох, называемое терпением. Это ограничивает переобучение и экономит вычислительные ресурсы. Колбэк
EarlyStoppingв Keras также может восстановить лучшие веса, полученные до остановки. - Сохранение контрольных точек: сохраняет модель после каждой эпохи или при улучшении отслеживаемой метрики, чтобы сохранить лучшие веса и возобновить обучение после сбоя. Колбэк
BackupAndRestoreв Keras использует сохраненное состояние для автоматического возобновления прерванного запуска. - Настройка скорости обучения: снижает скорость обучения, если метрика выходит на плато, как это делает
ReduceLROnPlateauв Keras, или следует фиксированному расписанию, например косинусному затуханию. - Отслеживание экспериментов: отправляет потери, метрики и примеры изображений в такие инструменты, как TensorBoard, MLflow или Weights & Biases, после каждой эпохи.
- Настройка гиперпараметров: передаёт оценку каждой эпохи настройщику, например Ray Tune, планировщики которого досрочно останавливают бесперспективные испытания.
Написание пользовательского колбэка#
Во время обучения, валидации, предсказания и экспорта Ultralytics YOLO генерирует именованные события, например on_train_epoch_end и on_fit_epoch_end; собственные интеграции с MLflow, Comet, ClearML, TensorBoard и Ultralytics Platform регистрируются как колбэки этих событий. Этот колбэк считывает mAP50-95 на валидации после каждой эпохи и останавливает запуск YOLO26, как только метрика достигает заданного значения:
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)Событие on_fit_epoch_end срабатывает после обучения и валидации в текущей эпохе, поэтому trainer.metrics уже содержит оценки этой эпохи. Если установить trainer.stop, обучающий процесс выйдет из цикла эпох, выполнит обычную финальную валидацию лучших весов и сохранит результаты — так же, как при достижении встроенного лимита patience.
Callbacks и хуки#
Эти два слова часто обозначают одно и то же: в PyTorch Lightning методы, реализующие колбэк, называются хуками. В самом PyTorch хуки модулей, зарегистрированные с помощью register_forward_hook или register_full_backward_hook, привязаны к прямому или обратному проходу одного слоя, а не к событию цикла обучения. Их используют для чтения карт признаков при визуализации, а также для проверки и изменения градиентов во время обратного распространения ошибки.










