Callback
콜백은 학습 루프가 각 에포크 종료 시점과 같은 정해진 이벤트에서 호출하는 함수로, 조기 종료, 체크포인트, 로깅 등을 추가합니다.
콜백은 다른 코드에 전달되는 함수로, 특정 이벤트가 발생하면 해당 코드가 콜백을 호출합니다. 사용자 인터페이스의 이벤트 핸들러, 비동기 코드의 완료 함수, 정렬 루틴에 전달하는 비교 함수가 모두 콜백입니다. 딥러닝 프레임워크에서 이벤트는 학습 루프의 특정 시점, 예를 들어 학습 시작, 각 배치 또는 에포크 종료, 검증 완료 시점을 가리킵니다. 이벤트에 등록된 콜백은 해당 시점에 실행되며 트레이너 상태에 접근할 수 있으므로, 루프 자체를 수정하지 않고도 과적합 방지를 위한 조기 종료, 체크포인팅, 학습률 스케줄, 로깅을 추가할 수 있습니다.
콜백의 학습 루프 연결 방식#
프레임워크는 이름이 지정된 이벤트마다 콜백 목록을 유지하고, 루프가 해당 이벤트에 도달하면 콜백을 모두 호출합니다. 트레이너 또는 모델 객체를 전달하므로 콜백이 지표를 읽고 설정을 변경할 수 있습니다. Keras는 keras.callbacks 모듈에서 콜백을 관리하고, PyTorch Lightning은 Callback의 하위 클래스에서 관리하며, Hugging Face Transformers는 TrainerCallback에서 관리합니다. 라이브러리마다 메서드 이름은 다르지만 이벤트는 같은 루프를 따릅니다.
콜백은 루프 안에서 실행되므로 루프를 변경할 수도 있습니다. 중지 플래그를 설정하는 콜백은 현재 에포크가 끝난 뒤 학습을 종료하고, 옵티마이저를 수정하는 콜백은 이후 모든 단계에 영향을 미칩니다. 같은 이벤트에 등록된 콜백은 등록 순서대로 실행되며, 배치 단위 콜백은 에포크마다 수천 번 실행되므로 파일 업로드처럼 느린 작업은 에포크 단위 이벤트에서 처리해야 합니다. 분산 학습에서는 각 프로세스가 자체 루프와 콜백을 실행하므로, 로깅 및 체크포인팅 콜백은 보통 주 프로세스인 랭크 0에서만 작동해 여러 GPU가 같은 파일을 기록하는 일을 방지합니다.
일반적인 학습 콜백#
- 조기 종료: 인내도라고 부르는 설정된 에포크 수 동안 검증 지표가 개선되지 않으면 학습을 중지해 과적합을 제한하고 연산량을 절약합니다. Keras의
EarlyStopping은 중지 전에 확인한 최적 가중치도 복원할 수 있습니다. - 체크포인팅: 매 에포크마다 또는 모니터링 중인 지표가 개선될 때마다 모델을 저장해 최적 가중치를 보존하고 중단된 실행을 재개할 수 있게 합니다. Keras의
BackupAndRestore콜백은 저장된 상태를 사용해 중단된 실행을 자동으로 재개합니다. - 학습률 스케줄링: 지표가 정체되면 학습률을 낮추거나, Keras의
ReduceLROnPlateau처럼 코사인 감쇠와 같은 고정 스케줄을 따릅니다. - 실험 추적: 각 에포크 후 손실, 지표, 샘플 이미지를 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 제한에 도달했을 때와 같은 동작입니다.
콜백과 후크 비교#
두 용어는 흔히 같은 개념을 가리킵니다. PyTorch Lightning은 콜백이 구현하는 메서드를 훅이라고 부릅니다. PyTorch 자체에서 register_forward_hook 또는 register_full_backward_hook로 등록하는 모듈 훅은 학습 루프 이벤트가 아니라 단일 레이어의 순전파 또는 역전파에 연결됩니다. 모듈 훅은 시각화를 위한 특징 맵을 읽거나 역전파 중 그래디언트를 검사하고 수정하는 데 사용됩니다.










