LoginSignup
9
5

More than 5 years have passed since last update.

Fine-Tuningの学習データはどこまで減らせるのか?

Last updated at Posted at 2018-02-13

転移学習やFine-Tuningでは、比較的少ないデータ数でもカテゴライズできるという神話がある。
しかし、どの程度のデータ数ならある程度信頼できる識別器ができるのかというのは、なかなか記載がない。

前回の記事
「AKB2017総選挙ランキング上位者のFine-Tuning その2~顔抽出と少数データ」
https://qiita.com/MuAuan/items/4ab6c3d9c5ad6f5c98cc
で見たように、一応識別器はできるが、それはどこまでのデータに適用可能なのかは、正直よくわからない。

実験的な試行検証

ということで、ここでは以下のような実験的な試行を実施して、検証したいと思う。

①前回は全体データ数を減少させていったが、今回は同数データに対して、TrainデータとTestデータの割合を変更して、一致率の変化を見る
②Trainデータはどこまで減らせるのかをみるため、元データ数を可能な限り小さくして学習の収束性を見る
※ただし、Trainデータ5個以下のデータは、Augmentationして8倍に増やした

結果

①TrainデータとTestデータの比率を変える

結果は、立ち上がりはTrainデータの割合が減少すると徐々に遅くなるのは、前回と同じだが、test_accはかなり良い結果が得られ、【Train50%、Test50%】でも70%程度の精度が得られた。そして、【Train10%、Test90%】でさえ40%弱の精度が得られている。これは、ばらつきはあるが、Trainデータがそれぞれ10個程度あれば、40%程度の識別器ができることになる。
【注意】データは、前回の記事と異なり(本来同じデータでやりたいが、残念)、クレンジングされたカテゴリ毎に100個位から120個位までばらつきがあるデータを利用
【Train90%、Test10%】ResNet50【90層固定】
val_acc&train_acc.png
【Train80%、Test20%】ResNet50【90層固定】
val_acc&train_acc.png
【Train50%、Test50%】ResNet50【90層固定】
val_acc&train_acc.png
【Train20%、Test80%】ResNet50【90層固定】
val_acc&train_acc.png
【Train10%、Test90%】ResNet50【90層固定】
val_acc&train_acc.png

   条件  val_acc 立ち上がり/epoch
90%, 10% 85% 20
80%, 20% 82% 20
50%, 50% 73% 35
20%, 80% 55% 85
10%, 90% 37% 220

②Trainデータはどこまで減らせるのか?

上記で見れば、普通の精度のいい識別器は少なくともTrainデータ割合70%程度でフィッティングすればいい気がするが、実際50%のデータでも70%の精度が出ており、かなり汎用性は高いと評価できる。
そして、10%の結果は、識別器が学習するという意味では、10個程度のデータがあれば、ある意味ちゃんとした識別器が作成できるということである。
さらに、Trainデータを削減しても収束するのか?
10%というのは10個程度ということを示すので、以下半分の5個、4個、3個、2個、そして元データ1個で識別器が収束するのか?そして、それでどこまで識別できるのかを見てみた。
【Train5個、Test残り】ResNet50【90層固定】
val_acc&train_acc.png
【Train4個、Test残り】ResNet50【90層固定】
val_acc&train_acc.png
【Train3個、Test残り】ResNet50【90層固定】
val_acc&train_acc.png
【Train2個、Test残り】ResNet50【90層固定】
val_acc&train_acc.png
【Train1個、Test残り】ResNet50【90層固定】
val_acc&train_acc.png

   条件  val_acc 立ち上がり/epoch
5, res. 37% 30
4, res. 34% 52
3, res. 32% 60
2, res. 23% 95
1, res. 22% 150

上記の結果は、ある意味驚きである。特に1個のデータは立ち上がりこそずいぶん遅いし、だらだらであるが、train_acc20%程度つまり、各カテゴリ20個程度は識別できている。また、5個程度のTrainデータは35%程度の識別率でこれでも分野によっては、或いは当初データクレンジングするには有用な識別器になると思う。
もちろん少数データでの学習には過学習という問題は当然あるのだが、その影響を考慮すれば上記結果は予想以上の識別率だといえる。

上記の結果をグラフにすると以下のようになった。
5個以下のデータ数が小さいところではAugmentationを実施しており、ちょっと誤差もありそうだが、全体としてはほぼ一様な変化をしていると言える。
FR vs. Data.png

あまりにもきれいな直線に乗ったので、近似曲線
y = 21.324ln(x) - 10.761 , x>10
R² = 0.9963
y;Fitting_Ratio x;Fraction of Training data

まとめ

①データ割合が10-90%の範囲で、比較的簡単な関係があり、フィッティング率はデータ割合の対数に対してリニアな関係がある。
②データ割合を変更して、フィッティング率をみると、Trainデータ70%以上だと80%以上の十分な精度がえられた。
③Trainデータ50%でも70%程度の精度が得られ、十分なTestデータで検証されているので、ある意味汎用性のある識別器を作成できている。
④Trainデータは、1個でも8倍のAugmentationにより、それなりの識別器を作成できた。
【Augmentation】
画像の8倍水増しは以下のサイトより
「機械学習で乃木坂46を顏分類してみた」
http://blog.aidemy.net/entry/2017/12/17/214715

課題

過学習を考えたとき、Trainデータ1個でも、適切なAugmentationを実施すれば、さらに識別率を上げることができそうである。例えば最近のstarGANを利用すれば、笑顔や怒った顔、変顔など出力でき、かなり確実な精度向上を期待できそうである。
そもそも、データにいろいろな外部要因を付加して、バリエーションを持たせる技術というのを確立することは、今後のDeepLearningの発展が大量データ分析に依存している現状を打破する可能性があると考えられる。
【参考】
「Official PyTorch Implementation of StarGAN」
https://github.com/yunjey/StarGAN
「StarGANで顔イラストの表情変換」
https://qiita.com/mattya/items/e71ea1d203b110013753

以下は、ちょっと系統違うけど、少ないデータで識別器作っています。
「細胞種を機械学習で判別する!」
https://lp-tech.net/articles/e0mRJ

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5