STEP 15:Early Stoppingとコールバック

⏹️ STEP 15: Early Stoppingとコールバック

過学習する前に自動で学習を止める実務必須のテクニック

📋 このステップで学ぶこと

  • コールバック(Callback)とは?
  • Early Stoppingの仕組みと設定
  • ModelCheckpointで最良モデルを自動保存
  • ReduceLROnPlateauで学習率を自動調整
  • TensorBoardで学習を可視化
  • 実務での組み合わせパターン

🔔 1. コールバック(Callback)とは?

1-1. コールバックの定義

コールバック(Callback)とは、学習中の特定のタイミングで自動的に実行される処理のことです。

🚗 自動車の例え

コールバックは「車の安全機能」のようなものです。

Early Stopping = 自動ブレーキ
→ 危険を検知したら自動で止まる

ModelCheckpoint = ドライブレコーダー
→ 重要な瞬間を自動で記録

ReduceLROnPlateau = クルーズコントロール
→ 状況に応じて速度を自動調整

1-2. コールバックが実行されるタイミング

【コールバックが実行されるタイミング】 ┌─────────────────────────────────────────┐ │ model.fit() 開始 │ │ ↓ │ │ ┌─────────────────────────────────────┐ │ │ │ エポック1 開始 ← on_epoch_begin() │ │ │ │ ↓ │ │ │ │ バッチ1 処理 │ │ │ │ バッチ2 処理 │ │ │ │ … │ │ │ │ ↓ │ │ │ │ エポック1 終了 ← on_epoch_end() ★ │ │ │ └─────────────────────────────────────┘ │ │ ↓ │ │ ┌─────────────────────────────────────┐ │ │ │ エポック2 開始 │ │ │ │ … │ │ │ │ エポック2 終了 ← on_epoch_end() ★ │ │ │ └─────────────────────────────────────┘ │ │ ↓ │ │ … │ └─────────────────────────────────────────┘ ★ Early Stopping, ModelCheckpoint などは 主に on_epoch_end() で実行される

1-3. 主要なコールバック一覧

コールバック 機能 用途
EarlyStopping 改善が止まったら学習を終了 過学習防止
ModelCheckpoint モデルを自動保存 最良モデルの保存
ReduceLROnPlateau 改善が止まったら学習率を下げる 学習の安定化
TensorBoard 学習ログを記録 学習の可視化
LearningRateScheduler 学習率をスケジュールに従って変更 学習率の細かい制御

⏹️ 2. Early Stopping

2-1. Early Stoppingとは?

Early Stoppingは、検証データの性能が改善しなくなったら学習を自動的に終了するコールバックです。

💡 なぜEarly Stoppingが必要?

エポック数を多く設定しても、過学習が始まる前に自動で止まるので安心!

「何エポック学習すればいいか分からない」という問題を解決します。

2-2. Early Stoppingの動作

以下の図は横スクロールできます。

【Early Stoppingの動作イメージ】 検証損失 │ │ ╲ │ ╲ │ ╲ │ ╲──────────────────── ← 改善が止まる │ ↑ │ patience=5 │ ← 5エポック待っても改善しない → │ │ │ ↓ │ 学習終了! │ └──────────────────────────────→ エポック 1 2 3 4 5 6 7 8 9 10 11 12 patience=5 の場合: ・エポック7で最良の検証損失を記録 ・エポック8〜12で改善なし(5エポック連続) ・エポック12で学習終了

2-3. Kerasでの実装

📝 EarlyStoppingのパラメータ
  • monitor:監視する指標(’val_loss’, ‘val_accuracy’など)
  • patience:改善がなくても待つエポック数
  • min_delta:改善とみなす最小の変化量
  • mode:‘auto’, ‘min’, ‘max’(指標によって自動判定)
  • restore_best_weights:最良の重みに戻すかどうか
