パラメータの固定と再学習

PyTorchにおける「転移学習と事前学習モデル」の文脈でのパラメータの固定と再学習(Freezing and Fine-Tuning)について詳しく説明します。


1. 概要

**転移学習(Transfer Learning)**では、ImageNetなどの大規模データセットで事前に学習されたモデルを、新しいタスクに再利用します。主な方法としては、以下の2つがあります:

  1. 特徴抽出(Feature Extraction):事前学習されたモデルの重みをそのまま使用し、最後の分類層だけを学習し直す。

  2. ファインチューニング(Fine-Tuning):事前学習済みモデルの一部または全部のパラメータを再学習させる。

このとき、**パラメータの固定(freezing)**とは、モデルのある層の重みを更新しないようにすることです。一方で、**再学習(fine-tuning)**は、重みを初期値からではなく事前学習済みの値から再調整する学習方法です。


2. パラメータの固定(Freezing Parameters)

方法

PyTorchでは、requires_grad属性を用いて特定の層のパラメータを固定できます。

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

あるいは一部の層のみを固定する場合:

python
for name, param in model.named_parameters(): if "layer4" not in name: # 例えば ResNet の layer4 だけ再学習したい場合 param.requires_grad = False

効果

  • 学習時間が短縮される。

  • 小さなデータセットでも過学習を防止しやすい。

  • 既存の特徴量抽出器(例:ResNetの畳み込み層)をそのまま活用できる。


3. パラメータの再学習(Fine-Tuning Parameters)

方法

モデル全体、または一部を再学習対象にするには、requires_grad=Trueに設定してオプティマイザに登録します。

python
# 例: 全体を再学習する場合 for param in model.parameters(): param.requires_grad = True # 最終層のみ再学習する場合 for param in model.fc.parameters(): # ResNetの全結合層など param.requires_grad = True optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=1e-4)

ファインチューニングのタイミング

ファインチューニングは以下のように段階的に行うこともあります:

  1. 最初は全体を固定して、最終層のみ学習

  2. 精度が頭打ちになったら、上位層から順に再学習を許可


4. 使用例:torchvision.modelsを使った実装

python
import torchvision.models as models import torch.nn as nn # 事前学習済みのResNetをロード model = models.resnet18(pretrained=True) # パラメータを固定 for param in model.parameters(): param.requires_grad = False # 最終層を置き換え(例: 2クラス分類) num_ftrs = model.fc.in_features model.fc = nn.Linear(num_ftrs, 2) # 最終層のみ再学習 optimizer = torch.optim.Adam(model.fc.parameters(), lr=1e-3)

5. まとめ

項目 内容
パラメータの固定 モデルの一部の重みを更新しない。特徴抽出として利用。
再学習 モデルの一部または全部の重みを微調整。既存知識を生かしつつ最適化。
適用例 少量のデータセットや計算資源が限られる場合に有効。
実装方法 requires_gradを用いて学習可否を制御し、オプティマイザに反映。

必要に応じて、特定の層の名前や構造に基づく制御も可能です。実験的に、どの層を固定/再学習するかを調整することで、性能向上が期待できます。

生成日:2025/05/22