주제: TS-3 Gradient 안정화 (Vanishing / Exploding Gradient와 Gradient Clipping)
깊은 모델에서는 gradient가 너무 작아져서 안 움직이거나, 너무 커져서 발산할 수 있다. gradient 안정화는 학습이 실제로 진행되게 만드는 기본 안전장치다.
직관적 이해 (비유)
딥러닝 학습을 산을 내려가는 과정이라고 생각해보겠습니다.
- Gradient: 현재 위치에서 내려가는 방향
- Loss: 산의 높이
- 학습: 계속 내려가며 낮은 지점 찾기
문제는 모델이 깊어질수록 경사가 두 가지 문제를 일으킬 수 있다는 점입니다.
- Vanishing Gradient: 경사가 너무 작아 거의 움직이지 않음
- Exploding Gradient: 경사가 너무 커져 학습이 불안정
이 문제 때문에 딥러닝에서는 gradient 안정화 기법이 중요하며, 대표적으로 gradient clipping을 사용합니다.
왜 깊은 모델에서 Gradient 문제가 생기나
딥러닝에서 gradient는 체인룰을 통해 뒤에서 앞으로 전달됩니다.
Loss -> Layer3 -> Layer2 -> Layer1
각 레이어에서 gradient가 계속 곱해지기 때문에 값이 급격히 커지거나 작아질 수 있습니다. 그래서 깊은 네트워크에서는 forward뿐 아니라 backward의 수치 안정성도 같이 관리해야 합니다.
Transformer에서 residual connection과 normalization을 강하게 쓰는 이유도 결국 깊은 층에서 gradient 흐름을 유지하기 위해서입니다.
수식 1: Gradient Descent 업데이트
기호 의미
θ: 모델 파라미터η: learning rate∇L(θ): loss의 gradient
왜 필요한가
이 수식은 모델이 loss를 줄이기 위해 파라미터를 업데이트하는 기본 규칙입니다.
한계 / 주의점
- gradient가 너무 크면 파라미터가 크게 튀어 학습이 발산
- gradient가 너무 작으면 학습이 거의 진행되지 않음
수식 2: 체인룰로 인한 Gradient 전파
기호 의미
L: lossx_1 ... x_n: 각 레이어 출력
왜 필요한가
역전파(backpropagation)는 마지막 레이어의 gradient를 처음 레이어까지 체인룰로 전달합니다.
한계 / 주의점
- 많은 미분값이 곱해지면 값이 0에 가까워질 수 있음: vanishing
- 값이 1보다 크면 폭발적으로 커질 수 있음: exploding
수식 3: Gradient Clipping
기호 의미
g: gradient 벡터||g||: gradient normc: clipping threshold
왜 필요한가
gradient가 너무 커질 경우 크기를 제한하여 학습이 폭발하지 않도록 합니다.
한계 / 주의점
- 너무 강하게 clipping하면 학습 속도가 느려질 수 있음
- 근본 원인을 없애는 것이 아니라 안정화 보조 장치에 가까움
Vanishing vs Exploding 비교
| 문제 | 원인 | 증상 | 대표 대응 |
|---|---|---|---|
| Vanishing Gradient | 미분값이 반복 곱셈으로 0에 가까워짐 | 초기 레이어가 거의 학습되지 않음 | ReLU, residual connection, normalization |
| Exploding Gradient | gradient가 반복 곱셈으로 너무 커짐 | loss 발산, NaN 발생 | gradient clipping, learning rate 조절 |
코드-수식 연결
PyTorch에서 gradient clipping은 다음 코드로 구현됩니다.
loss.backward()
torch.nn.utils.clip_grad_norm_(
model.parameters(), max_norm=1.0
)
optimizer.step()
| 코드 | 수식 대응 | 설명 |
|---|---|---|
loss.backward() |
체인룰 수식 | gradient 계산 |
clip_grad_norm_ |
g = g * (c / ||g||) |
gradient 크기 제한 |
optimizer.step() |
θ = θ - η∇L |
파라미터 업데이트 |
자주 하는 오해 5개
- gradient clipping이 vanishing gradient를 해결한다고 생각함
- gradient가 크면 항상 좋은 학습이라고 생각함
- learning rate만 조정하면 exploding 문제가 항상 해결된다고 생각함
- 딥러닝에서 gradient 문제는 RNN에서만 발생한다고 생각함
- clipping threshold는 항상 1.0이 최적이라고 생각함
체크리스트 (스스로 설명 가능해야 하는 질문)
- Vanishing gradient가 왜 깊은 네트워크에서 발생하는가?
- 체인룰이 gradient 크기에 어떤 영향을 주는가?
- Exploding gradient가 발생하면 학습 로그에서 어떤 현상이 나타나는가?
- Gradient clipping이 어떤 수식으로 동작하는가?
- Residual connection이 gradient 흐름에 왜 도움이 되는가?