SE_BOKUのまとめノート的ブログ

SE_BOKUが知ってること・勉強したこと・考えたことetc

ネットワーク構造の自動最適化機能を試してみる(その1)/Neural Network Console

Neural Network Consoleの自動最適化機能を試してみます。

f:id:arakan_no_boku:20190326212937j:plain

 

ネットワーク構造の自動最適化機能を試してみる(その1)

Neural Network ConsoleのStructure Search(ネットワークの自動最適化機能について、

リファレンスには以下のように書いてあります。

Structure SearchをEnableにした状態で学習を実行すると、自動的にネットワーク構造を様々に変化させながら、より精度が高く演算量の少ないネットワーク構造を探す最適化が行われます。

これが、いまいちピンとこなかったのです。 

言葉とおりにとると、EDITタブで設計するニューラルネットワークの構造そのものを最適化するように読めます。 

EDITタブのConvolutionとかAffineとかのレイヤーを、自動的に組み替えてくれる・・のでしょうか? 

それとも、ハイパーパラメータを調整して、最適な値を見つけてくれるのでしょうか? 

ちなみに。 

ハイパーパラメータとは例えば以下のようなものです。

  • 各層のニューロンの数
  • バッチサイズ
  • パラメータ更新の学習係数
  • Weight decayの値

すごい重要なのですが、学習によって更新される「重み(Wait)」や「バイアス」とは違って、これは人間が指定してやる必要があります。 

ですが、なかなか最適な値を決めるのは大変です。

これらのハイパーパラメータを自動的に最適化するところまで、Neural Network Consoleのネットワークの自動最適化機能はやってくれるのでしょうか? 

興味あります。

 

とりあえずやってみる

自分の基本スタンスは、とりあえずやってみよう・・です。 

サンプルで用意されたLeNet.sdcprjとMNISTでやってみます。 

 

デフォルトの結果(比較用)

デフォルトのハイパーパラメータで学習・評価した結果はこうでした。 

Epoch数が10と少なめなので、若干学習不足かもしれないですが、まあ比較用なので。

f:id:arakan_no_boku:20180409232111j:plain

これを基準にします。 

 

お試し用に別名で保存

LeNet.sdcprjを開き、適当な別名で保存します。 

Configタブを以下のように変更します。

f:id:arakan_no_boku:20180410002611j:plain

 

Structure Searchを有効にする

Structure SearchのEnableにチェックをつけます。 

上記の設定の数値や選択肢は、ほぼほぼ以下のリファレンスの5番から9番に書いてあるとおりです。

support.dl.sony.com

 

Time Limitの「00:00:30:00」(ようするに30分)は書いてなかったので、自分で決めましたが、これも適当です。  

Time Limitの30分は「Early Stopping」のパラメータです。 

別に時間を指定しなくても、「Early Stopping」にチェックをつけておけば「過去に行った学習結果と学習曲線比較し、同じ世代で倍以上のエラーとなった場合」に学習を打ち切る動きをしてくれるみたいです。 

ただ、どっちが有利かわからないので、とりあえず時間指定で安全をとった感じです。

 

一晩(7時間)ひたすら学習させてみました

Structure SearchをEnableにして学習開始のボタンを押すと、文字とおり、どんどんモデルを組み替えながら、学習を繰り返します。 

自分で止めてやらない限りは永遠に続けるので、適当なところで止めるのだけは忘れないようにしないと・・ですね。 

 

7時間で50パターンが生成されていた

今回は7時間でなんと、50パターンもの学習結果が生成されてました。

f:id:arakan_no_boku:20180410213010j:plain

 

学習が最後までできているものもあれば、途中でキャンセルされているものもあります。 

なるほど・・。 

試行錯誤を自動的にしたんだなあ・・ということはわかります。

 ただ、結論から言えば、今回は結果はよくなかったです。 

一番、よかったもので、Accuracyが91.03%で、基準にしたデフォルトのLeNetの結果にも遠くおよびません。 

 

でも、何をするかはわかった

この自動最適化機能は、Cofigタブで指定した「Epoch数」や「Batch Size」、Optimizerのパラメータ等の「ハイパーパラメータ」を調節するものでは、どうも無さげだということです。 

内部的にはやってるのかもしれませんが、表面的には変化がありません。 

じゃあ、なにを変えているのかというと、リファレンスにある通り「ネットワーク構造」みたいです。 

例えば・・ですね。 

これがベースにしたLeNetです。

f:id:arakan_no_boku:20180410214550p:plain

 これが49回目の学習で使用されたモデルです。

f:id:arakan_no_boku:20180410214631p:plain

 

よーく見ると、「ReLu」が「ELU」に、「MaxPooling」が「AveragePooling」に変わっているとか、真ん中あたりに「DropOut」が挟み込まれたり・・確かに、ネットワーク構造が自動的に変化しています。 

こういう感じでひたすらバリエーションを作って学習して・・と繰り返します。 

 

うまく使えば面白そうではあります。

面白いなとは思います。 

こんな感じで50パターンも試すのは、手動では、相当面倒くさいですから。 

それを自動最適化をさせて、結果の学習曲線などで良さげなものをチョイスして評価し、結果がもっとも良い結果を選んで、それをEditタブに反映させればよいわけです。 

反映のさせ方も簡単です。

採用したい学習結果を右クリックして、「Open in Edit tab」コマンドを選べば、EDITタブに反映させることができますから、手間もかかりませんし。

f:id:arakan_no_boku:20180410221029j:plain

でも、今回のように適当な使い方では宝の持ち腐れっぽいです。

 

今回の反省点

少なくとも今回の反省は以下の2点です。

  • Epoch数は多めにしておく必要がある。
  • Time Limitは指定しない方がよいかもしれない。

 

何故かというと、今回結果の悪かった原因が「学習の途中でぶちきられた」ことで、精度があがっていないものが多かったということがあります。 

もう少し詳しく言うと。 

Dropoutによって学習の進みがなだらかになったので、10Epochでは収束しきれない場合が多かった。 

かつ、学習の進み具合に問題はないのに、途中で終わった・・つまり時間で打ち切られたっぽい・・もあった。 

ということなんですね。 

なので、もう一度チャレンジしてみようかなと思ってます。 

時間がかかるので、その状況と結果は、また別の記事に書きます。 

arakan-pgm-ai.hatenablog.com

ではでは。