"BOKU"のITな日常

還暦越えの文系システムエンジニアの”BOKU”は新しいことが大好きです。

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

今回は、ディープラーニングだからと言って、闇雲に層を深くしてもダメだということを確認したいと思います。

f:id:arakan_no_boku:20190326212937j:plain

2017/11/30追記

>Version1.10の画面に張り替えました。

>Version1.00と若干結果の数値が変わっていたためです。

 

まず予備知識から

 

ただ、それをするのには「層を深くする」イメージを理解しておく必要があります。

なので・・。

試してみる前に、何の予知知識もないと、ちょっとしんどいので、最初に補足します。

本当にざっくり、細かいところに目をつぶって・・ですが。

 

1層のニューラルネットワークの処理の流れ

 

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

だから、厳密には不正確な部分もありますが、その辺は目をつぶって・・ですね。

ざっくり書くと。

以下の図のような流れになります。

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

その後、答え合わせをして、間違ってたら重みパラメータを少し修正する。

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

そして、そうして調整した重みパラメータを使って、入力データはこのラベルだと予測するのが推論(評価)です。

f:id:arakan_no_boku:20170825221728j:plain

それらのイメージを踏まえて、上記で。

①~③の答えを出すところまでで止めるのが、推論(評価・分類)。

①~④までやって、重みパラメータを更新していくのが学習。 

だと思ってください。

 

一番基本的な代表的レイヤーをピックアップ

 

さて。

今度は上記の①~④に対応する代表的なレイヤーをピックアップします。

後ろの方で試す時に登場するものだけです。 

赤字が、上記の①~④に対応するニューラルネットワークコンソールで用意されているレイヤーの名前です。 

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

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

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

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

 

③と④を補足します。

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

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

 

代表的なレイヤーの組合せパターン

 

 分類したい数が3以上(2値でない)場合は、以下の3パターンの組み合わせが基本的な1層のネットワークになります。

f:id:arakan_no_boku:20170825225440j:plain

  

2値(選択肢が2つしかない)は、上記のSoftmaxCrossEntropyBinaryCrossEntropyに置き換えるわけですが、試してみた感じBinaryCrossEntropyのときは「Sigmoid」との組み合わせの1択になります。

f:id:arakan_no_boku:20170825235309j:plain

 

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

 

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

例えば、こんな感じ。

f:id:arakan_no_boku:20170825235522j:plain

 

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

 

分類したい数が3以上の場合には、3つのバリエーションがあるので、補足します。 

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のデータの性質とかのもろもろの条件によって変わります。 

まあ。

そこで、難しいことを考えると前にすすめません。

とりあえず、3つを差し替えながら、結果の良いものを採用すればいいや・・くらいに考えておけばいいんじゃないですかね。

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

2019/01/28追記

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

arakan-pgm-ai.hatenablog.com

arakan-pgm-ai.hatenablog.com

 

単純に階層を深くしてみる

 

層を重ねていくイメージが頭にできたところで、ニューラルネットワークコンソールを起動します。

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かというと、色々、試した結果、この組み合わせで追加するのが一番結果がよかったからです。 

 

2018/10/3追記

>別にこの組み合わせが万能だというわけではないです。

>たまたま、このデータとモデルの組み合わせを試したら、今回はそうだった。

>まあ、それだけのことです。誤解なきようお願いします。

 

まず、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%をうわまわることはありませんでした。 

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

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

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

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

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

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

このあたりを理論で理解するというアプローチもありますが、少々敷居が高いです。

文系人間にとっては・・ですが。

なので、習うより慣れろで、このあたりの試行錯誤をして感覚を掴んでおくのは、結構大事かもしれないなと思ったりもします。 

ニューラルネットワークコンソールなら、気楽に試すことができますしね。 

今回は、こんな感じで。 

 

カテゴリの一覧

 

arakan-pgm-ai.hatenablog.com

arakan-pgm-ai.hatenablog.com