今回は、ディープラーニングだからと言って、闇雲に層を深くしてもダメだということを確認したいと思います。
2017/11/30追記
>Version1.10の画面に張り替えました。
>Version1.00と若干結果の数値が変わっていたためです。
まず予備知識から
ただ、それをするのには「層を深くする」イメージを理解しておく必要があります。
なので・・。
試してみる前に、何の予知知識もないと、ちょっとしんどいので、最初に補足します。
本当にざっくり、細かいところに目をつぶって・・ですが。
1層のニューラルネットワークの処理の流れ
専門用語はあえて使ってません。
だから、厳密には不正確な部分もありますが、その辺は目をつぶって・・ですね。
ざっくり書くと。
以下の図のような流れになります。
学習の時は、入力データをうけとって、重み(バイアスも含む)パラメータと掛け合わせて計算していった結果を元に、どのラベルである確率が一番高いかを計算します。
その後、答え合わせをして、間違ってたら重みパラメータを少し修正する。
こういうことを繰り返して、重みパラメータを最適な値に調整していくのを「学習」といいます。
そして、そうして調整した重みパラメータを使って、入力データはこのラベルだと予測するのが推論(評価)です。
それらのイメージを踏まえて、上記で。
①~③の答えを出すところまでで止めるのが、推論(評価・分類)。
①~④までやって、重みパラメータを更新していくのが学習。
だと思ってください。
一番基本的な代表的レイヤーをピックアップ
さて。
今度は上記の①~④に対応する代表的なレイヤーをピックアップします。
後ろの方で試す時に登場するものだけです。
赤字が、上記の①~④に対応するニューラルネットワークコンソールで用意されているレイヤーの名前です。
① 計算(入力×重み+バイアス):Affine
② 次の層に渡す結果を整える:ReLU 又は Sigmoid または Tanh
③ 結果から確率を計算して答えを出す:Softmax
④ 答え合わせをする:CategoricalCrossEntropy又はBinaryCrossEntropy
③と④を補足します。
③のSoftmax + ④のCategoricalCrossEntropy は説明用にわけてますが、実際は、2つをくっつけたSoftmaxCrossEntropyがあるので、それを使います。
④のBinaryCrossEntropyとCategoricalCrossEntropyの違いは、分類したい数が2つ(Binary)か3つ以上(Categorical)かです。
代表的なレイヤーの組合せパターン
分類したい数が3以上(2値でない)場合は、以下の3パターンの組み合わせが基本的な1層のネットワークになります。
2値(選択肢が2つしかない)は、上記のSoftmaxCrossEntropyをBinaryCrossEntropyに置き換えるわけですが、試してみた感じBinaryCrossEntropyのときは「Sigmoid」との組み合わせの1択になります。
層を重ねていくときは、セットで増やす
層を重ねていくときには、上の2つ(Affine+ReLUまたはSigmoidまたはTanh)のセットで増やしていきます。
例えば、こんな感じ。
結果を整える部分(活性化関数)の違い
分類したい数が3以上の場合には、3つのバリエーションがあるので、補足します。
ReLU 又は Sigmoid または Tanhの違いです。
ざっくり言えば。
Sigmoid は0.0~1.0、Tanhは、-1から1の間にあてはまるように結果を整理します。
ReLUは、0より小さい数は0にして、0より大きい場合はそのままにする方法で、結果を整理して出力します。
こんな感じです。
どの方法を使うのが最適なのかは、何をしたいかとか、inputのデータの性質とかのもろもろの条件によって変わります。
まあ。
そこで、難しいことを考えると前にすすめません。
とりあえず、3つを差し替えながら、結果の良いものを採用すればいいや・・くらいに考えておけばいいんじゃないですかね。
だって、簡単に試せるのがニューラルネットワークコンソールのメリットですから。
2019/01/28追記
上記のAffineと活性化関数について、もう少し詳しく説明しているのがこちらです。
単純に階層を深くしてみる
層を重ねていくイメージが頭にできたところで、ニューラルネットワークコンソールを起動します。
比較用に層の浅いネットワークで学習・評価する
一番シンプルな「01_logistic_regression.sdcproj」を開きます。
作業用にするので、名前をつけて保存を選んで、別の名前でプロジェクトを保存しておきます。
まず、比較元にするために、これで学習と評価をやっておきます。
評価の結果は、95.4%です。
単純に層を深くしてやってみる
この層を重ねて深くしてみます。
Affine+Reluの組み合わせで追加していきます。
なぜ、ReLuかというと、色々、試した結果、この組み合わせで追加するのが一番結果がよかったからです。
2018/10/3追記
>別にこの組み合わせが万能だというわけではないです。
>たまたま、このデータとモデルの組み合わせを試したら、今回はそうだった。
>まあ、それだけのことです。誤解なきようお願いします。
まず、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%をうわまわることはありませんでした。
おそらく、誰が試しても、そんな結果になるはずです。
層が増えると学習にかかる時間は、どんどん長くなります。
だから、時間がかかって結果が悪化するのであれば、意味がないということです。
どのくらいの層で最良の結果がでるか。
これは、組んだネットワークによっても違います。
もちろん、対象とするデータによっても違います。
このあたりを理論で理解するというアプローチもありますが、少々敷居が高いです。
文系人間にとっては・・ですが。
なので、習うより慣れろで、このあたりの試行錯誤をして感覚を掴んでおくのは、結構大事かもしれないなと思ったりもします。
ニューラルネットワークコンソールなら、気楽に試すことができますしね。
今回は、こんな感じで。
カテゴリの一覧