ゼロから作るDeepLearningの6章学習に関するテクニックを読んだ。
(この記事、1.5時間くらいかかった・・・)
■要約
5章までで作成したニューラルネットワークのモデルの、改善方法を紹介している。
大きく分けて、以下の3種類。
1.最適化手法
損失関数の最小値を出すための手法。
(今まで)偏微分して勾配を導出する方法。
この方法は、SGD(Stochastic Gradient Descent)という。
2 .重みパラメータの初期値
Wとbの初期値。
(今まで)ガウス分布でランダム配置。
3.ハイパーパラメータの設定方法
各層のニューロンの数やバッチサイズ、学習係数ηなど。
(今まで)定数。ニューロンの数は100、学習係数は0.01など。
1.最適化手法
SGDの代わりに、以下の3手法がある。元のSGDやAdamがよく使用される。どの手法が一番精度が良いかは、試してみなければわからない。
・Momentum
物体が勾配に力を受けて、速度と加速度を持つかのように計算する。
・AdaGrad
よく動いたパラメータ(=大きく更新された)は、学習係数を小さく調節して行き過ぎないようにする。
LをWで偏微分した値が大きい=大きく更新されたものであるため、それをhに足して更新する。そうすることで、1/√hの分母が大きくなるため、学習係数ηが小さくなる。
・Adam
MomentumとAdaGradを融合したような手法。つまり、速度と加速度を持つかのように計算して、大きく動いたパラメータの学習係数は小さく調節する。
式は省略。
2 .重みパラメータの初期値
そもそも、良い重みパラメータの初期値とはなんなのか。それは、各層ごとの出力値が偏らないようになることである。そのような手法を2つ紹介する。
理由1)出力が0や1に偏った場合、微分値が0となる。逆伝播として伝わっていく値がどんどん0になってしまい、最終的に消える勾配消失が発生してしまう。
理由2)出力が0.5付近に偏った場合、勾配消失は起きないが、どれもほぼ同じ値を出力する=ノードを増やす意味がなくなってしまう。
・Xavierの初期値
前層のノードの数をnとした時、√1/nの標準偏差を持つガウス分布を使用する手法。
活性化関数が線形であることを前提としたものであるため、sigmoid関数やtanh関数の場合に有効。
・ Heの初期値
前層のノードの数をnとした時、√2/nの標準偏差を持つガウス分布を使用する手法。
Xavierの初期値の、標準偏差が√2倍になったバージョンである。
これは、ReLU関数の場合に有効。(ReLU関数は0以下の入力が全て0となるので、より広がりを持たせるように√2倍されている)
3.ハイパーパラメータの調整
データセットを、「訓練データ」「検証データ」「 テストデータ」の3つに分ける。
検証データを用いて、ハイパーパラメータを少しずつ変化させながら最適値を求める。
具体的には、ハイパーパラメータの範囲を設定し、その中からランダムにサンプリングし、学習を行うという工程を一定回数実施し、最も良い結果を採用する。
[例外]その他の改善
上記の3種類以外にも、改善する方法を2種類紹介する。
1.各層ごとの出力値が偏らないように変換する層の挿入
2.過学習(あるデータでしか精度が出ないような学習)の防止
1.各層ごとの出力値が偏らないように変換する層の挿入
名前の通りだが、出力値が偏らないようにBatch Normalization層を導入する。
具体的には、出力が平均0、分散が1となるように変換する層を挿入する。
この手法には、以下の利点がある。
3点目があるため、2.の方も入ってしまっているが、そこはご愛嬌。
2.過学習の防止
過学習の防止には、以下2つの手法がある。
・Weight Decay
そもそも過学習は、重みの値が大きな値を取ることで発生することが多い。(重みが大きい=大幅なアップデートがかかるため、他のモデルで適用できない可能性が上がると考えられる)
そのため、損失関数に重みパラメータを足すことで、重みパラメータを出来るだけ小さく抑えるのが本手法である。
具体的には、を損失関数に加算する。
・Dropout
毎回の学習時に、ニューロンをランダムで削除する手法である。
学習のたびに別のニューロンが削除されるため、複数のモデルのアンサンブルとして考えることができる。いくつかのモデルの結果を平均しているため、過学習が抑えられる。