目次
- はじめに
- ニューラルネットワークの処理イメージ
- ニューラルネットワークのレイヤー
- 1層のネットワークでのレイヤー組合せパターン
- 層を重ねていくときは、セットで増やす
- 結果を整える部分(活性化関数)の違い
- Neural Network Consoleで試してみる
- まとめ:単純に層を重ねても全然ダメ
はじめに
これは2017年11月の記事のリライトです。
Neural Network Consoleの画面を説明に使っていますが、Version1.10の画面です。
最新のバージョンとは全く違っている可能性がある点、ご容赦ください。
ニューラルネットワークの処理イメージ
専門用語はあえて使ってません。
だから、厳密には不正確な部分も多々ありますが、その辺は目をつぶって、なんとなくイメージできることを目標にして書いてみます。
まず、ニューラルネットワークで学習する流れをざっくり図にしてみました。
学習の時は、入力データをうけとって、重み(バイアスも含む)パラメータと掛け合わせて計算していった結果を元に、どのラベルである確率が一番高いかを計算した後、答え合わせをして、間違ってたらさかのぼって重みパラメータを少し修正する。
こういうことを繰り返して、重みパラメータを最適な値に調整していくのを「学習」とイメージしてください。
そして学習によって調整された重みパラメータを使って、新たな入力データに対して計算を行って、このラベルが適切だろうと予測するのが推論(評価)のイメージです。
ニューラルネットワークのレイヤー
上記で①~④の番号をうっている部分を行うのは、ニューラルネットワークコンソールではレイヤーと呼ばれているパーツです。
細かいことに目をつぶり、ざっくりと対応づけてみると、赤字が、上記の①~④に対応するニューラルネットワークコンソールのレイヤーの名前です。
① 計算(入力×重み+バイアス):Affine
② 次の層に渡す結果を整える:ReLU 又は Sigmoid または Tanh
③ 結果から確率を計算して答えを出す:Softmax
④ 答え合わせをする:CategoricalCrossEntropy又はBinaryCrossEntropy
③と④は少し補足します。
③のSoftmax + ④のCategoricalCrossEntropy は説明用にわけてますが、実際は、2つをくっつけたSoftmaxCrossEntropyがあるので、それを使います。
④のBinaryCrossEntropyとCategoricalCrossEntropyの違いは、分類したい数が2つ(Binary)か3つ以上(Categorical)かになります。
1層のネットワークでのレイヤー組合せパターン
上記にあげたものだけを使用し、かつ、分類したい数が3以上(2値でないの)場合は、以下の3パターンの組み合わせが考えられます。
2値(選択肢が2つしかない)は、上記のSoftmaxCrossEntropyをBinaryCrossEntropyに置き換えます。
層を重ねていくときは、セットで増やす
層を重ねていくときには、上の2つ(Affine+ReLUまたはSigmoidまたはTanh)のセットで増やしていくのが、まあ、普通のようです。
例えば、こんな感じ。
結果を整える部分(活性化関数)の違い
結果を整える部分にあたるReLU又はSigmoidまたはTanhは活性化関数といいます。
違いをざっくり言えば。
Sigmoid は0.0~1.0、Tanhは、-1から1の間にあてはまるように結果を整理します。
ReLUは、0より小さい数は0にして、0より大きい場合はそのままにする方法で、結果を整理して出力します。
こんな感じです。
どの方法を使うのが最適なのかは、何をしたいかとか、inputのデータの性質とかのもろもろの条件によって変わりますが、最初から難しいことを考えると前にすすめません。
とりあえず、やって結果の良いものを採用すればいいやくらいのノリで進めます。。
簡単に試せるのがニューラルネットワークコンソールのメリットですから。
2019/01/28追記
上記のAffineと活性化関数について、もう少し詳しく説明しているのがこちらです。
Neural Network Consoleで試してみる
ニューラルネットワークコンソールを起動します。
サンプルプロジェクトで学習・評価する
一番シンプルな「01_logistic_regression.sdcproj」を開きます。
作業用にするので、名前をつけて保存を選んで、別の名前でプロジェクトを保存しておきます。
まず、比較元にするために、これで学習と評価をやっておきます。
評価の結果は、95.4%です。
単純に層を深くしてやってみる
この層を重ねて深くしてみます。
Affine+Reluの組み合わせで追加していきます。
なぜ、ReLuかというと、この時は、この組み合わせで追加したのが一番結果がよかったので選んだというだけの理由です。
この時はそうだったというにすぎず、万能ではないので念のため。
まず、AffineとSigmoidとBinaryCrossEntropyを引き下げて、間の線を選択して、Deleteキーで消し、Inputの下にAffineとReluを追加します。
追加したAffineレイヤーのOutShapeは、28*28の784にします。
それで、上から順にShiftキーを押しながら選択していって、リンクで繋いでいきます。
1層だけ深くして学習した結果
さて、どうなったか。
ちょっとガタガタはしていますが、一応収束しています。
評価した結果は、97.2%。
1層のときより改善しました。
このレベルなら、深くした方が改善するみたいです。
もう一層増やしてみる
もう1層 AffineとReluの組み合わせを追加してみます。
学習してみた結果はこんな感じ。
収束はしてますが、Validation Errorは先程より増えてます。
評価した結果はというと、96%・・。
先程より、結果が悪くなりました。
まとめ:単純に層を重ねても全然ダメ
このあと、8層くらいまで追加してやってみました。
結果的には、2層のときの97,2%をうわまわることはありませんでした。
おそらく、誰が試しても、そんな結果になるはずです。
層が増えると学習にかかる時間は、どんどん長くなります。
だから、時間がかかって結果が悪化するのであれば、意味がないということです。
どのくらいの層で最良の結果がでるか。
これは、組んだネットワークによっても違います。
もちろん、対象とするデータによっても違います。
このあたりを理論で理解するというアプローチもありますが、いきなり数式に取り組むのは、文系人間には少々敷居が高いです。
とりあえず、気軽にためせるニューラルネットワークコンソールでイメージをつかむことからはじめるってのも、いいんじゃないかと思うわけです。。
今回は、こんな感じで。
ではでは。