Callbacks: EarlyStopping и checkpoints

Урок про callbacks — хуки, которые вмешиваются в обучение: ранняя остановка и сохранение лучшей модели.

Callback — это объект, который Keras вызывает в определённые моменты обучения (конец эпохи, батча), позволяя автоматизировать реакцию на ход обучения.

Сидеть и вручную следить, когда остановить обучение, — расточительство. Callbacks делают это сами: останавливают при переобучении, сохраняют лучший вариант, понижают learning rate. Это must-have для любого серьёзного обучения.

EarlyStopping

Этот callback следит за val_loss и останавливает обучение, если он перестал улучшаться N эпох подряд (параметр patience). Сэмулируем его логику на Python — код запускается:

val_loss = [0.95, 0.62, 0.45, 0.42, 0.46, 0.52, 0.60]
patience = 2

best = float("inf")
wait = 0
stop_epoch = None
for epoch, v in enumerate(val_loss, 1):
    if v < best:
        best = v
        wait = 0
    else:
        wait += 1
        if wait >= patience:
            stop_epoch = epoch
            break

print("лучший val_loss:", best)
print("остановились на эпохе:", stop_epoch)

Вывод:

лучший val_loss: 0.42
остановились на эпохе: 6

val_loss не улучшался 2 эпохи подряд (после 4-й) — на 6-й обучение остановилось, сэкономив время.

ModelCheckpoint

Этот callback сохраняет модель на диск — например, только лучшую по val_loss. Так даже если потом модель переобучится, у вас останется лучший снимок.

В Keras

Callbacks передают в fit списком (требует TF):

from tensorflow.keras import callbacks

cbs = [
    callbacks.EarlyStopping(monitor="val_loss", patience=3,
                            restore_best_weights=True),
    callbacks.ModelCheckpoint("best_model.keras", monitor="val_loss",
                              save_best_only=True),
]

model.fit(x_train, y_train, epochs=100,
          validation_split=0.2, callbacks=cbs)

С restore_best_weights=True после остановки веса откатываются к лучшей эпохе — это важно, иначе останутся уже подпорченные.

Полезные callbacks

CallbackЧто делает
EarlyStoppingостанавливает при отсутствии прогресса
ModelCheckpointсохраняет лучшую модель
ReduceLROnPlateauснижает learning rate на плато
TensorBoardлогирует метрики для визуализации

Как работает под капотом

Keras держит список callbacks и в конце каждой эпохи вызывает у каждого метод on_epoch_end, передавая текущие метрики. EarlyStopping в этот момент сравнивает val_loss с лучшим, увеличивает счётчик ожидания и, если терпение исчерпано, выставляет флаг остановки цикла обучения. Никакой магии — это обычные хуки в нужных точках.

Частые ошибки

  • Маленький patience. patience=0–1 остановит обучение на случайном шуме val_loss раньше времени.
  • Забыть restore_best_weights. Без него модель останется в состоянии последней (худшей) эпохи.
  • Мониторить не ту метрику. Для loss «лучше = меньше», для accuracy — «больше»; задайте mode правильно.

Итог

  • Callbacks автоматизируют реакцию на ход обучения, вызываясь в ключевые моменты.
  • EarlyStopping останавливает обучение, когда val_loss перестал улучшаться (patience).
  • ModelCheckpoint сохраняет лучшую модель на диск.
  • restore_best_weights=True возвращает веса лучшей эпохи после остановки.
Проверьте себя
1. Что делает callback EarlyStopping?
AСохраняет каждую эпоху
BОстанавливает обучение, когда отслеживаемая метрика перестала улучшаться
CУвеличивает learning rate
DДобавляет слои
2. Зачем нужен параметр restore_best_weights=True?
AЧтобы ускорить обучение
BЧтобы после остановки вернуть веса лучшей эпохи, а не последней
CЧтобы увеличить patience
DЧтобы сменить оптимизатор
3. Какой callback сохраняет лучшую модель на диск?
AEarlyStopping
BReduceLROnPlateau
CModelCheckpoint
DTensorBoard