ファイン・チューニング (fine-tuning) 【深層学習】

記事を共有する:

1. ファイン・チューニング (fine-tuning) とは [概要]

ファイン・チューニング (fine-tuning)とは,大規模データセットから事前学習済みのディープニューラルネットワークを初期パラメータとして使用して,事前学習時とは異なる目的タスク向けの別データセットを用いて転移学習を実施する,DNNパラメータの再調整・微調整作業のことをいう.CVMLエキスパートガイドでは,ファイン・チューニングのことを「精密調整」とも,独自に日本語訳しておきたい (※ 理由は4節で詳しく).

この記事では,コンピュータビジョン分野での(深層)転移学習のうち,「ImageNet事前学習済みCNNに,目的タスクでファイン・チューニングを行う」ことの狙い(2節)と詳細な手順(3節),の紹介を行う.以下の転移学習の記事も同時に開いた状態で,この記事を読むことを強くオススメする:

あらかじめ事前学習済みのCNNは,ImageNetのような大規模なデータセットから大掛かりな学習を行い,どのタスクでも通用するような「汎用的な画像特徴表現」が抽出できるように,学習されている.従って,目的タスクでは,小規模のデータセットのみ準備し,CNNヘッドに近い部分だけを少し再調整するだけで,高精度な画像認識CNNを,毎回スクラッチからの学習をするよりも,低計算コストで学習できる.

※モデル全体のうち「再学習してチューニングする部分をどのくらいの量にするか」の考え方は,3.3節にて解説.

このように,事前学習済みCNNの再調整だけで,少規模データセットから,高精度モデルを各タスク向けに学習できることが,ファイン・チューニング(による転移学習)の最大のメリットである.言い換えると,ファイン・チューニングのおかげで毎回「大規模データセットを用意して,スクラッチからの学習をする」必要がなくなるとも言える(1.2節)

1.1 記事の構成

2節以降は,以下の構成である:

  • 2. 「事前学習→ファイニンチューニング」の狙い
  • 3. 「事前学習→ファイニンチューニング」の手順詳細
    • 3.1 事前学習:大規模データから汎用的表現を学習.
    • 3.2 精密調整:小さい別データセットに対して,精密に調整.
    • 3.3. CNNの「ファイン・チューニング度合い」の決め方
  • 4. 「精密調整(fine-tuning)」と(管理人は)翻訳した理由
  • 5. まとめ

1.2 [事前学習 → ファイン・チューニング]の概要

精密調整 (fine-tuning)
図1. 精密調整 (fine-tuning)

転移学習の後半処理の1種である「ファイン・チューニング(図1)」の狙いは,汎用性の高い「事前学習済みネットワーク」を,潜在表現がそう遠くない別タスクのネットワーク学習に,有効利用することである (2節で詳細).その目的のもと,「事前学習(図1-a) → 別タスクでファイン・チューニング(図1-b)」の手順で,転移学習を実施する(3節で詳細).

精密調整では,「大まかな初期解」に相当するImageNet事前学習済みCNNにを,少規模の目標タスク向けデータセットで,更に最適化を行い目標タスクのCNNを手に入れる.高精度なCNNの学習,を各目標タスク向けに(事前学習よりは)少なめの規模のデータセットで,比較的短時間での最適化のみで済ませることができる.

言い換えると,毎回各タスクで「大規模のデータとラベル」を用意したうえで,毎回ランダム重み初期化状態からスクラッチからの学習を行う必要がなくなる.これは,各タスクで大規模データセットを用意する必要を無くしているので,データセット作成を省略できることに繋がる.

また,ファイニンチューニングは,事前学習済みCNNを初期解とみなした粗から密への最適化(Coarse-to-Fine Optimization)であるとも取れる.よって「控えめのSGD学習率」を用い,なおかつ「小規模のデータセット」だけ構築しておけば,目的タスク向けCNNを効率的に学習できるメリットもあると言える.

2. [事前学習→ ファイン・チューニング]の狙い

