この要約は
Building powerful image classification models using very little data | The Keras Blog
ディープラーニングでの画像分類には、大量のデータが必要、とよく言われます。
また、ファインチューニングで画像分類を応用したい場合、データはあってもポイントがわからずに、正解率を上げるのに苦労することがあるかと思います。
このチュートリアルは、画像分類を本当に役立たせるためのポイントが解説されている貴重な資料なので、翻訳・要約してまとめました。
参考: こちらのブログでは翻訳を試みられています。
【ディープラーニング】少ないデータで効率よく学習させる方法:準備編 | ニートの言葉
はじめに
- 少ないデータしか利用できないケースはあるの? 高価な医療画像などでよくある話。
- このチュートリアルでは、Dog vs. Cats | Kaggle の画像からの犬猫判別問題を例題として使う。
- 用意されたデータから、8%だけ(犬・猫各1000枚を学習用、各400枚を評価用)を使う。
- Kaggleでは当初、最新技術なしでは60%も難しいと言われていたが、最終的に最新のディープラーニングを使ったチームが98%をマークした。
- ここでは、そのうちたった8%のデータだけで試みる。
ディープラーニングには本当に大量のデータが不可欠なのか
- ディープラーニングでは大量のデータが不可欠と言われるが、少しミスリーディング。
- 本来、少しのデータを使って知覚できるようになるずだ。
モデル設計のポイント:モデルの情報量と過学習
- ここでたった一枚だけの猫画像をオーグメンテーションする例で、過学習の問題を考えてみる。
- 過学習への対策は、結局モデルにどれだけ情報量を持たせるかという課題になる。
- たくさん情報を保持できるようにすれば良いか?そうすると不適切な特徴まで学習してしまうリスクが生じる。
- 一方、モデルが少ない情報だけしか保持できないようにすることで、重要な情報にしか注力できないようになり、この方が全く適切な方針になる。
- モデルの情報保持量を変えるには、まず考えられるのは、層の数や各層のサイズを変えること。
- もう一つの方法として、正則化(L1/L2正則化)で重みの値が小さくなるようにする。
レベル1 - 小さなモデルを学習させる
この例では小さなモデルを、データをオーグメンテーションして、学習ではドロップアウトを使う。
ドロップアウトは同じデータに対してネットワークに違う振る舞いをさせるので、オーギュメンテーションと似た効果がある。
というわけで、90年のLeCunに似た3層、2層の全結合という小さな CNNで学習させた。
結果、約80%の正解率で、Kaggleのコンテスト100位以内を簡単に達成。
レベル2 - 学習済みモデルの利用
もっと洗練されたアプローチとして、学習済みモデルを利用する方法がある。
幅広い問題に適用できるように、「ボトルネック特徴量」の抽出を図る。ボトルネック特徴量=Conv5のMaxPooling2D、全結合の手前の出力。
ImageNetを学習したVGG16を使う。
- モデルの畳み込み層だけを使い、そこに学習・評価用データを一度計算させ、その時の出力(特徴量)を記録しておく。
- 記録した特徴量を使って、小さな全結合層を学習させる。
1では、なぜ普通に畳み込み層を固定して全結合層だけを学習させる方法を取らないのか?
→計算量を抑えるられる。※ただ、このやり方の場合、データオーグメンテーションは使えない。
2では、オーグメンテーションしたデータで学習させる。
以上で、約90%まで正解率が上がる。
レベル3 - ファインチューニング
畳み込み層のうち最終段だけと、上で学習した全結合の分類器を再度学習する。
- VGG16の学習済みモデルをロード。
- そこに、上で作成した全結合層をつなげる。
- 畳み込み層の最終段手前まで固定する
ファインチューニングのポイント
- ファインチューニングするには、適切に学習された重みからスタートさせること。学習勾配が大きいのは禁物で、例えば全結合層に乱数生成された重みを使うと、畳み込み層の重みまで崩れてしまう。だから上では分類器だけ学習させ、この準備をした。
- ファインチューニングの範囲を最後の畳み込み層までに限定することで、過学習を防ぐ。下位の層は汎化されていてセンシティブなので固定、上位の特化されている部分だけをチューニングする。
- ファインチューニングの学習率は、とても遅くする必要がある。最適化手法としてはSGDが良くて、学習率を適応的に扱うRMSpropなどは合わない。
以上で、50エポック経過後、正解率94%を達成する。
更に〜95%以上の正解率を狙うには
- もっとアグレッシブに: データオーグメンテーション。
- もっとアグレッシブに: ドロップアウト。
- L1/L2正則化を使う。
- 畳み込み層のファインチューニングをもう一段増やす。
以上、間違いやコメント等、ご指摘いただければ幸いです。