logo

勾配消失 📂機械学習

勾配消失

導入1 2 3

重み$\mathbf{W}^{(1)}, \dots, \mathbf{W}^{(N)}$と活性化関数$\sigma$を繰り返し合成した人工ニューラルネットワークを考えよう。入力$\mathbf{h}^{(0)} = \mathbf{x}$に対して各層の値を次のようにおく。

$$ \mathbf{h}^{(\ell)} = \overline{\sigma}\left( \mathbf{z}^{(\ell)} \right), \qquad \mathbf{z}^{(\ell)} = \mathbf{W}^{(\ell)} \mathbf{h}^{(\ell-1)} + \mathbf{b}^{(\ell)} \qquad (\ell = 1, \dots, N) $$

ここで$\overline{\sigma}$は成分ごとに作用する活性化関数である。損失関数$\mathcal{L}$がネットワークの出力$\mathbf{h}^{(N)}$の関数であるとしよう。ネットワークを勾配降下法で学習させるには、各層の重みに対する$\mathcal{L}$の勾配が必要である。$\ell$番目の層の重みに対する勾配は、連鎖法則により次のようになる。

$$ \frac{\partial \mathcal{L}}{\partial \mathbf{W}^{(\ell)}} = \frac{\partial \mathcal{L}}{\partial \mathbf{h}^{(\ell)}} \cdot \frac{\partial \mathbf{h}^{(\ell)}}{\partial \mathbf{z}^{(\ell)}} \cdot \frac{\partial \mathbf{z}^{(\ell)}}{\partial \mathbf{W}^{(\ell)}} \tag{1} $$

ここで$\partial \mathbf{z}^{(\ell)}/\partial \mathbf{W}^{(\ell)}$はその層に入る入力$\mathbf{h}^{(\ell-1)}$にのみ依存するため、層が深くなっても小さくならない。一方、$\partial \mathcal{L}/\partial \mathbf{h}^{(\ell)}$は後方の層のヤコビ行列が繰り返し掛けられる項である。

$$ \frac{\partial \mathcal{L}}{\partial \mathbf{h}^{(\ell)}} = \frac{\partial \mathcal{L}}{\partial \mathbf{h}^{(N)}} \cdot \frac{\partial \mathbf{h}^{(N)}}{\partial \mathbf{h}^{(N-1)}} \cdot \frac{\partial \mathbf{h}^{(N-1)}}{\partial \mathbf{h}^{(N-2)}} \cdots \frac{\partial \mathbf{h}^{(\ell+1)}}{\partial \mathbf{h}^{(\ell)}} = \frac{\partial \mathcal{L}}{\partial \mathbf{h}^{(N)}} \prod_{k=\ell+1}^{N} \frac{\partial \mathbf{h}^{(k)}}{\partial \mathbf{h}^{(k-1)}} $$

すなわち、隣接する二つの層の間のヤコビ行列を$J^{(k)} := \partial \mathbf{h}^{(k)} / \partial \mathbf{h}^{(k-1)}$のように表記すれば以下のように書け、その大きさは、行列ノルムに対して$\left\| AB \right\| \le \left\| A \right\| \left\| B \right\|$が成り立つので、次のようにヤコビ行列のノルムの積を上限として持つ。

$$ \frac{\partial \mathcal{L}}{\partial \mathbf{h}^{(\ell)}} = \frac{\partial \mathcal{L}}{\partial \mathbf{h}^{(N)}} \prod_{k=\ell+1}^{N} J^{(k)} $$

$$ \left\lVert \frac{\partial \mathcal{L}}{\partial \mathbf{h}^{(\ell)}} \right\rVert \le \left\lVert \frac{\partial \mathcal{L}}{\partial \mathbf{h}^{(N)}} \right\rVert \prod_{k=\ell+1}^{N} \left\lVert J^{(k)} \right\rVert $$

したがって$\ell$が小さくなるほど、すなわち前方の層であるほど、勾配の大きさが次第に小さくなりうる。

定義

上の議論のように、ニューラルネットワークの層が深く積まれるほど前方の層の勾配の大きさが指数的に$0$に収束し、前方の層がほとんど学習されない現象を勾配消失vanishing gradientという。逆に、勾配が指数的に発散する現象を勾配爆発exploding gradientという。

説明

勾配消失は、ネットワークが深くなるほど(=層を多く合成するほど)前方の層のパラメータに対する勾配が消えてしまう問題である。勾配が$0$に近づくと勾配降下法の更新量$-\eta \nabla \mathcal{L}$も$0$に近づくため、入力に近い層ほど学習が止まってしまう。

原因は上で見たようにヤコビ行列の積にある。各ヤコビ行列は、活性化関数の微分を成分として持つ対角行列$D^{(k)} = \operatorname{diag}\left( \sigma^{\prime}(z^{(k)}_{1}), \dots, \sigma^{\prime}(z^{(k)}_{m}) \right)$と重みの積として表される。

$$ J^{(k)} = \frac{\partial \mathbf{h}^{(k)}}{\partial \mathbf{h}^{(k-1)}} = D^{(k)} \mathbf{W}^{(k)} $$

これは$\mathbf{h}^{(k)} = \overline{\sigma}(\mathbf{z}^{(k)})$と$\mathbf{z}^{(k)} = \mathbf{W}^{(k)} \mathbf{h}^{(k-1)} + \mathbf{b}^{(k)}$に連鎖法則を適用して二段階に分けたものである。