from tensorflow.keras.callbacks import EarlyStopping # Early Stoppingの設定 early_stopping = EarlyStopping( monitor=’val_loss’, # 監視する指標(検証損失) patience=5, # 5エポック改善なしで終了 min_delta=0.001, # 0.001以上の改善を「改善」とみなす mode=’min’, # 損失は小さいほど良い restore_best_weights=True, # ★ 最良の重みに戻す(重要!) verbose=1 # 終了時にメッセージ表示 ) # 学習時にコールバックを指定 model.fit( X_train, y_train, epochs=100, # 多めに設定してOK validation_split=0.2, callbacks=[early_stopping] # ★ ここで指定 )
実行結果:
Epoch 1/100
375/375 - val_loss: 0.1523
Epoch 2/100
375/375 - val_loss: 0.1245
...
Epoch 15/100
375/375 - val_loss: 0.0823  ← 最良
Epoch 16/100
375/375 - val_loss: 0.0831
...
Epoch 20/100
375/375 - val_loss: 0.0892
Epoch 20: early stopping  ← 5エポック改善なしで終了
Restoring model weights from the end of the best epoch: 15.
⚠️ restore_best_weights=True を忘れずに!

これをTrueにしないと、学習終了時点の重み(過学習した重み)が残ります。
Trueにすると、最も検証性能が良かった時点の重みに自動で戻ります。

💾 3. ModelCheckpoint

3-1. ModelCheckpointとは?

ModelCheckpointは、学習中にモデルを自動的にファイルに保存するコールバックです。

✅ ModelCheckpointの利点
  • 最良モデルの保存:検証性能が最も良い時点のモデルを保存
  • セッション切断対策:Google Colabで切断されても、途中経過が残る
  • 実験の記録:異なる設定のモデルを比較できる

3-2. Kerasでの実装

📝 ModelCheckpointのパラメータ
  • filepath:保存先のパス
  • monitor:監視する指標
  • save_best_only:最良の時だけ保存
  • save_weights_only:重みのみ保存(Falseならモデル全体)
from tensorflow.keras.callbacks import ModelCheckpoint # ModelCheckpointの設定 checkpoint = ModelCheckpoint( filepath=’best_model.keras’, # 保存先 monitor=’val_accuracy’, # 監視する指標(検証精度) save_best_only=True, # ★ 最良の時だけ保存 save_weights_only=False, # モデル全体を保存 mode=’max’, # 精度は大きいほど良い verbose=1 ) # 学習 model.fit( X_train, y_train, epochs=50, validation_split=0.2, callbacks=[checkpoint] )
実行結果:
Epoch 1/50
Epoch 1: val_accuracy improved from -inf to 0.9521, saving model to best_model.keras
Epoch 2/50
Epoch 2: val_accuracy improved from 0.9521 to 0.9678, saving model to best_model.keras
Epoch 3/50
Epoch 3: val_accuracy did not improve from 0.9678
...
Epoch 15/50
Epoch 15: val_accuracy improved from 0.9756 to 0.9789, saving model to best_model.keras
...

→ 改善があるたびに自動保存される!

3-3. Google Driveへの保存(Colab対策)

# Google Driveをマウント from google.colab import drive drive.mount(‘/content/drive’) # Google Driveに保存 checkpoint = ModelCheckpoint( filepath=’/content/drive/MyDrive/models/best_model.keras’, monitor=’val_loss’, save_best_only=True, verbose=1 ) # これでセッションが切れてもモデルが残る!

📉 4. ReduceLROnPlateau

4-1. ReduceLROnPlateauとは?

ReduceLROnPlateauは、学習が停滞したら学習率を自動的に下げるコールバックです。

🏃 マラソンの例え

学習初期:全力疾走(高い学習率)
→ 大きく改善できる

学習後期:ペースダウン(低い学習率)
→ 細かい調整で最適化

ReduceLROnPlateauは「疲れてきたら自動でペースを落とす」機能!

4-2. Kerasでの実装

from tensorflow.keras.callbacks import ReduceLROnPlateau # ReduceLROnPlateauの設定 reduce_lr = ReduceLROnPlateau( monitor=’val_loss’, # 監視する指標 factor=0.5, # 学習率を半分にする patience=3, # 3エポック改善なしで発動 min_lr=1e-7, # 学習率の下限 verbose=1 ) # 学習 model.fit( X_train, y_train, epochs=100, validation_split=0.2, callbacks=[reduce_lr] )
実行結果:
Epoch 10/100
val_loss: 0.0823
Epoch 11/100
val_loss: 0.0825
Epoch 12/100
val_loss: 0.0830
Epoch 13/100
val_loss: 0.0828

