Callback
コールバックとは、早期停止、チェックポイント、ログ記録などを追加するために、各エポックの終了時など決められたイベントで学習ループが呼び出す関数です。
コールバックとは、別のコードに渡す関数で、特定のイベントが発生したときにそのコードから呼び出されます。ユーザーインターフェースのイベントハンドラー、非同期コードの完了関数、ソート処理に渡す比較関数は、いずれもコールバックです。ディープラーニングフレームワークでは、訓練の開始、各バッチやエポックの終了、検証の完了などがイベントにあたります。イベントに登録されたコールバックは、そのイベントが発生したときにトレーナーの状態へアクセスできるため、ループ自体を編集せずに、オーバーフィッティングを防ぐ早期停止、チェックポイントの保存、学習率スケジュール、ログ記録などを追加できます。
コールバックが訓練に組み込まれる仕組み#
フレームワークは、名前付きイベントごとにコールバックのリストを保持し、ループがそのイベントに達すると、トレーナーまたはモデルのオブジェクトを渡して、登録済みのすべてのコールバックを呼び出します。 Kerasではkeras.callbacksモジュールにまとめられ、PyTorch LightningではCallbackのサブクラスにまとめられます。Hugging Face TransformersではTrainerCallbackにまとめられます。ライブラリによってメソッド名は異なりますが、イベントが発生するのは同じループ内です。
コールバックはループ内で実行されるため、ループに変更を加えることもできます。停止フラグを設定するコールバックは現在のエポックの終了後に訓練を停止し、オプティマイザーを変更するコールバックは、その後のすべてのステップに影響します。同じイベントに対するコールバックは登録順に実行され、バッチ単位のコールバックは1エポックで数千回実行されるため、ファイルのアップロードなど時間のかかる処理はエポック単位のイベントに適しています。分散訓練では各プロセスがループとコールバックの独自のコピーを実行するため、ログ記録やチェックポイント保存のコールバックは通常、同じファイルを複数のGPUから書き込まないよう、メインプロセスであるrank 0だけで動作します。
一般的な訓練コールバック#
- 早期停止:検証メトリクスがpatienceと呼ばれる所定のエポック数にわたって改善しない場合、訓練を停止します。これにより、オーバーフィッティングを抑え、計算資源を節約できます。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上限に達した場合と同じ動作です。
コールバックとフックの違い#
この2つの用語は、同じものを指すことがよくあります。PyTorch Lightningでは、コールバックが実装するメソッドをフックと呼びます。PyTorch自体でregister_forward_hookまたはregister_full_backward_hookを使って登録するモジュールフックは、訓練ループのイベントではなく、1つのレイヤーの順伝播または逆伝播に紐付けられます。特徴マップの可視化のための読み取りや、誤差逆伝播中の勾配の確認・変更に使われます。










