勾配消失問題とは
Vanishing Gradient Problem
深いニューラルネットワークで誤差逆伝播をする際、浅い層へ伝わる勾配が極端に小さくなり学習が進まなくなる問題
ひとことで言うと
AIの層が深すぎると、後ろから伝える修正の指示がだんだん薄まって、前の方の層まで届かなくなる問題。
概要
勾配消失問題は、誤差逆伝播法によって出力層から入力層に向かって勾配を伝播させる際、連鎖律により各層の勾配が繰り返し掛け合わされていく過程で、勾配の値が層をさかのぼるごとに指数的に小さくなっていき、浅い層(入力に近い層)のパラメータがほとんど更新されなくなってしまう現象。 シグモイド関数やtanh関数のように、入力の絶対値が大きい領域で勾配がほぼ0になる活性化関数を多層に重ねて使うと、この問題が特に起こりやすい。 勾配がほぼ0になった層は実質的に学習が停止した状態になり、ネットワーク全体としては深くしたはずの層を十分に活用できず、性能が頭打ちになったり、浅いネットワークと変わらない性能しか出せなくなったりする。 対策として、勾配が消えにくいReLU系の活性化関数の採用、勾配を直接伝える経路を作る残差接続、各層の出力を安定させるBatch NormalizationやLayer Normalizationなどが広く使われている。
背景
多層のニューラルネットワークを学習させる際、誤差逆伝播法は連鎖律に基づいて勾配を計算するため、各層の勾配が掛け合わされていく過程で数値的な問題が生じやすい。 勾配消失問題は、この掛け合わせによって勾配が指数的に減衰してしまうことに起因し、深いネットワークの学習を妨げる根本的な課題として認識されてきた。
歴史
1991年: Hochreiterが深いネットワークにおける勾配消失・爆発の問題を指摘。 1997年: LSTMが、ゲート機構によって勾配消失を緩和する再帰型ネットワークとして提案される。 2015年: 残差接続を導入したResNetが、非常に深いネットワークでも勾配消失を抑えて学習できることを示す。
アーキテクチャ
誤差逆伝播法では、出力層から入力層に向かって、各層の活性化関数の微分値と重み行列を連鎖律に従って繰り返し掛け合わせながら勾配を計算する。 シグモイドやtanhのように微分値が1より小さい活性化関数を多数の層にわたって掛け合わせると、層をさかのぼるほど勾配の値が指数的に0へ近づいていく。 逆に、掛け合わされる値が1より大きくなる条件が重なると、勾配が指数的に発散する勾配爆発(Exploding Gradient)という逆方向の問題も起こりうる。
ワークフロー
誤差逆伝播法で出力層から入力層に向かって勾配を計算する際、各層を遡るごとに活性化関数の微分値と重み行列が繰り返し掛け合わされる。 浅い層に到達するころには勾配の値がほぼ0になり、その層のパラメータ更新量も0に近づくため、学習が進んでいるように見えても浅い層の重みはほとんど変化しなくなる。 この状態が続くと、深いネットワークを用意したにもかかわらず、実質的に浅いネットワークに近い性能しか発揮できなくなる。
コード例
シグモイド関数の勾配が層を重ねるごとに縮小する様子
import numpy as np
def sigmoid_grad(x):
s = 1 / (1 + np.exp(-x))
return s * (1 - s)
# シグモイドの勾配は最大でも0.25
grad = 1.0
for layer in range(10):
grad *= sigmoid_grad(0.5) # 層を重ねるごとに勾配が掛け合わされる
print(f"layer {layer}: grad={grad:.6f}") # 指数的に0へ近づく利点
- 問題の存在が明らかになったことで、残差接続やBatch Normalizationなど、実際に大きな性能向上をもたらしたアーキテクチャ改良の開発につながった
- 各層の勾配のノルムを監視することで、学習が正常に進んでいるかどうかを診断する手がかりになる
- ReLU系の活性化関数やHe初期化などの重み初期化手法など、比較的シンプルな対策で大きく緩和できることが分かっている
欠点
- 浅い層のパラメータがほとんど更新されず、ネットワークの表現力を十分に引き出せなくなる
- 深いネットワークを設計しても、実際の性能が期待したほど向上しないことがある
- 問題の発生に気づきにくく、学習が進まない原因の切り分けに手間がかかりやすい
比較
関連用語
よくある質問
勾配消失はなぜ起こる?
誤差逆伝播法では各層の勾配が連鎖律により掛け合わされていくため、1未満の値が何度も掛け合わされると、層をさかのぼるほど勾配が指数的に小さくなってしまうため。
勾配消失を防ぐ代表的な方法は?
ReLU系の活性化関数の採用、勾配を直接伝える残差接続、各層の出力を安定させる正規化手法(Batch NormalizationやLayer Normalization)などが広く使われている。
参考文献
- Official WebsiteDeep Learning (Goodfellow, Bengio, Courville)