4-2-4 勾配消失問題と活性化関数の進化

勾配消失問題

ディープラーニングでは、学習のときに「間違い」を手がかりにして、ネットワークの重みを少しずつ修正していきます。
この修正は、ネットワークの後ろから前へと伝わっていきます
つまり、

出力層

隠れ層

さらに前の層

という順番で、「ここを少し直そう」という情報がさかのぼっていくのです。

ここでひとつイメージしてみてください。
長い伝言ゲームをしている場面です。
最初の人が言った言葉が、何人もの人を通って、最後の人に届く。
でも人数が増えるとどうなるでしょう。
途中で声が小さくなったり、聞き取りにくくなったりして、だんだん伝わらなくなります
ディープラーニングでも、似たようなことが起きます。
ネットワークが深くなると、学習のための「修正の信号」が前の層へ伝わる途中で、どんどん小さくなってしまうことがあります
そして最終的には、ほとんどゼロに近くなってしまいます。
すると前の層では、「どれくらい修正すればよいのか」という情報がほとんど残らず、学習が進まなくなってしまいます
これが勾配消失問題です。

ここで出てきた「勾配」という言葉も、イメージしてみましょう。
勾配とは、坂道の傾きのようなものです。
たとえば山の上にボールがあるとします。
もし坂が急なら、「こっちに転がればいい」とすぐ分かります。
でも地面がほとんど平らだったらどうでしょう。
ボールはどちらに転がればいいのか分かりません。
勾配とは、どちらに進めばよいかを教えてくれる「坂の傾き」のようなものです。
ディープラーニングでは、この傾きを頼りにして、重みを修正しています。

ここでもうひとつ想像してみてください。
あなたが真っ暗な部屋で宝探しをしているとします。
どこかに宝箱があるはずですが、部屋は暗くて何も見えません。
そこで頼りになるのが、床の傾きです。
もし床が少し傾いていたら、「こっちへ進めばよさそうだ」と分かります。
ところが、部屋の奥へ進むにつれて、床がだんだん平らになっていったらどうでしょう。
坂がほとんどなくなると、「どっちへ進めばいいのか」わからなくなります。
つまり、宝探しが進まなくなります。
これが、勾配消失問題のイメージです。

活性化関数の、シグモイド関数を思い出してみましょう。
シグモイドのグラフは、S字の形をしています。
真ん中あたりは少し傾いていますが、上のほうや下のほうでは、ほとんど平らになります。
つまり、
・入力が大きすぎる
・入力が小さすぎる
どちらの場合でも、坂がほとんど平らになるのです。
すると勾配(坂の傾き)もとても小さくなります。
そしてこの小さな勾配が、層をさかのぼるたびにさらに小さくなっていくのです。
結果として、最初の層まで届くころにはほとんどゼロになってしまいます。

勾配がゼロに近くなると、「どちらに修正すればいいか」というヒントが消えてしまいます。
するとネットワークはほとんど学習できなくなります。
これが、深いニューラルネットワークで長い間問題になっていた、勾配消失問題です。

活性化関数の進化

ここまで見てきたように、シグモイド関数は長い間、活性化関数として広く使われてきました。
出力が 0〜1 の間に収まり、確率のように扱えるため、とても分かりやすい関数だったからです。

しかしディープラーニングが深くなるにつれて、ある問題がはっきりしてきました。
それが、前の章で見た勾配消失問題です。
シグモイド関数では、入力が大きすぎたり小さすぎたりすると、グラフの傾きがほとんど平らになります。
すると学習の手がかりである勾配も小さくなり、深いネットワークでは学習が進みにくくなってしまうのです。

そこで登場したのが ReLU(Rectified Linear Unit)関数です。
ReLUはとてもシンプルです。

・入力が0より小さい → 0
・入力が0より大きい → そのまま出力

たったこれだけ。
グラフで見ると、0を境に折れ曲がった直線になります。
このシンプルな仕組みには、大きな利点がありました。
ReLUでは、入力がプラスの範囲では傾きが一定に保たれます
つまり、勾配が小さくなりにくい
そのため、深いネットワークでも学習が進みやすくなりました。

ただし、ReLUにも弱点があります。
入力がマイナスの場合、出力がずっと0になってしまうため、ニューロンがまったく反応しなくなることがあります。
これを「死んだReLU(dying ReLU)」と呼ぶこともあります。
この問題を改善するために登場したのがLeaky ReLUです。
Leaky ReLUでは、マイナスの値でもほんの少しだけ信号を通します。
完全に0にするのではなく、わずかな傾きを残しておく。
そうすることで、ニューロンが完全に止まってしまうのを防ぐことができます。

このように、活性化関数は

シグモイド

tanh

ReLU

Leaky ReLU

というように、問題を乗り越えながら進化してきました。
ディープラーニングの歴史は、「より学習しやすい反応のしかた」を探す歴史でもあったのです。

next ▶ 誤差関数とは何か