記録帳

クラウド、データ分析、ウイスキーなど。

学習に関するテクニック

ゼロから作るDeepLearningの6章学習に関するテクニックを読んだ。

(この記事、1.5時間くらいかかった・・・)

■要約

5章までで作成したニューラルネットワークのモデルの、改善方法を紹介している。
大きく分けて、以下の3種類。

1.最適化手法

損失関数の最小値を出すための手法。

(今まで)偏微分して勾配を導出する方法。
この方法は、SGD(Stochastic Gradient Descent)という。

 

2 .重みパラメータの初期値

Wとbの初期値。

(今まで)ガウス分布でランダム配置。

 

3.ハイパーパラメータの設定方法

各層のニューロンの数やバッチサイズ、学習係数ηなど。

(今まで)定数。ニューロンの数は100、学習係数は0.01など。

 

1.最適化手法

SGDの代わりに、以下の3手法がある。元のSGDやAdamがよく使用される。どの手法が一番精度が良いかは、試してみなければわからない。

・Momentum

物体が勾配に力を受けて、速度と加速度を持つかのように計算する。

\boldsymbol{v} ← α\boldsymbol{v} - η\frac{\partial L}{\partial\boldsymbol{W}}

\boldsymbol{W} ← \boldsymbol{W} +\boldsymbol{v}

 

・AdaGrad

よく動いたパラメータ(=大きく更新された)は、学習係数を小さく調節して行き過ぎないようにする。

LをWで偏微分した値が大きい=大きく更新されたものであるため、それをhに足して更新する。そうすることで、1/√hの分母が大きくなるため、学習係数ηが小さくなる。

\boldsymbol{h} ←\boldsymbol{h} + \frac{\partial L}{\partial\boldsymbol{W}}\bigodot \frac{\partial L}{\partial\boldsymbol{W}}

\boldsymbol{W} ← \boldsymbol{W} - η\frac{\partial 1}{\partial \sqrt{\boldsymbol{h}}}\frac{\partial L}{\partial\boldsymbol{W}}

 

・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

そもそも過学習は、重みの値が大きな値を取ることで発生することが多い。(重みが大きい=大幅なアップデートがかかるため、他のモデルで適用できない可能性が上がると考えられる)

そのため、損失関数に重みパラメータを足すことで、重みパラメータを出来るだけ小さく抑えるのが本手法である。

具体的には、 \frac{1}{2}λW^2を損失関数に加算する。

 

・Dropout

毎回の学習時に、ニューロンをランダムで削除する手法である。

学習のたびに別のニューロンが削除されるため、複数のモデルのアンサンブルとして考えることができる。いくつかのモデルの結果を平均しているため、過学習が抑えられる。