Learn AI with Python · レッスン

ファインチューニング:凍結解除と再学習

base_model.trainable = True、層ごとの凍結解除、差分学習率について学習します。

レッスン 3/413 ステップ

「ファインチューニング:凍結解除と再学習」はCoddyKit上の無料Learn AI with Pythonレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn AI with Python学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn AI with Pythonコースには全4レッスンが含まれています。

ファインチューニングを行うタイミング

特徴抽出でヘッドを学習した後、ファインチューニングによって事前学習済みベースモデルの上位部分をデータに適応させると、精度をさらに高められます。ランダムなヘッドから大きな勾配が発生するとベースモデルを壊す可能性があるため、ヘッドの学習が安定してから行ってください。

ベースモデルの凍結を解除する

base.trainable = Trueを設定すると、重みを再び更新できるようになります。ただし、これだけではすべての層の凍結が解除されるため、通常は強すぎる設定です。

base.trainable = True
print("Trainable layers:", sum(l.trainable for l in base.layers))

最初のN層を凍結する

初期層には、維持したい一般的なエッジやテクスチャの検出器が含まれています。最初のN層を再び凍結し、タスク固有のより深い層だけをファインチューニングします。

base.trainable = True
freeze_until = 100   # keep first 100 layers frozen

for layer in base.layers[:freeze_until]:
    layer.trainable = False
for layer in base.layers[freeze_until:]:
    layer.trainable = True

非常に小さい学習率を使う理由

ファインチューニングには、1e-5のような非常に小さい学習率が必要です。事前学習済みの重みはすでに良好な状態なので、わずかな調整だけを行います。大きな学習率を使うと壊滅的忘却が起こり、必要としていたImageNetの知識が失われます。

凍結解除後に再コンパイルする

trainableフラグを変更した後は、必ず再コンパイルしてください。これによりKerasが、どの重みに勾配を適用するかを再構築します。ここで低い学習率を設定します。

from tensorflow.keras.optimizers import Adam

model.compile(
    optimizer=Adam(learning_rate=1e-5),
    loss="categorical_crossentropy",
    metrics=["accuracy"]
)

2段階のプロセス

  1. フェーズ1(特徴抽出): ベースモデルを凍結し、検証精度が頭打ちになるまで約1e-3の学習率でヘッドを学習します。
  2. フェーズ2(ファインチューニング): 上位層の凍結を解除し、約1e-5で再コンパイルして学習を続けます。

このように分けることで学習が安定し、事前学習済みの特徴を保護できます。

フェーズ2で学習を続ける

initial_epochを使い、フェーズ1が終了した時点から学習を再開します。これにより、ログとスケジュールが連続した状態になります。

history2 = model.fit(
    train_ds,
    validation_data=val_ds,
    epochs=20,
    initial_epoch=10   # phase 1 ended at epoch 10
)

学習率スケジューラー

スケジューラーは時間の経過とともに学習率を減衰させ、モデルの収束に合わせて更新量を小さくします。ReduceLROnPlateauは、検証損失が停滞したときに学習率を自動的に下げます。

from tensorflow.keras.callbacks import ReduceLROnPlateau

lr_cb = ReduceLROnPlateau(
    monitor="val_loss", factor=0.5,
    patience=2, min_lr=1e-7
)
model.fit(train_ds, validation_data=val_ds,
          epochs=20, callbacks=[lr_cb])

BatchNormに関する注意

ResNetとEfficientNetには、移動統計量を追跡するBatchNormalization層が含まれています。ファインチューニング時には、BatchNormalization層を凍結したままにする(または推論モードにする)と、より安定した結果が得られることがよくあります。小規模なデータセットで統計量を更新すると、精度が低下する可能性があるためです。

過学習に注意

微調整では学習可能なパラメータが多数追加されるため、過学習のリスクが高まります。データ拡張、ドロップアウト、検証損失に対するEarlyStoppingで対策します。

from tensorflow.keras.callbacks import EarlyStopping

stop = EarlyStopping(monitor="val_loss",
                     patience=4,
                     restore_best_weights=True)

まとめ

堅牢な微調整の手順は、ヘッドを学習し、上位レイヤーの凍結を解除し、BNを凍結したうえで、1e-5で再コンパイルし、その後スケジューラと早期停止を使って学習することです。微調整によって本当に改善したことを確認するため、必ず前後の検証精度を比較します。

確認テスト

微調整に関する知識をテストします。

まとめ

base.trainable=Trueを設定し、最初のN個のレイヤーを再び凍結し、非常に小さい学習率(1e-5)で再コンパイルして、2段階のプロセスで微調整する方法を学びました。学習率スケジューラと早期停止によって学習を安定させられます。また、BatchNormレイヤーには注意が必要です。次はエッジデバイスへのデプロイに向けた軽量モデルです。

無料で開始

AI チューターと学ぶ Python — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
53
レッスン
225

よくある質問

「ファインチューニング:凍結解除と再学習」レッスンは無料ですか?

はい。「ファインチューニング:凍結解除と再学習」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn AI with Pythonコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn AI with Pythonコースには全4レッスンが含まれています。

「ファインチューニング:凍結解除と再学習」で何を学びますか?

base_model.trainable = True、層ごとの凍結解除、差分学習率について学習します。 ブラウザで直接実行するハンズオンコードでLearn AI with Pythonを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Learn AI with Pythonを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLearn AI with Pythonは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「ファインチューニング:凍結解除と再学習」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLearn AI with Pythonレッスンでコードを書いて実行できますか?

はい。すべてのLearn AI with Pythonレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 転移学習の概念と戦略
  2. VGG16とResNet50をベースモデルとして使う
  3. ファインチューニング:凍結解除と再学習
  4. エッジデプロイメント向けのMobileNetとEfficientNet
← Learn AI with Pythonに戻る