アラカン"BOKU"のITな日常

文系システムエンジニアの”BOKU”が勉強したこと、経験したこと、日々思うことを書いてます。

Neural Network Consoleのネットワーク構造の自動最適化機能を試してみる(とりあえず編)/使い方33

 興味はあったのですが、時間がかかりそうなので試していなかったことがあります。

 

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の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パターンもの学習結果が生成されてました。

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では収束しきれない場合が多かった。

 

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

 

ということなんですね。

 

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

 

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

 

ではでは。 

 

f:id:arakan_no_boku:20171115215731j:plain