"BOKU"のITな日常

BOKUが勉強したり、考えたことを頭の整理を兼ねてまとめてます。

レイヤーの層を単純に深くしても、精度は向上しないことを確認する/Neural Network Console

f:id:arakan_no_boku:20190326212937j:plain

目次

はじめに

これは2017年11月の記事のリライトです。

Neural Network Consoleの画面を説明に使っていますが、Version1.10の画面です。

最新のバージョンとは全く違っている可能性がある点、ご容赦ください。

ニューラルネットワークの処理イメージ

専門用語はあえて使ってません。

だから、厳密には不正確な部分も多々ありますが、その辺は目をつぶって、なんとなくイメージできることを目標にして書いてみます。

まず、ニューラルネットワークで学習する流れをざっくり図にしてみました。

f:id:arakan_no_boku:20170825221728j:plain

 

学習の時は、入力データをうけとって、重み(バイアスも含む)パラメータと掛け合わせて計算していった結果を元に、どのラベルである確率が一番高いかを計算した後、答え合わせをして、間違ってたらさかのぼって重みパラメータを少し修正する。

こういうことを繰り返して、重みパラメータを最適な値に調整していくのを「学習」とイメージしてください。

そして学習によって調整された重みパラメータを使って、新たな入力データに対して計算を行って、このラベルが適切だろうと予測するのが推論(評価)のイメージです。

ニューラルネットワークのレイヤー 

上記で①~④の番号をうっている部分を行うのは、ニューラルネットワークコンソールではレイヤーと呼ばれているパーツです。

細かいことに目をつぶり、ざっくりと対応づけてみると、赤字が、上記の①~④に対応するニューラルネットワークコンソールのレイヤーの名前です。 

① 計算(入力×重み+バイアス):Affine

② 次の層に渡す結果を整える:ReLU 又は Sigmoid または Tanh

③ 結果から確率を計算して答えを出す:Softmax

④ 答え合わせをする:CategoricalCrossEntropy又はBinaryCrossEntropy

 

③と④は少し補足します。

③のSoftmax + ④のCategoricalCrossEntropy は説明用にわけてますが、実際は、2つをくっつけたSoftmaxCrossEntropyがあるので、それを使います。

 

④のBinaryCrossEntropyCategoricalCrossEntropyの違いは、分類したい数が2つ(Binary)か3つ以上(Categorical)かになります。

1層のネットワークでのレイヤー組合せパターン 

上記にあげたものだけを使用し、かつ、分類したい数が3以上(2値でないの)場合は、以下の3パターンの組み合わせが考えられます。

f:id:arakan_no_boku:20170825225440j:plain

2値(選択肢が2つしかない)は、上記のSoftmaxCrossEntropyBinaryCrossEntropyに置き換えます。

f:id:arakan_no_boku:20170825235309j:plain

層を重ねていくときは、セットで増やす

層を重ねていくときには、上の2つ(Affine+ReLUまたはSigmoidまたはTanh)のセットで増やしていくのが、まあ、普通のようです。 

例えば、こんな感じ。

f:id:arakan_no_boku:20170825235522j:plain

結果を整える部分(活性化関数)の違い

結果を整える部分にあたるReLU又はSigmoidまたはTanhは活性化関数といいます。

違いをざっくり言えば。

Sigmoid は0.0~1.0、Tanhは、-1から1の間にあてはまるように結果を整理します。

f:id:arakan_no_boku:20170903235222j:plain

 ReLUは、0より小さい数は0にして、0より大きい場合はそのままにする方法で、結果を整理して出力します。

f:id:arakan_no_boku:20170903235710j:plain

こんな感じです。 

どの方法を使うのが最適なのかは、何をしたいかとか、inputのデータの性質とかのもろもろの条件によって変わりますが、最初から難しいことを考えると前にすすめません。

とりあえず、やって結果の良いものを採用すればいいやくらいのノリで進めます。。

簡単に試せるのがニューラルネットワークコンソールのメリットですから。

2019/01/28追記

上記のAffineと活性化関数について、もう少し詳しく説明しているのがこちらです。

arakan-pgm-ai.hatenablog.com

arakan-pgm-ai.hatenablog.com

Neural Network Consoleで試してみる

ニューラルネットワークコンソールを起動します。

f:id:arakan_no_boku:20170825230839j:plain

サンプルプロジェクトで学習・評価する

一番シンプルな「01_logistic_regression.sdcproj」を開きます。 

作業用にするので、名前をつけて保存を選んで、別の名前でプロジェクトを保存しておきます。

f:id:arakan_no_boku:20170825231525j:plain

 

まず、比較元にするために、これで学習と評価をやっておきます。

f:id:arakan_no_boku:20170822232034j:plain

 

評価の結果は、95.4%です。

f:id:arakan_no_boku:20171201000837j:plain

単純に層を深くしてやってみる

 この層を重ねて深くしてみます。 

AffineReluの組み合わせで追加していきます。 

なぜ、ReLuかというと、この時は、この組み合わせで追加したのが一番結果がよかったので選んだというだけの理由です。  

この時はそうだったというにすぎず、万能ではないので念のため。

 

まず、AffineSigmoidBinaryCrossEntropyを引き下げて、間の線を選択して、Deleteキーで消し、Inputの下にAffineReluを追加します。

f:id:arakan_no_boku:20171201001142j:plain 

追加したAffineレイヤーのOutShapeは、28*28の784にします。

f:id:arakan_no_boku:20171201001505j:plain

 それで、上から順にShiftキーを押しながら選択していって、リンクで繋いでいきます。

1層だけ深くして学習した結果 

さて、どうなったか。 

ちょっとガタガタはしていますが、一応収束しています。

f:id:arakan_no_boku:20171201001745j:plain

 

評価した結果は、97.2%。 

1層のときより改善しました。

f:id:arakan_no_boku:20171201001922j:plain

 

このレベルなら、深くした方が改善するみたいです。 

もう一層増やしてみる 

もう1層 AffineとReluの組み合わせを追加してみます。

f:id:arakan_no_boku:20171201002742j:plain

 

学習してみた結果はこんな感じ。

f:id:arakan_no_boku:20171201003250j:plain

 収束はしてますが、Validation Errorは先程より増えてます。 

評価した結果はというと、96%・・。 

先程より、結果が悪くなりました。

f:id:arakan_no_boku:20171201003343j:plain

まとめ:単純に層を重ねても全然ダメ

このあと、8層くらいまで追加してやってみました。 

結果的には、2層のときの97,2%をうわまわることはありませんでした。 

おそらく、誰が試しても、そんな結果になるはずです。

層が増えると学習にかかる時間は、どんどん長くなります。

だから、時間がかかって結果が悪化するのであれば、意味がないということです。 

どのくらいの層で最良の結果がでるか。

これは、組んだネットワークによっても違います。

もちろん、対象とするデータによっても違います。 

このあたりを理論で理解するというアプローチもありますが、いきなり数式に取り組むのは、文系人間には少々敷居が高いです。

とりあえず、気軽にためせるニューラルネットワークコンソールでイメージをつかむことからはじめるってのも、いいんじゃないかと思うわけです。。 

今回は、こんな感じで。 

ではでは。