기울기 소실
도입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$이라 시그모이드보다 기울기 소실을 덜 경험하고, ReLU는 양의 영역에서 미분이 항상 $1$이므로 기울기 소실을 크게 완화한다.

스킵 커넥션: 항등함수를 더해 $\mathbf{x} \mapsto \sigma(\mathbf{W}\mathbf{x}) + \mathbf{x}$ 꼴로 만들면 야코비 행렬에 항등행렬 $I$가 더해져, 곱해지는 항이 $1$ 근처를 유지한다. 아주 깊은 신경망을 학습시킨 ResNet의 핵심 아이디어이다.
가중치 초기화·정규화: 층을 지나도 값의 분산이 유지되도록 하는 초기화, 배치 정규화 등이 쓰인다.
구조 개선: 순환신경망에선 동일한 가중치 $\mathbf{W}$가 시점마다 거듭 곱해져 기울기 소실이 특히 심하다. 게이트 구조로 은닉상태를 곱셈이 아닌 덧셈으로 전달하는 LSTM·GRU가 이를 완화한다.
같이보기
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. ↩︎
Pascanu, Razvan, Tomas Mikolov, and Yoshua Bengio. On the difficulty of training recurrent neural networks. International conference on machine learning. Pmlr, 2013. ↩︎
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. ↩︎

저희들의 저서 「줄리아 프로그래밍」이 2024 세종도서 학술부문에 선정되었습니다!