Epoch 13: ReduceLROnPlateau reducing learning rate to 0.0005
← 学習率が 0.001 → 0.0005 に自動調整された!

Epoch 14/100
val_loss: 0.0795  ← 学習率を下げたら改善した!

📊 5. TensorBoard

5-1. TensorBoardとは?

TensorBoardは、学習の過程をグラフで可視化するツールです。

✅ TensorBoardで確認できること
  • 損失(Loss)の推移
  • 精度(Accuracy)の推移
  • 学習率の変化
  • モデルのグラフ構造

5-2. Google Colabでの使い方

from tensorflow.keras.callbacks import TensorBoard import datetime # ログディレクトリの設定 log_dir = “logs/fit/” + datetime.datetime.now().strftime(“%Y%m%d-%H%M%S”) # TensorBoardコールバック tensorboard_callback = TensorBoard( log_dir=log_dir, histogram_freq=1 ) # 学習 model.fit( X_train, y_train, epochs=20, validation_split=0.2, callbacks=[tensorboard_callback] ) # TensorBoardを起動(Google Colab) %load_ext tensorboard %tensorboard –logdir logs/fit
📌 TensorBoardの見方

SCALARS タブ:損失と精度の推移グラフ
GRAPHS タブ:モデルの構造図
HISTOGRAMS タブ:重みの分布

🎯 6. 実践的な組み合わせパターン

6-1. 推奨される組み合わせ

💡 実務で使う「黄金の組み合わせ」

Early Stopping + ModelCheckpoint + ReduceLROnPlateau

この3つを組み合わせると、ほぼ自動で最適な学習ができます!

6-2. 完成コード

from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout, Flatten from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint, ReduceLROnPlateau from tensorflow.keras.datasets import mnist from tensorflow.keras.utils import to_categorical # ===== 1. データ準備 ===== (X_train, y_train), (X_test, y_test) = mnist.load_data() X_train = X_train / 255.0 X_test = X_test / 255.0 y_train = to_categorical(y_train) y_test = to_categorical(y_test) # ===== 2. モデル構築 ===== model = Sequential([ Flatten(input_shape=(28, 28)), Dense(512, activation=’relu’), Dropout(0.5), Dense(256, activation=’relu’), Dropout(0.3), Dense(10, activation=’softmax’) ]) model.compile( optimizer=’adam’, loss=’categorical_crossentropy’, metrics=[‘accuracy’] ) # ===== 3. コールバック設定 ===== # Early Stopping: 改善がなければ学習終了 early_stopping = EarlyStopping( monitor=’val_loss’, patience=10, restore_best_weights=True, verbose=1 ) # ModelCheckpoint: 最良モデルを保存 checkpoint = ModelCheckpoint( filepath=’best_model.keras’, monitor=’val_loss’, save_best_only=True, verbose=1 ) # ReduceLROnPlateau: 停滞したら学習率を下げる reduce_lr = ReduceLROnPlateau( monitor=’val_loss’, factor=0.5, patience=5, min_lr=1e-7, verbose=1 ) # ===== 4. 学習 ===== history = model.fit( X_train, y_train, epochs=100, # 多めに設定(Early Stoppingで止まる) batch_size=128, validation_split=0.2, callbacks=[early_stopping, checkpoint, reduce_lr] ) # ===== 5. 評価 ===== test_loss, test_acc = model.evaluate(X_test, y_test) print(f”\nテスト精度: {test_acc:.4f}”)
実行結果:
Epoch 1/100
Epoch 1: val_loss improved from inf to 0.1523, saving model
...
Epoch 15/100
Epoch 15: val_loss improved from 0.0845 to 0.0812, saving model
...
Epoch 25/100
Epoch 25: ReduceLROnPlateau reducing learning rate to 0.0005
...
Epoch 35/100
Epoch 35: early stopping

