#深層学習2-5 Jupyter演習 (Section1:勾配消失問題について)
[2_2_1_vanishing_gradient]
#####【演習実施結果】
#####【考察】
・初期値ランダムで、シグモイド関数を使った場合、ノード数や学習率を変えてみても、学習が上手く進まなかった。
・初期値Heで、セオリー通りのReLU関数ではなく、シグモイド関数を使った場合、学習が上手く進まなかった。
・初期値ランダムで、RELU関数を使った場合、最初は学習が進まなかったが、繰り返し回数500回目あたりから、学習が上手く進んだ。活性化関数を変えるだけで、学習が上手く進む事があることが分かった。
・Xavierの初期値を使った場合、シグモイド関数でもRELU関数でも、学習が上手く進んだ。
・Heの初期値で、セオリー通りRELU関数を使った場合は、学習が上手く進んだ。上にも書いた通り、活性化関数をシグモイド関数にした場合は、学習が上手く進まなかった。
ただし、必ずセオリー通りに行くとは限らず、Heの初期値で、シグモイド関数を使って上手く行く場合もある。
#深層学習2-8 Jupyter演習 (Section2: 学習率最適化手法について)
[2_4_optimizer]
#####【演習実施結果】
#####【考察】
・Momentum:モメンタムの値をゼロにした時(モメンタムなしと同じ状態)と、0.8や0.9とで比較してみると、学習が収束するまでの時間が、大きく違った(0.8や0.9を入れた時の方が収束が早い)。
・Momentumのコードをもとに、AdaGradを作成した。hの値については、数式通りで、繰り返しがゼロかゼロ以上の時とで、場合分けを行ってコーディングした。
・RSMProp:最終的には、最適値に収束するが、学習率μや、α(decay_rate)の値を少し変えるだけで、収束するまでの時間が大きく変わる事が分かった。
・バッチ正規化を行わない場合でも、最終的に学習が収束はしたが、学習は緩やかに行われた。バッチ正規化を行うと、収束までの時間が早くなった。
#深層学習2-13 Jupyter演習 (Section3:過学習について)
[2_5_overfiting]
#####【演習実施結果】
#####【考察】
・L1,L2正則化を行う事で、何も対策をしない場合よりも、過学習が抑制される事が確認出来た。
・L1、L2正則化を行う際、weight_decay_lambdaの値が小さ過ぎると、何も処理しないのと同じ状態になり(過学習を抑制しない)、大き過ぎるとそもそも学習が進まないなど、weight_decay_lambdaの値も調整が必要である事が分かった。
・L1,L2,ドロップアウトの正則化とそれぞれのハイパーパラメータ、最適化でモメンタムAdaGrad,Adamなど、どれを使うのかなど、同じネットワークを組み立てても、色々な組み合わせが考えられるので、実際にテストしてみて、どの組み合わせと相性が良いのかを、データごとに見極める必要がある。
・L1&ドロップアウトと、正則化を2つ組み合わせて使う事もあり、実際に試してみたところ、今回のデータでは、組み合わせた事で成果があった。
#深層学習2-17,19 Jupyter演習 (Section4: 畳み込みニューラルネットワークの概念)
[2_6_simple_convolution_network]
#####【演習実施結果】
#####【考察】
・im2col:画像処理で多用されるメソッド。主に、画像のような多次元データを2次元配列にする処理。
・im2colのtransposeをコメントアウトしたり、input_dataの画像サイズやフィルタサイズ、ストライドやパッドを変えてみて、出力を確認する事で、im2colでどのような処理がされているのかが理解出来た。
・im2colで2次元配列にする理由は、行列計算に落とし込む事で、多くのライブラリを活用出来るため。
・逆にcol2imは、im2colで2次元配列になったものを、元の画像に戻す処理になる。
・ConvolutionClass, pooling classについては、畳み込み層、プーリング層の処理が、コードを通して改めて理解が出来た。
・CNNで実際に動かしてみると、層数が少ないシンプルなCNNだが、これまで演習で行ってきたニューラルネットワークと違い、顕著に処理速度が遅くなった。これまで話としてPCのスペックや、GPUについて聞いてきたが、それらが実感として感じ取れた。
・MNISTのデータセットで試してみたところ、前回までの演習でやった通常のNNに比べて、精度が格段に向上したのが確認出来た。