先に事前学習済みのDNN(この記事では特に物体認識CNN)を,別タスクのデータセットで精密調整することには,以下の2つの表裏一体な狙いがある:

  1. 「汎用性の高い初期表現」の,事前学習による抽出.
  2. 「初期表現(パラメータ初期値)を事前学習結果に使用する」ことで,様々な各目的タスクにおけるCNN学習時間を短縮.

2.1 [狙い1] 事前学習での,再利用性・汎用性の高い表現の抽出.

予め,大規模なImageNetデータセットから事前学習を行っておくことで,識別力の高く(discriminative),汎用的な表現を(CNNバックボーンに)事前学習CNNにうまく獲得出来ているとみなせる.よって,あとは事前学習済みCNNを,各タスクのデータセットで,ファイン・チューニングのみ行えば,数時間から数十時間程度の再学習で,各タスク向けのCNNを(End-to-End)学習できるメリットが出てくる.つまり,短時間の学習で,高精度なCNNを学習しやすくなるわけである.

様々なタスクで通用する汎用的な画像特徴表現(特に序盤層が抽出する低~中レベル特徴量)を抽出できる畳み込み層群を,事前学習済みのCNN(例えばVGGNet)などが,CNNバックボーン部に学習できている.すると他のタスク向けに事前学習済みCNNをファイン・チューニングする場合は,そのCNNの序盤~中盤の重みはフリーズしておけばよく,再学習・再調整する必要がなくなる.逆にいうと,残りの終盤(CNNヘッド部分)だけを,目標のタスクのデータセットで,「事前学習済みの重み or ランダム重み初期値)」から学習していけば,実用的な予測精度のCNNを低コストに学習することが可能なわけである.

2.2 [狙い2] 優秀な事前学習済み表現を活用しての,データセット構築や,ファイン・チューニングの効率化

(当初は)数週間もかかっていた時間コストの高い「ImageNetによるCNNのスクラッチからの学習」を,何度も1から行う時間の無駄を「事前学習→精密調整」により,カットして効率的な深層学習(=ファイン・チューニングのみで済ます)を実施することができる.そのCoarse-to-Fineな学習時間の短い(転移)学習が,様々な下流タスク(3.1節で整理)で実施できるので,ImageNet事前学習済みの物体認識CNN(のバックボーン部分)を,共通の基点(初期解)として転用できるところに,「事前学習→精密調整」の旨みがあるとも言える.

また,ファイン・チューニングの効率そのものもあるが,これにより「目的タスクのデータセット構築の規模縮小」の効果も出てくる.2.1でも論じたように「ImageNetなどの超巨大なデータセットの構築」や,その「超巨大データセットから毎回スクラッチの学習」することは,現実的なコストに収まらない.それが,各タスクの数千~数万枚程度の画像の収集と,その正解ラベルのアノテーションで作業が済むことは(例:ADE20KCUB-200-2011COCOデータセットなど),多大な時間的・計算量的コストメリットをうみだすわけである.

3. ファイン・チューニング(精密調整)の詳細手順

ファイン・チューニング (fine-tuning, 精密調整)
図1(再掲). ファイン・チューニング (fine-tuning, 精密調整)

ファイン・チューニング(図1)では,2つの手順「1. 事前学習 [図1-a]→ 2. 精密調整 [図1-b]」を通して,汎用的な画像表現を取得済みのImageNet事前学習済みCNN(物体認識)を,その他のタスクデータセットで高精度CNN(物体検出意味的分割)へと,精密に調整する.

理解度をあげるために,物体検出CNN (Faster R-CNNなど)を精密調整する例を考えておきたい(図1).

この場合,以下の2段階で「事前学習→精密調整」を実施する:

物体検出での「事前学習→ファイン・チューニング」の処理手順

  1. 事前学習 [図1-a] (3.1節):
    • 物体認識タスクのImageNetを用いて,CNN識別器を教師あり学習 (2.1節)
  2. ファイン・チューニング(精密調整) [図1-b] (3.2節):
    • CNNバックボーン
      • 事前学習済みの重みを初期値にして,SGDで再調整.
      • 前半〜中盤は,重みを固定して学習しない(※ 汎用性の高い低レベル特徴を検出できる部分なので.).
    • CNNヘッド:
      • 物体認識向けの終盤層から,物体検出むけの(マルチタスク)ヘッドに変更.
      • それらのヘッドは,重み初期化しておいたランダム初期値から,スクラッチからの学習することなる
    • 以上のCNNバックボーン+ 新ヘッドをEnd-to-Endに学習 (= 精密調整)

以降,各節で,この2段の処理を,それぞれもう少しだけ詳しくみていきたい.

3.1 事前学習:大規模データから汎用的表現を学習.

関連記事:事前学習(pre-training) T.B.D

事前学習(図1-a)では,別タスクの大規模データセット $\mathcal{D}_{\text{pre}}$ (今の例の場合はImageNetデータセット)を用いて,CNNの教師あり学習を準備として行っておく.これは,次の精密調整(2.2節)を行うための準備である.

例えば,以下の表にあげたような,類似タスク間(データセット間)で, 画像認識向けCNNの精密調整を用いた転移学習が行われる:

事前学習タスク ( $\mathcal{D}_{\text{pre}}$ )精密調整先($\mathcal{D}_{\text{target}}$)
物体認識 (ImageNet)細粒度物体認識 (CUB200, CARS196など)
物体認識 (ImageNet)物体検出 (Pascal VOC 2012, COCOなど)
物体認識 (ImageNet)意味分割 (Pascal VOC 2012, ADE20K , Cityscapse など)

このあとの精密調整では,$\mathcal{D}_{\text{pre}}$ とは別の,ターゲットタスクのデータセット $\mathcal{D}_{\text{target}}$ へと,学習後のCNNの画像表現が,お互い結構近いが期待できるタスク同士で,精密調整(次の3.2節)によって表現の転移が達成であることを仮定する.あまりに遠すぎる表現への転移が必要なターゲットタスクへは,「狭い探索領域のみを対象に,短時間でチューニングを終わらそう」という精密調整の目論見は成立しない.

3.2 精密調整:中規模の別データセットだけで,精密に調整.

事前学習済みのCNNの重みパラメータを,どこからかコピーしてきたのち,精密調整先のタスク(の出力)にあうようなヘッドを,CNNバックボーンの後に結合し,目標タスクむけのCNNにまず改造する (図1-b 左).

この改造済みCNNを,ターゲットタスクのデータセットである$\mathcal{D}_{\text{target}}$ を用いて,SGDで学習する.初期値については,バックボーン部分は,事前学習済みの重み値からスタートし,ヘッド部分はランダム重み初期化で初期パラメータ値を与える.この状態から,新たな「CNNバックボーン+ヘッド」の全体を,少し抑えめの学習率を用いてSGD学習することが,CNNの精密調整の基本形である.

※ ファイン・チューニングは「CNN全体を最適化」とテキスト類ではよく説明される.しかし,もっと正確に言うと,ヘッドの出力層部分だけはスクラッチからの学習に相当しているゆえ,精密調整では「バックボーン部分のみ,fine-tuningしている」とも言える.Kevin Patrick Murphy氏の pml-book Introduction においても,解説部分と Figure 19.2 で「バックボーン部分のみがfine-tuneに相当する」ことが,図示されている.

3.3 CNNのファイン・チューニング度合いの決め方

ファイン・チューニングする際に,「コピーしてきた事前学習済みCNNのパラメータを,どれくらい再学習すべきか(逆にfreezeにしたままにすべきか)」は,ソースとタスクのデータの関係性によっておおよそ決めることができる.2データセット間で,生データの表現(=序盤層が抽出していく低レベル特徴)が近いほど,あまりチューニングしないでよく,逆に事前学習データと比べて,ターゲットデータの様子がだいぶ異なる場合は,そのぶん強めに序盤~中盤のから再度チューニングするべきとなる.