テスト精度: 0.9823

→ 自動で最適な学習ができた!

6-3. Google Colab対応版(完全版)

# Google Colab対応の完全版 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout, Flatten, BatchNormalization from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint, ReduceLROnPlateau, TensorBoard from tensorflow.keras.datasets import mnist from tensorflow.keras.utils import to_categorical from google.colab import drive import datetime import os # ===== Google Driveマウント ===== drive.mount(‘/content/drive’) save_dir = ‘/content/drive/MyDrive/DeepLearning/models’ os.makedirs(save_dir, exist_ok=True) # ===== データ準備 ===== (X_train, y_train), (X_test, y_test) = mnist.load_data() X_train = X_train / 255.0 X_test = X_test / 255.0 y_train = to_categorical(y_train) y_test = to_categorical(y_test) # ===== モデル構築(バッチ正規化 + ドロップアウト)===== model = Sequential([ Flatten(input_shape=(28, 28)), Dense(512, activation=’relu’), BatchNormalization(), Dropout(0.5), Dense(256, activation=’relu’), BatchNormalization(), Dropout(0.3), Dense(10, activation=’softmax’) ]) model.compile(optimizer=’adam’, loss=’categorical_crossentropy’, metrics=[‘accuracy’]) # ===== コールバック設定 ===== callbacks = [ EarlyStopping(monitor=’val_loss’, patience=10, restore_best_weights=True, verbose=1), ModelCheckpoint(f'{save_dir}/best_mnist.keras’, monitor=’val_loss’, save_best_only=True, verbose=1), ReduceLROnPlateau(monitor=’val_loss’, factor=0.5, patience=5, min_lr=1e-7, verbose=1), TensorBoard(log_dir=f’logs/{datetime.datetime.now().strftime(“%Y%m%d-%H%M%S”)}’) ] # ===== 学習 ===== history = model.fit(X_train, y_train, epochs=100, batch_size=128, validation_split=0.2, callbacks=callbacks) # ===== 評価 ===== test_loss, test_acc = model.evaluate(X_test, y_test) print(f”\nテスト精度: {test_acc:.4f}”) print(f”モデル保存先: {save_dir}/best_mnist.keras”)

📝 STEP 15 のまとめ

✅ このステップで学んだこと
  • コールバック:学習中に自動で実行される処理
  • Early Stopping:改善がなければ学習を自動終了(restore_best_weights=True必須)
  • ModelCheckpoint:最良モデルを自動保存
  • ReduceLROnPlateau:停滞したら学習率を自動で下げる
  • TensorBoard:学習の可視化ツール
  • 黄金の組み合わせ:EarlyStopping + ModelCheckpoint + ReduceLROnPlateau
💡 実務で必ず使うパターン
callbacks = [ EarlyStopping(monitor=’val_loss’, patience=10, restore_best_weights=True), ModelCheckpoint(‘best_model.keras’, monitor=’val_loss’, save_best_only=True), ReduceLROnPlateau(monitor=’val_loss’, factor=0.5, patience=5) ] model.fit(X_train, y_train, epochs=100, callbacks=callbacks)
🚀 次のステップへ

これでPart 3「学習の最適化」が完了しました!

次のSTEP 16からはPart 4「畳み込みニューラルネットワーク(CNN)」に入ります。
画像認識の世界を探求しましょう!

📝 練習問題

問題1 やさしい

Early Stoppingのパラメータ

Early Stoppingのpatienceパラメータの意味として、正しいものを選んでください。

  • A. 学習を開始するまで待つエポック数
  • B. 改善がなくても学習を続けるエポック数
  • C. 学習率を下げるまでのエポック数
  • D. モデルを保存する間隔
正解:B

patienceは「待機エポック数」

【patienceの意味】 patience=5 の場合: ・監視している指標が改善しなくても5エポック待つ ・5エポック連続で改善がなければ学習終了 例: エポック10: val_loss=0.08 (最良) エポック11: val_loss=0.09 (改善なし 1/5) エポック12: val_loss=0.085(改善なし 2/5) エポック13: val_loss=0.088(改善なし 3/5) エポック14: val_loss=0.091(改善なし 4/5) エポック15: val_loss=0.087(改善なし 5/5) → 学習終了!
問題2 やさしい