$$ J^{(k)} = \frac{\partial \mathbf{h}^{(k)}}{\partial \mathbf{h}^{(k-1)}} = \underbrace{\frac{\partial \mathbf{h}^{(k)}}{\partial \mathbf{z}^{(k)}}}_{D^{(k)}} \underbrace{\frac{\partial \mathbf{z}^{(k)}}{\partial \mathbf{h}^{(k-1)}}}_{\mathbf{W}^{(k)}} $$

後ろの項$\partial \mathbf{z}^{(k)} / \partial \mathbf{h}^{(k-1)}$は、$\mathbf{z}^{(k)}$が$\mathbf{h}^{(k-1)}$に対してアフィン変換であるため、そのヤコビ行列は重み$\mathbf{W}^{(k)}$そのものである。前の項$\partial \mathbf{h}^{(k)} / \partial \mathbf{z}^{(k)}$は、$\overline{\sigma}$が成分ごとに作用して$h^{(k)}_{i} = \sigma(z^{(k)}_{i})$であるため、異なる成分同士は影響を与えない。

$$ \frac{\partial h^{(k)}_{i}}{\partial z^{(k)}_{j}} = \sigma^{\prime}(z^{(k)}_{i}) \delta_{ij} $$

すなわち対角成分だけが生き残り、対角行列$D^{(k)}$となるのである。このとき$\delta_{ij}$はクロネッカーのデルタである。

したがって勾配には$D^{(k)} \mathbf{W}^{(k)}$の形の項が層の数だけ繰り返し掛けられる。各項のノルムがある$r < 1$より小さければ、その積は$r^{N-\ell}$の速さで指数的に減少する。

$$ \prod_{k=\ell+1}^{N} \left\lVert J^{(k)} \right\rVert \le r^{N-\ell} \to 0 \quad \text{as } N \to \infty $$

スカラーニューラルネットワーク$h^{(\ell)} = \sigma\left( w^{(\ell)} h^{(\ell-1)} \right)$で見るとより明らかである。このとき勾配は単なる実数の積である。

$$ \frac{\partial h^{(N)}}{\partial h^{(0)}} = \prod_{k=1}^{N} \sigma^{\prime}\left( z^{(k)} \right) w^{(k)} $$

各因子の絶対値が$1$より小さければ積は$0$へ、大きければ$\infty$へと指数的に突き進む。

活性化関数の問題

上で見たように$J^{(k)}$の大きさが小さすぎると勾配消失が起こるが、$D^{(k)} = \operatorname{diag}\left( \sigma^{\prime}(z^{(k)}_{1}), \dots, \sigma^{\prime}(z^{(k)}_{m}) \right)$であるため、活性化関数の導関数が重要に作用することがわかる。ディープラーニング初期に多く使われたシグモイド関数は、入力の絶対値が大きいと勾配が$0$に近づく。実際、シグモイド$\sigma$の微分は次のように最大でも$1/4$を超えない。このように$|x|$が大きくなるにつれて$|\sigma^{\prime}(x)|$が急激に$0$に近づくことを飽和という。

$$ \sigma^{\prime}(x) = \sigma(x)\left( 1 - \sigma(x) \right) \le \frac{1}{4} $$

層を一つ通過するたびに勾配が少なくとも$4$分の$1$に縮む計算になるため、深いニューラルネットワークでは勾配消失が必然的に現れた。これがディープラーニング初期に層を深く積めなかった主な理由の一つである。

緩和方法

  • 活性化関数の置き換え: ハイパボリックタンジェントは最大値が$1$であるためシグモイドより勾配消失を経験しにくく、ReLUは正の領域で微分が常に$1$であるため勾配消失を大きく緩和する。

  • スキップコネクション: 恒等関数を加えて$\mathbf{x} \mapsto \sigma(\mathbf{W}\mathbf{x}) + \mathbf{x}$の形にすると、ヤコビ行列に単位行列$I$が加わり、掛けられる項が$1$付近を保つ。非常に深いニューラルネットワークを学習させたResNetの中心的なアイデアである。

  • 重みの初期化・正規化: 層を通っても値の分散が保たれるようにする初期化、バッチ正規化などが使われる。

  • 構造の改善: リカレントニューラルネットワークでは同一の重み$\mathbf{W}$が時点ごとに繰り返し掛けられ、勾配消失が特に深刻である。ゲート構造により隠れ状態を乗算ではなく加算で伝えるLSTM・GRUがこれを緩和する。

関連リンク


  1. Bengio, Yoshua, Patrice Simard, and Paolo Frasconi. Learning long-term dependencies with gradient descent is difficult. IEEE transactions on neural networks 5.2 (1994): 157-166. ↩︎

  2. Pascanu, Razvan, Tomas Mikolov, and Yoshua Bengio. On the difficulty of training recurrent neural networks. International conference on machine learning. Pmlr, 2013. ↩︎

  3. Glorot, Xavier, and Yoshua Bengio. Understanding the difficulty of training deep feedforward neural networks. Proceedings of the thirteenth international conference on artificial intelligence and statistics. JMLR Workshop and Conference Proceedings, 2010. ↩︎