ディープラーニングは,GPU付きのPCがないと学習に数週間以上かかったりして,気軽に試しづらかったりします.また,学習データ数も数万以上必要になることが多いことも更にハードルを挙げる要因となっています.
そこで今回はGPUなしのPCかつ少ないデータ数で学習させる方法について紹介します.
対象読者
- GPU付きのPCは持ってないし,AWSとかでGPU付きのインスタンスとか借りるのも嫌だけど,CNNとかで遊んでみたいという方.
- 既製のネットワークではなくて別の目的に特化したネットワークを作りたい方.(例: 顔認識とか流行りそうな絵か判断等)
ディープラーニングの問題点
- GPUなしのPCだと,MNISTやCIFAR10ぐらいしか学習時間的に解ける問題がない.
- 簡単な画像分類問題でも5万枚〜の学習データが必要.
- ネット上に上がっている既存の学習済みネットワークが実際に分類したい項目と異なって使えない.(例: 顔や車種,病気を判別したいのに,どうでも良い分類項目に対して最適化されている)
こういった問題を解決するための手法として転移学習1と呼ばれる手法があります.
転移学習はImageNetなど別の問題で学習済みのネットワークの一部のみを学習させる手法です.
様々な手法が考案されていますが,実用上大事なことは,別の画像分類問題に流用しても上手くいくことが多いということです.2
(例: 草や鳥の分類,顔認識,感情判断など)
転移学習の利点
また以下の利点があるため,気軽に試したいときの有効な手段となっています.
- データ量が少なくて済む(少ない学習データで学習器を作ることができる)
- ある程度大きな画像まで取り扱える.(224x224x3の画像データを処理するCNNとか作ろうとすると学習に数週間以上かかります.)
- GPUがなくても現実的に計算可能な時間で処理できる.
手法は様々ですが,私は最近だと下記手法を使っています.
- 分類したい画像を集める.(頑張って集めてください)
- 間違っている画像を除外する.
- 全結合層を除いた学習済みのネットワークを用いて画像を低次元の空間に落とし込む.
- 低次元の空間と正解との関係をSVM3や勾配ブースティング4を利用して求める.
注). Google画像検索とかで収集すると3割ぐらい間違っているので,注意が必要です.
このように低次元の空間に落とし込むところだけディープラーニングを使うようにすることで,
時間の掛かるネットワークの学習を行わずに,別の高速な学習手法で解くことができるので,GPUなしのPCでも解けるようになります.
数値実験
某アニメのキャラを分類する問題を下記3パターンで解いてみました.
A). チュートリアルで大体登場するシンプルなCNN,(32x32x3)
B). ResNet-50層(32x32x3, 最近の分類問題はだいたいこれが使われている気がします)
C). ResNet-50層(学習済みのネットワーク) + SVM
正答率は,それぞれA). 94.33%, B). 94.57%, C). 93.83%となり,
純粋にCNNで解く場合とほとんど変わらない結果となりました.
注). 学習データの作成時にいくらか間違えてそうなので,真面目な人がやればもう少し性能は上がるかと.
リポジトリ
手法3,4を記述したコードがあります.参考になれば幸いです.
まとめ
転移学習によってGPU付きのPCがなしでも,そこそこ良い性能が出せる転移学習と呼ばれる方法を紹介しました.
用途によりけりかと思いますが,この方法ならGPUなしのPCでも分類できますので,試してみてはいかがでしょうか?
References
-
CNNs in Practice, http://cs231n.stanford.edu/slides/winter1516_lecture11.pdf ↩
-
CNN Features off-the-shelf: an Astounding Baseline for Recognition, https://arxiv.org/pdf/1403.6382v3.pdf ↩
-
サポートベクターマシン, http://www.sist.ac.jp/~kanakubo/research/neuro/supportvectormachine.html ↩
-
勾配ブースティング, https://github.com/dmlc/xgboost ↩