導入
では具体的に、学習済みモデルをどう「自分用」に作り替えるのか。中心となる2つの操作――出力層の付け替えと層の凍結――を押さえれば、ファインチューニングの手続きは理解できます。
説明
学習済みモデルは「特徴抽出部(前半の層)」+「出力部(最後の層)」に分けて考えます。
flowchart LR in["入力"] --> feat["特徴抽出部<br/>(事前学習で獲得・汎用)"] feat --> head["出力部(ヘッド)<br/>元タスク用: 1000クラス分類"] head --> old["元の出力"] feat --> newhead["新しいヘッドに付け替え<br/>あなたのタスク: 2クラス分類"] newhead --> new["あなたの出力"]
手順は次の通りです。
- 出力層を付け替える:元モデルの最後の層を外し、自分のタスクに合う新しい層(例:2クラス分類)に差し替える。
- 前半の層を凍結する(freeze):特徴抽出部の重みを「更新しない」設定にする。汎用的な知識を壊さないため。
- 少量データで学習する:主に新しいヘッド(と、必要なら後半の数層)だけを訓練する。
凍結とは、そのパラメータの requires_grad を False にして、勾配計算・更新の対象から外すこと(第4章の autograd の応用)。凍結すれば、学習で動くパラメータが減り、少ないデータでも過学習しにくく、速くなります。
3つの戦略
flowchart TD a["① 特徴抽出<br/>前半を全凍結<br/>新ヘッドだけ学習<br/>→ データが少ない時"] b["② 部分ファインチューニング<br/>後半の数層も一緒に学習<br/>→ 中くらいのデータ"] c["③ 全体ファインチューニング<br/>全層を小さい学習率で学習<br/>→ データが多い時"]
データが少ないほど凍結を多く(①)、多いほど広く学習(③)するのが基本方針です。学習率は、事前学習の知識を壊さないよう小さめにするのが鉄則です。
まとめ
- ファインチューニングの核は「出力層の付け替え」と「前半の層の凍結」。
- 凍結=
requires_grad=Falseで更新対象から外し、汎用知識を守る。 - データ量に応じて「特徴抽出(全凍結)→ 部分 → 全体」を選ぶ。学習率は小さめが鉄則。