勾配消失問題
ディープラーニングでは、学習のときに「間違い」を手がかりにして、ネットワークの重みを少しずつ修正していきます。
この修正は、ネットワークの後ろから前へと伝わっていきます。
つまり、
出力層
↓
隠れ層
↓
さらに前の層
という順番で、「ここを少し直そう」という情報がさかのぼっていくのです。
ここでひとつイメージしてみてください。
長い伝言ゲームをしている場面です。
最初の人が言った言葉が、何人もの人を通って、最後の人に届く。
でも人数が増えるとどうなるでしょう。
途中で声が小さくなったり、聞き取りにくくなったりして、だんだん伝わらなくなります。
ディープラーニングでも、似たようなことが起きます。
ネットワークが深くなると、学習のための「修正の信号」が前の層へ伝わる途中で、どんどん小さくなってしまうことがあります。
そして最終的には、ほとんどゼロに近くなってしまいます。
すると前の層では、「どれくらい修正すればよいのか」という情報がほとんど残らず、学習が進まなくなってしまいます。
これが勾配消失問題です。
ここで出てきた「勾配」という言葉も、イメージしてみましょう。
勾配とは、坂道の傾きのようなものです。
たとえば山の上にボールがあるとします。
もし坂が急なら、「こっちに転がればいい」とすぐ分かります。
でも地面がほとんど平らだったらどうでしょう。
ボールはどちらに転がればいいのか分かりません。
勾配とは、どちらに進めばよいかを教えてくれる「坂の傾き」のようなものです。
ディープラーニングでは、この傾きを頼りにして、重みを修正しています。
ここでもうひとつ想像してみてください。
あなたが真っ暗な部屋で宝探しをしているとします。
どこかに宝箱があるはずですが、部屋は暗くて何も見えません。
そこで頼りになるのが、床の傾きです。
もし床が少し傾いていたら、「こっちへ進めばよさそうだ」と分かります。
ところが、部屋の奥へ進むにつれて、床がだんだん平らになっていったらどうでしょう。
坂がほとんどなくなると、「どっちへ進めばいいのか」わからなくなります。
つまり、宝探しが進まなくなります。
これが、勾配消失問題のイメージです。
活性化関数の、シグモイド関数を思い出してみましょう。
シグモイドのグラフは、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 ▶ 誤差関数とは何か