역전파 신호가 사라지거나 폭발한다
역전파는 출력층의 오차를 체인 룰로 앞쪽 층까지 곱해가며 전달한다. 이 과정에서 층이 깊어질수록 곱해지는 기울기 값이 계속 작아지면 앞쪽 층은 거의 업데이트되지 않는 Gradient Vanishing(기울기 소실)이 생기고, 반대로 계속 커지면 가중치가 튀는 Gradient Exploding(기울기 폭발)이 생긴다. 둘 다 신경망이 제대로 학습되지 않게 만드는 대표적인 문제다.
체인 룰이 기울기를 반복해 곱한다
첫 번째 가중치의 기울기는 출력에서 그 가중치까지 거치는 모든 구간의 국소 미분을 체인 룰로 곱해 구한다.
첨부 그림처럼 Loss로부터 시작한 기울기가 1이라고 해도, 네 구간에서 각각 0.01을 곱하면 이 되어 초기 층의 학습 신호가 거의 0에 가까워진다. 반대로 각 구간에서 10을 곱하면 으로 커진다. 핵심은 특정 한 층의 값이 아니라, 작은 값 또는 큰 값의 반복 곱셈이 깊이에 따라 지수적으로 누적된다는 점이다.
이미지의 층별 기울기를 표로 확인하기
구분 | Loss 시작 | Layer L | Layer 3 | Layer 2 | Layer 1 |
|---|---|---|---|---|---|
소실 (구간마다 ×0.01) | |||||
폭발 (구간마다 ×10) |
역전파 방향은 Loss → Layer L → Layer 3 → Layer 2 → Layer 1이다. 따라서 입력에 가까운 Layer 1일수록 더 많은 미분 항을 곱하고, 소실이나 폭발의 영향을 가장 크게 받는다.
Sigmoid 도함수로 기울기 소실 확인하기
Sigmoid 함수와 도함수는 다음과 같다.
모든 층이 최대 도함수 만을 가진다고 단순화하면, 깊이 에 따른 누적 기울기의 상한은 다음 함수로 표현된다.
import numpy as np
def sigmoid_grad(x):
s = 1 / (1 + np.exp(-x))
return s * (1 - s)
# 기울기가 최대인 x=0에서의 sigmoid 도함수
max_grad_per_layer = sigmoid_grad(0.0)
for depth in [1, 5, 10, 20]:
cumulative_grad = max_grad_per_layer ** depth
print(f"{depth}층: 누적 기울기 = {cumulative_grad:.2e}")
깊이 d | 누적 기울기 G(d) |
|---|---|
Sigmoid를 은닉층마다 쓴다고 가정하면, 도함수가 가장 큰 지점에서조차 20개 층을 지난 누적 기울기는 약 9.09×10⁻¹³이다. 실제 입력이 0에서 멀어지면 도함수가 더 작아지므로 소실은 더 빨라진다.
원인과 해결책 비교
구분 | Gradient Vanishing (소실) | Gradient Exploding (폭발) |
|---|---|---|
현상 | 층을 거칠수록 기울기가 점점 작아져 초기 레이어가 거의 학습되지 않는다 | 층을 거칠수록 기울기가 지나치게 커져 가중치 업데이트가 발산한다 |
주로 발생하는 경우 | Sigmoid·Tanh처럼 미분값이 0에 가까운 활성 함수를 깊게 쌓았을 때 | 신경망이 매우 깊거나 가중치 초기화가 잘못됐을 때 |
해결 방법 | ReLU(양수 구간 기울기가 항상 1) 사용, Batch Normalization으로 입력 분포 안정화 | Gradient Clipping — 기울기가 임계값을 넘으면 그 값으로 잘라낸다 |
정리
깊은 신경망의 기울기 문제는 체인 룰에서 국소 미분이 반복해 곱해지기 때문에 발생한다. ReLU 계열 활성화 함수, Xavier·He 초기화, Batch Normalization, residual connection은 신호 크기를 안정화하며, Gradient Clipping은 특히 기울기 폭발을 제어한다. 학습 중 층별 gradient norm과 NaN 발생 여부를 관찰하면 문제를 일찍 포착할 수 있다.
참고 자료
Understanding the difficulty of training deep feedforward neural networks (Glorot & Bengio, 2010) — 기울기 소실과 Xavier 초기화를 다룬 원 논문 (2026-08-10 확인)
torch.nn.utils.clip_grad_norm_ — PyTorch 공식 문서 — Gradient Clipping의 공식 API (2026-08-07 확인)
댓글 0
댓글을 불러오는 중…