また,モデルの規模次第で,当然ファイン・チューニング時の再学習度合いは,「学習時間コスト」とトレードオフが発生する.せっかく転移学習しているのに,みっちりCNN全体を再学習すると、結局学習に時間がかかってあまり意味ない面があるので,この観点のバランスを考えるのも賢明である. 

シェルダン氏によるDLチートシートの,「深層学習のアドバイスやコツ」ページにも,転移学習での重み再学習度合いを「大 > 中> 小」にすることで変わってくる「転移学習の,学習時間やデータとのトレードオフ」の話が,図つきで議論・整理されており参考になる(※ パラメータチューニング>重みの初期化>■転移学習 の節に書かれている).

また,農学情報処理:転移学習 | 転移学習を利用した物体認識(画像分類)技術のページでは,「データ量・データ類似度」の2つの判断軸をもとに,事前学習モデルのうち,「Freeze-trainの割合」をどのくらいに設定するべきかの判断基準が図つきで提示されており,こちらも参考になると思う.

4. 「精密調整 (fine-tuning)」と翻訳した理由

「深層学習向けのファイン・チューニング」は,中国圏では「微调 (「微調整」の意味)」と翻訳されている.たしかに,音楽の調律などでも,音程の調弦・調律の最終的な高精度調整のことを「fine-tune」と呼ぶし,その意味のfine-tuningは,英文辞書でも「微調整」と出てくる.その他,技術分野でも,最終的な(ファインな)チューニングのことは「微調整」と日本語訳されていることが多い.

しかし,深層学習では,最適化における疎から密への(Coarse-to-Fine)最適化の文脈から「fine-tuning」と呼ぶようになった.したがって「微調整」という日本語訳では,「coarse-to-fineのfineステージに対応している」というニュアンスが伝わりきらない.つまり,ディープラーニングの転移学習では,事前学習がcoarse-tuning(疎探索)に相当し,そのあとで,coarse-tuning済みの初期解から,高精度で精密なfine-tuning(密探索)を,(控えめの学習率ではあるが)学習時間も多めに費やして,やや広いパラメータ空間で解の探索を行う.

また,事前学習後の初期解はそれほど目標タスクの解に近いわけではなく汎用的な初期解である.各下流タスクでは,そこそこ広いパラメータ空間内で,fine-tuningする必要があるので,「微」調整と直訳すると,その「fineステージ 最適化」実体とは感覚的にズレてしまい,「あと少しの両力で,目的タスクでのfine-tuningはすぐ収束まで到達する」ように誤解してしまう人も出てくると思う.

よってfineステージ-tuningが実施する実際の内容と,ニュアンスを一致させたいいみで,管理人は,精密調整(fine-tuning)と翻訳することとした.つまり,fine-tuningは「高度で,な探索」であるゆえに,「精密調整」と翻訳する.

5. まとめ

この記事では,画像認識CNNのファインチューニングについて,概要を整理した.とりわけ,ImageNet事前学習から,画像認識タスク同士で他タスクへ精密調整する手順と,タスク例の整理を行った.精密調整の1ステージにあたる,事前学習については,事前学習の記事にもう少し詳しく書きたい.

また,ResNet定着後はネットワーク全体をスクラッチからの学習することも可能になり,「事前学習→精密調整」のパターンを用いないことも,画像認識界隈だと増えていることには注意されたい (以下記事の,3.2節に詳細):

なお,超巨大モデルである近年のTransformer系大規模モデルでは,パラメータ数が膨大になってきた.ゆえに,これまでの通りの「事前学習→精密調整」で転移学習する方針では,計算コストも多大になり効率が悪い.そこで「より効率的な転移学習」戦略として,アダプター(adapter)を間に接続する方法なども考えられ,とりわけ,Transformer型ネットワークや,V-Lモデル(CLIPなど)向けに,そうした効率的な転移学習手段も研究されている.

関連書籍

References

参照外部リンク