こんにちは,れいじです.
現在パシフィコ横浜で開催されているSSII2015という学会に参加しています.
明日にポスター発表を控えています.緊張してます.
The 28th Symposium on Sensing via Image Information/Home page
チュートリアルセッションでDeepLearningの話題があったのですが,内容がフムフムなるほど〜〜〜って感じでタメになったので忘れない内にメモしておこうと思います
スライドシェアにスライドが上がっているらしいのですが見つけられない…
Caffeとは
Caffeというのは画像認識に特化したオープンソースのDeepLearningライブラリです.
Caffe | Deep Learning Framework
このブログでもインストールの仕方を色々と解説した記事を書いています
Caffeがどういったものであるかとか,そもそもDeepLearningがどういったものであるかとかはスライドシェアなりブログなり漁ると結構色々記事が出てくると思います.
Caffeを適用する前に考えること
そもそも自分が達成したいタスクがDeepLearningで解決できるものかどうかという事を考えることが重要です.
ImageNetの学習済みモデルをつかってFine-Tuningができそうなタスクであるか
手元に学習に使用できるサンプルが大量に用意できているか
以上2つのどちらかを満たしていなければDeepLearningは諦めたほうがいいようです.
なんでもDeepLearningで解決〜みたいな流れになっていますが,適用するタスクを選ぶことは重要ですね.
Caffeを使用して学習を進める時に気をつけるべきこと
DeepLearningの精度向上に関して重要になるべきパラメータはズバリ学習率.
Bengio先生もこれから集中して頑張るとすれば学習率の見極めと仰るほど重要なパラメータです.
Caffeの中で学習率に相当するパラメータがどれかというと
net: "models/bvlc_reference_caffenet/train_val.prototxt" test_iter: 1000 test_interval: 1000 base_lr: 0.01 <-これ lr_policy: "step" gamma: 0.1 stepsize: 100000 display: 20 max_iter: 450000 momentum: 0.9 weight_decay: 0.0005 snapshot: 10000 snapshot_prefix: "models/bvlc_reference_caffenet/caffenet_train" solver_mode: GPU
いろんな解説ページでもbase_lrは必ず変更しましょうと書いてありますね.
ただ最適な学習率を見つけ出すのは本当に難しいので,Caffeのチュートリアルのprototxt引用しとこうみたいな感じだと思います.それでも大体学習できますからね.
学習率が大きすぎる場合
Caffeを使用して学習を回すと予測誤差と訓練誤差がセットになって出てきますが,
I0813 20:23:56.937995 4618 solver.cpp:232] Iteration 0, Testing net (#0) I0813 20:23:58.769482 4618 solver.cpp:270] Test score #0: 0.0427 <-予測誤差 I0813 20:23:58.769534 4618 solver.cpp:270] Test score #1: 2.30319 I0813 20:23:58.802779 4618 solver.cpp:195] Iteration 0, loss = 2.30285 <-訓練誤差
この訓練誤差が一向に減らない場合,学習自体が破綻している可能性があります.
問題解決の為には,学習率を減らしてやる必要があります.
学習率が大きすぎると,
すぐに精度が頭打ちになる
突然学習が破綻する
などの問題が起きるみたいです.
逆に学習率が小さすぎると,いい線までいくが時間がかかりすぎてしまうとのこと.
学習精度をグラフにして逐一確認しながら学習率を変化させてやるのがベストな方法みたいです.
過学習が起きている場合
過学習が起きるということは,訓練誤差は着実に減るが予測誤差が大きい場合を指します.
これを解決するためにはdropoutの数を増やしたりネットワークそのものを小さくすることで問題解決ができます.
dropoutについてはこちらのブログが参考になります
訓練誤差と予測誤差が殆ど変わらない場合
モデルの表現能力が低いために起こる問題です.非常に惜しい状態なので,ネットワークを大きくしたりニューロン数を増やすことで精度向上に繋がります.
Caffeを使う以外にやっておくこと
散々言われていることですが,学習データの前処理が非常に重要です.特にコントラスト正規化はきちんとやっておくと吉だと思います.
CNNは平行移動に強い不変性を持ちますが,逆に回転に弱いです.各学習データにアフィン変換やクロップなどを施したデータを入れると良いです.
急ぎで書きましたが,とりあえずこれだけメモっておきます.
ではでは!