restore_best_weightsの重要性

Early Stoppingでrestore_best_weights=Trueにする理由として、正しいものを選んでください。

  • A. 学習を高速化するため
  • B. メモリ使用量を削減するため
  • C. 最も検証性能が良かった時点の重みに戻すため
  • D. モデルのサイズを小さくするため
正解:C

最良の重みに戻す重要な機能

【restore_best_weights の効果】 Falseの場合(デフォルト): エポック10: val_loss=0.08 (最良) … エポック15: val_loss=0.12 (学習終了) → エポック15の重み(過学習した重み)が残る ❌ Trueの場合: エポック10: val_loss=0.08 (最良) … エポック15: val_loss=0.12 (学習終了) → エポック10の重み(最良の重み)に戻る ✅ 必ず restore_best_weights=True にしましょう!
問題3 ふつう

ModelCheckpointの設定

検証精度(val_accuracy)が最も高いモデルだけを保存したい場合、正しい設定を選んでください。

  • A. ModelCheckpoint(‘model.keras’, monitor=’val_accuracy’, save_best_only=True, mode=’min’)
  • B. ModelCheckpoint(‘model.keras’, monitor=’val_accuracy’, save_best_only=True, mode=’max’)
  • C. ModelCheckpoint(‘model.keras’, monitor=’val_loss’, save_best_only=True, mode=’max’)
  • D. ModelCheckpoint(‘model.keras’, monitor=’val_accuracy’, save_best_only=False, mode=’max’)
正解:B

各選択肢の問題点

A. mode=’min’ が間違い 精度は高いほど良いので mode=’max’ が正しい B. ✅ 正しい設定 monitor=’val_accuracy’: 検証精度を監視 save_best_only=True: 最良の時だけ保存 mode=’max’: 精度は大きいほど良い C. monitor=’val_loss’ が間違い 精度を監視したいのに損失を監視している D. save_best_only=False が間違い すべてのエポックで保存されてしまう
問題4 ふつう

ReduceLROnPlateauの動作

ReduceLROnPlateau(factor=0.5, patience=3)の設定で、学習率が0.001から始まった場合、 3エポック連続で改善がなかったときの新しい学習率はいくつになりますか?

  • A. 0.003
  • B. 0.0015
  • C. 0.0005
  • D. 0.0001
正解:C

factorは学習率に掛ける値

【ReduceLROnPlateauの計算】 factor=0.5 の意味: 新しい学習率 = 現在の学習率 × factor 計算: 0.001 × 0.5 = 0.0005 つまり、学習率が半分になる! factor=0.1 なら: 0.001 × 0.1 = 0.0001(10分の1になる)
問題5 むずかしい

コールバックの組み合わせ

以下のコールバックの組み合わせで、問題があるものを選んでください。

  • A. EarlyStopping(patience=10) + ModelCheckpoint(save_best_only=True)
  • B. EarlyStopping(patience=5) + ReduceLROnPlateau(patience=10)
  • C. ModelCheckpoint + ReduceLROnPlateau + TensorBoard
  • D. EarlyStopping(patience=10) + ReduceLROnPlateau(patience=5)
正解:B

patienceの設定に注意

A. ✅ 問題なし よくある組み合わせ B. ❌ 問題あり! EarlyStopping.patience=5 ReduceLROnPlateau.patience=10 EarlyStoppingが先に発動してしまい、 ReduceLROnPlateauが一度も発動しない可能性がある! 正しくは: ReduceLROnPlateau.patience < EarlyStopping.patience にすべき C. ✅ 問題なし EarlyStoppingなしでも使える D. ✅ 問題なし(推奨パターン) ReduceLROnPlateau.patience=5 EarlyStopping.patience=10 学習率を下げてから、さらに改善がなければ終了 → 理想的な順序!
📝

学習メモ

ディープラーニング基礎 - Step 15

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE