NNにおけるSigmoid関数とReLU関数の比較
はじめに
某大学院の院試の過去問に、「DNNにおいて中間層を増やすとSigmoid関数よりReLU関数の方が優れている理由を述べよ」といった問題があったので、調べてみた。
Sigmoid関数
Sigmoid関数は次のような式で表される。
メリット
Sigmoid関数は入力に対して連続なので微分ができる。この微分ができるという点は、誤差逆伝播法による学習を伴うニューラルネットワークにとって重要である。
導関数は以下の通りで、簡単に計算ができる。
デメリット
入力が極限に大きく、または小さくなると勾配が消える。
誤差逆伝播によるパラメータの更新において、入力層に近づくほど、学習量が小さくなり、学習が進まなくなってしまう。
微分値の最大値が0.25であり、学習の収束が遅い。
ReLU関数
別名ランプ関数と呼ばれ、入力が0以下の時は0を、それ以外(0より大きい)時はその値を出力する関数である。
x=0において、非連続で微分不可能であるが、その他の領域では微分可能なので、微分可能な活性化関数として扱われることが多い。
メリット
デメリット
- 入力が負の時、微分値が0なので、重みパラメータの更新がされない。
考察
2つの関数のメリット・デメリットをそれぞれみていくと、どうも勾配の消失問題に答えがありそうだ。
勾配消失問題とは、誤差逆伝播法が下位層に向かって進んでいくにつれて、勾配がどんどん緩やかになっていく。そのため、勾配降下法による更新では下位層のパラメータはほとんど変わらず、訓練は最適値に収束しなくなるといった問題のことである。
勾配が消えていく理由は、シグモイド関数の微分係数の最大値が0.25(範囲: 0.0~0.25)であり、そのシグモイド関数を重ねれば重ねるほど勾配の値は小さくなっていくからである。
試しに、0.255を計算すると……と、かなり小さい値になる。
一方で、ReLU関数の導関数は、x<0のとき0、x>0のとき1である(x=0のときは微分不可能)。
よって、ReLu関数では勾配消失問題が起きることがないため、題意のようになる。