Neural Network Consoleの自動最適化機能を試してみます。
ネットワーク構造の自動最適化機能を試してみる(その1)
Neural Network ConsoleのStructure Search(ネットワークの自動最適化機能について、
リファレンスには以下のように書いてあります。
Structure SearchをEnableにした状態で学習を実行すると、自動的にネットワーク構造を様々に変化させながら、より精度が高く演算量の少ないネットワーク構造を探す最適化が行われます。
これが、いまいちピンとこなかったのです。
言葉とおりにとると、EDITタブで設計するニューラルネットワークの構造そのものを最適化するように読めます。
EDITタブのConvolutionとかAffineとかのレイヤーを、自動的に組み替えてくれる・・のでしょうか?
それとも、ハイパーパラメータを調整して、最適な値を見つけてくれるのでしょうか?
ちなみに。
ハイパーパラメータとは例えば以下のようなものです。
- 各層のニューロンの数
- バッチサイズ
- パラメータ更新の学習係数
- Weight decayの値
すごい重要なのですが、学習によって更新される「重み(Wait)」や「バイアス」とは違って、これは人間が指定してやる必要があります。
ですが、なかなか最適な値を決めるのは大変です。
これらのハイパーパラメータを自動的に最適化するところまで、Neural Network Consoleのネットワークの自動最適化機能はやってくれるのでしょうか?
興味あります。
とりあえずやってみる
自分の基本スタンスは、とりあえずやってみよう・・です。
サンプルで用意されたLeNet.sdcprjとMNISTでやってみます。
デフォルトの結果(比較用)
デフォルトのハイパーパラメータで学習・評価した結果はこうでした。
Epoch数が10と少なめなので、若干学習不足かもしれないですが、まあ比較用なので。
これを基準にします。
お試し用に別名で保存
LeNet.sdcprjを開き、適当な別名で保存します。
Configタブを以下のように変更します。
Structure Searchを有効にする
Structure SearchのEnableにチェックをつけます。
上記の設定の数値や選択肢は、ほぼほぼ以下のリファレンスの5番から9番に書いてあるとおりです。
Time Limitの「00:00:30:00」(ようするに30分)は書いてなかったので、自分で決めましたが、これも適当です。
Time Limitの30分は「Early Stopping」のパラメータです。
別に時間を指定しなくても、「Early Stopping」にチェックをつけておけば「過去に行った学習結果と学習曲線比較し、同じ世代で倍以上のエラーとなった場合」に学習を打ち切る動きをしてくれるみたいです。
ただ、どっちが有利かわからないので、とりあえず時間指定で安全をとった感じです。
一晩(7時間)ひたすら学習させてみました
Structure SearchをEnableにして学習開始のボタンを押すと、文字とおり、どんどんモデルを組み替えながら、学習を繰り返します。
自分で止めてやらない限りは永遠に続けるので、適当なところで止めるのだけは忘れないようにしないと・・ですね。
7時間で50パターンが生成されていた
今回は7時間でなんと、50パターンもの学習結果が生成されてました。
学習が最後までできているものもあれば、途中でキャンセルされているものもあります。
なるほど・・。
試行錯誤を自動的にしたんだなあ・・ということはわかります。
ただ、結論から言えば、今回は結果はよくなかったです。
一番、よかったもので、Accuracyが91.03%で、基準にしたデフォルトのLeNetの結果にも遠くおよびません。
でも、何をするかはわかった
この自動最適化機能は、Cofigタブで指定した「Epoch数」や「Batch Size」、Optimizerのパラメータ等の「ハイパーパラメータ」を調節するものでは、どうも無さげだということです。
内部的にはやってるのかもしれませんが、表面的には変化がありません。
じゃあ、なにを変えているのかというと、リファレンスにある通り「ネットワーク構造」みたいです。
例えば・・ですね。
これがベースにしたLeNetです。
これが49回目の学習で使用されたモデルです。
よーく見ると、「ReLu」が「ELU」に、「MaxPooling」が「AveragePooling」に変わっているとか、真ん中あたりに「DropOut」が挟み込まれたり・・確かに、ネットワーク構造が自動的に変化しています。
こういう感じでひたすらバリエーションを作って学習して・・と繰り返します。
うまく使えば面白そうではあります。
面白いなとは思います。
こんな感じで50パターンも試すのは、手動では、相当面倒くさいですから。
それを自動最適化をさせて、結果の学習曲線などで良さげなものをチョイスして評価し、結果がもっとも良い結果を選んで、それをEditタブに反映させればよいわけです。
反映のさせ方も簡単です。
採用したい学習結果を右クリックして、「Open in Edit tab」コマンドを選べば、EDITタブに反映させることができますから、手間もかかりませんし。
でも、今回のように適当な使い方では宝の持ち腐れっぽいです。
今回の反省点
少なくとも今回の反省は以下の2点です。
- Epoch数は多めにしておく必要がある。
- Time Limitは指定しない方がよいかもしれない。
何故かというと、今回結果の悪かった原因が「学習の途中でぶちきられた」ことで、精度があがっていないものが多かったということがあります。
もう少し詳しく言うと。
Dropoutによって学習の進みがなだらかになったので、10Epochでは収束しきれない場合が多かった。
かつ、学習の進み具合に問題はないのに、途中で終わった・・つまり時間で打ち切られたっぽい・・もあった。
ということなんですね。
なので、もう一度チャレンジしてみようかなと思ってます。
時間がかかるので、その状況と結果は、また別の記事に書きます。
ではでは。