転移学習の基本とファインチューニング

PyTorchにおける**転移学習(Transfer Learning)ファインチューニング(Fine-tuning)**は、限られたデータで高精度なモデルを構築するために非常に有効な手法です。以下では、それぞれの基本概念とPyTorchにおける実装方法について詳しく説明します。


1. 転移学習の基本概念

概要

転移学習とは、別のタスクで学習されたモデルの知識(重み)を再利用して、新しいタスクに適用する手法です。たとえば、大規模なImageNetデータセットで学習された畳み込みニューラルネットワーク(CNN)の特徴抽出部を、新しい小規模な画像分類タスクに活用できます。

転移学習の主な戦略

  1. 特徴抽出(Feature Extraction)
    事前学習済みモデルの重みを固定(requires_grad = False)し、出力層のみ新しいタスク用に置き換えて学習する。

  2. ファインチューニング(Fine-tuning)
    事前学習済みモデル全体または一部の層の重みを再学習可能にして微調整する。


2. PyTorchでの転移学習の手順

ステップ1:事前学習済みモデルの読み込み

python
import torchvision.models as models model = models.resnet18(pretrained=True) # ImageNetで学習済みのResNet-18

ステップ2:パラメータの固定(特徴抽出の場合)

python
for param in model.parameters(): param.requires_grad = False

ステップ3:最終層の置き換え

python
import torch.nn as nn num_classes = 10 # 例えばCIFAR-10のような分類タスク model.fc = nn.Linear(model.fc.in_features, num_classes)

ステップ4:ファインチューニングする場合の設定

特徴抽出ではなくファインチューニングを行う場合、固定する層を部分的に変更する:

python
for name, param in model.named_parameters(): if "layer4" in name or "fc" in name: # 最後のブロックと全結合層のみ学習 param.requires_grad = True else: param.requires_grad = False

3. 転移学習での学習ループ(概要)

python
import torch.optim as optim # 学習対象のパラメータのみをoptimizerに渡す params_to_update = [p for p in model.parameters() if p.requires_grad] optimizer = optim.Adam(params_to_update, lr=1e-3) criterion = nn.CrossEntropyLoss() # 学習ループ(簡略化) for epoch in range(num_epochs): model.train() for inputs, labels in dataloader: outputs = model(inputs) loss = criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step()

4. 注意点とベストプラクティス

  • 転移学習では入力サイズを事前学習モデルに合わせる必要があります(多くのモデルでは224×224)。

  • ファインチューニングでは過学習に注意し、学習率を小さめに設定するのが一般的です(例:1e-4など)。

  • ImageNetで学習されたモデルは、一般的な画像の特徴(エッジ、形状、パターンなど)をすでに捉えているため、少ないデータでも効果が出やすいです。


まとめ

項目 特徴抽出 ファインチューニング
重みの更新 出力層のみ 一部または全層
学習速度 速い 遅い(計算コスト大)
精度向上の余地 限定的 高い可能性あり
適用場面 小規模データ タスクが元タスクと異なる場合

PyTorchでは、torchvision.modelsモジュールから容易に事前学習済みモデルを使えるため、実験と応用がしやすく、非常に強力なフレームワークです。

生成日:2025/05/22