機械学習を触っている方であれば、転移学習やファインチューニングを聞いたことがある、もしくは触ったことがある方が多いと思います。
転移学習やファインチューニングは、以降で説明する理由から、多くの場面で利用されているのですが、転移学習とファインチューニングの違いをあまり理解せず、曖昧に使用している人が結構いることに気が付きました。
自分も正しく使えているか不安になったので、記事にしてみました。
転移学習やファインチューニングのモチベーション
まず最初に、転移学習やファインチューニングを使用するモチベーションを説明します。
まず、両者に共通することとして、
「目的のタスク以外のデータで学習された学習済みモデルを活用して高精度化もしくは高速化したい」
というものがあります。私たちは、機械学習モデルで目的のタスクを学習させるとき、目的のタスクを実現するために必要となるデータを収集し、データセットを作成します。そのデータセットを用いて、モデルを学習するというのが一般的です。
ここで、最初に問題となるのは、
- 収集したデータセットの量が十分でない
です。自分でデータセットを作成したことがある方なら、データセットを作成する大変さは感じていることでしょう。力技でなんとかなるものであれば、人手を増やして対処するなども可能ですが、さまざまな理由で、少量しかデータを集められない場合が多々あります。とりあえず、データセットの量の壁は突破したとして、次に大抵問題となるのは、
- 学習に時間がかかる
です。現在の機械学習、特に深層学習は膨大なデータによる力技でなんとかなることが多いです。一方で、大量のデータで学習するがゆえ、学習に要する時間は膨大です。すぐに結果が欲しい場合は、大きな問題となるでしょう。
このような場面に直面したとき、みなさんは、どうしますか?
この内容を扱うのが、この記事で紹介する転移学習やファインチューニングです。
それでは、順番に説明していきます。
転移学習とは
転移学習は、データセットの数が十分でない場合において、精度の高いモデルを得るために行うものです。
例えば、Mac製品と、Windows製品を分ける2値分類を行いたいとします。
- 目的のタスク:Mac製品とWindows製品の2値分類
これを実現するには、一般的に、Mac製品とWindows製品の写真をたくさん集める必要があります。しかし、たくさん集めるのが容易ではないとします。この場合、どうすればよいでしょうか?
あくまでも1つの答えですが、画像認識タスク向けにImageNetと呼ばれる大規模なデータセットで学習されている事前学習モデルを入手し、出力層のみ自分の目的のタスク向けに交換し、出力層部分のみを自分で集めたデータセットで学習すると言うものです。
アルゴリズム
転移学習のアルゴリズムは、以下に示すとおりです。
- 学習済みモデルを入手する
- 出力層だけ目的のタスク向けに交換する
- 出力層以外のネットワークの重みは固定する
- 学習ステップ
- 用意したデータセット用いて損失を計算
- 得られた損失を用いて出力層の重みを更新
メリット
メリットはここまで説明してきた通り、データセットが少なくても高い精度が出せることです。
デメリット
デメリットは、目的のタスクに再利用できそうな、類似のタスク(もしくは更に広いタスク)で学習された学習モデルが必要である点です。
例えば、車と電車の2値分類が可能なように学習されたモデルがあっても、それをMac製品とWindows製品の2値分類の使用できるかというと、ちょっと難しいでしょう(試していないので分かりませんが)。
ファインチューニングとは
ファインチューニングは、データセットの数は十分だが、学習に時間がかかるので、より高速に学習を行いたい場合に行うものです。
(補足すると、より高精度化を目指したい場合にも使用できる)
先ほどと同じく、Mac製品と、Windows製品を分ける2値分類を考えたいと思います。
- 目的のタスク:Mac製品とWindows製品の2値分類
これを実現するために、Mac製品とWindows製品の写真をたくさん収集したとします。データの数は十分にあるので、モデルの精度は悪くないです。しかし、学習に時間がかかるのが問題となりました(2値分類であれば問題とならない場合が多いが)。
ここで、学習を高速化するにはどうすればよいでしょうか?
あくまでも1つの答えですが、画像認識タスク向けにImageNetと呼ばれる大規模なデータセットで学習されている事前学習モデルを入手し、出力層のみ自分の目的のタスク向けに交換し、ネットワーク全体の重みを自分で集めたデータセットで学習すると言うものです。
アルゴリズム
ファインチューニングのアルゴリズムは、以下に示すとおりです。
- 学習済みモデルを入手する
- 出力層だけ目的のタスク向けに交換する
- 学習ステップ
- 用意したデータセット用いて損失を計算
- 得られた損失を用いてネットワーク全体の重みを更新
メリット
学習済みモデルで得られたパラメータを初期値として全体を学習するため、精度の高いモデルが直ぐに得られることです。
デメリット
デメリットは、転移学習と同じく、目的のタスクに再利用できそうな、類似のタスク(もしくは更に広いタスク)で学習された学習モデルが必要である点です。ファインチューニングは転移学習とは異なり、ネットワーク全体の重みを学習するため、必ずしも、類似のタスク(もしくは更に広いタスク)で学習されたモデルが必要なわけではありませんが、その場合、ファインチューニングの恩恵が得られないだけでなく、精度が悪くなる可能性すらあります(パラメータが初期値の場合とは異なるため変な局所解に収束するなど)。
ファインチューニングと転移学習の違い
転移学習とファインチューニングの違いは、ネットワーク全体のパラメータの学習をするかしないかです。アルゴリズム的な違いはこれだけですが、更新するパラメータ量が全く異なるため、利用すべき状況が異なります。
更新するパラメータ量が多ければ、学習に必要となるデータセットは大規模になります。更新するパラメータ数に見合うデータ数が準備できなければ、ネットワークは精度を発揮できません。
そのため、出力層以外のパラメータは固定し、出力層のみ学習する転移学習は、学習に用いるパラメータ数が比較的少量で済むため、データセットのサイズが十分でないときに使用できるのです。
一方で、ファインチューニングは、ネットワーク全体のパラメータを学習するため、それなりの量のデータセットが必要になります。
さいごに
この記事では、転移学習やファインチューニングについて、そのモチベーション、定義、違いについて説明してきました。
皆さんは、転移学習とファインチューニングを正しく理解し、使い分けできていましたか?
もし、「使い方を間違っていた!」という方は、もう一回理解した上で、再度試してみてください!
最後までお読みいただきありがとうございました。