#08 人工知能入門 CNN画像認識
転移学習——学習済みモデルを賢く使い回す
ゼロから学習すると大変
新しい画像分類タスクを作るとき、何万枚もの画像を集めてゼロからCNNを学習するのは大変です。
- データ収集に時間とコスト
- 数日〜数週間の学習時間
- 高性能なGPUが必要
そこで便利なのが転移学習(Transfer Learning) です。
転移学習とは
転移学習とは「あるタスクで学習した知識を、別のタスクに転用する」手法です。
ImageNet(120万枚の一般画像)で学習した
ResNet-50の重み
↓
この重みには「エッジ・テクスチャ・形状・物体パターン」の
知識がすでに詰まっている
↓
自分のタスク(例: 猫の品種分類)に転用する
人間でも「自動車の運転を覚えた人がトラックに乗るとき」に基礎知識を転用しますよね。それと同じ発想です。
ImageNetの重みが価値ある理由
ImageNet(ILSVRC)は約120万枚、1,000カテゴリの巨大なデータセットです。このデータで学習すると:
浅い層の重みが学ぶもの:
→ エッジ、色の境界、テクスチャ
中間層の重みが学ぶもの:
→ 模様、形状、物体のパーツ
深い層の重みが学ぶもの:
→ 物体全体のパターン(犬、車、人間など)
これらの「視覚的な知識」は、猫品種分類でも工場の欠陥検出でも医療画像診断でも、基礎として役立ちます。
2つのアプローチ
転移学習には主に2つの方法があります。
フィーチャー抽出(Feature Extraction)
バックボーンは一切変更せず、ヘッドだけを新しく学習します。
[バックボーン(凍結:重みを更新しない)]
↓
[新しいヘッド(ここだけ学習する)]
凍結(freeze): 重みを固定して更新しないこと。
- メリット: 少ないデータでも過学習しにくい、学習が速い
- デメリット: バックボーンの知識に限界がある(ドメインが大きく違う場合)
ファインチューニング(Fine-tuning)
バックボーンも含めて学習しますが、学習率を小さく設定して細かく調整します。
[バックボーン(学習率を小さく:慎重に更新)]
↓
[ヘッド(学習率を大きく:しっかり学習)]
- メリット: データに特化した微調整ができる、精度が上がりやすい
- デメリット: データが少ないと過学習のリスクがある
実践的な手順
ステップ1: バックボーンを凍結してヘッドだけ学習
import torch
import torchvision.models as models
# 学習済みResNet-50を読み込む
model = models.resnet50(pretrained=True)
# バックボーンを凍結(重みを更新しない)
for param in model.parameters():
param.requires_grad = False
# 最後の全結合層(ヘッド)だけを新しいクラス数に変更
num_classes = 10 # 自分のタスクのクラス数
model.fc = torch.nn.Linear(2048, num_classes)
# model.fc だけ requires_grad=True になる
# この状態で学習 → ヘッドだけが更新される
ステップ2: ある程度収束したらファインチューニング
# バックボーンの凍結を解除して、細かく調整
for param in model.parameters():
param.requires_grad = True
# 学習率を小さく設定(ファインチューニング)
optimizer = torch.optim.Adam([
{'params': model.fc.parameters(), 'lr': 1e-3}, # ヘッドは普通の学習率
{'params': model.layer4.parameters(), 'lr': 1e-4}, # 深い層は小さい学習率
{'params': model.layer3.parameters(), 'lr': 1e-5}, # さらに浅い層はさらに小さく
])
データ量と手法の選び方
| 自分のデータ量 | ドメインの差 | おすすめ手法 |
|---|---|---|
| 少ない | 近い(一般画像) | フィーチャー抽出のみ |
| 少ない | 遠い(医療・衛星画像など) | フィーチャー抽出 + 慎重なファインチューニング |
| 多い | 近い | ファインチューニング |
| 多い | 遠い | ファインチューニング(全層) |
転移学習の効果
転移学習なしの場合 vs 転移学習ありの場合を比較すると:
転移学習なし:
5,000枚で学習 → 精度 72%
転移学習あり(フィーチャー抽出):
5,000枚で学習 → 精度 89%
転移学習あり(ファインチューニング):
5,000枚で学習 → 精度 93%
(数値はイメージ例です)
少ないデータで高精度を達成できるのが転移学習の魅力です。
まとめ
- 転移学習はImageNetなどで学習済みの重みを別タスクに転用する手法
- 学習済みバックボーンにはエッジ・パターン・物体の知識が蓄積されている
- フィーチャー抽出: バックボーンを凍結してヘッドだけ学習。少データに強い
- ファインチューニング: バックボーンも含めて小さい学習率で調整。精度向上
- まずフィーチャー抽出で学習し、その後ファインチューニングという2段階が定石
次回は、CNNの歴史的な進化をたどり、各モデルの「革新点」を一気に見ていきます。