⚠️ Gradient가 폭발한다고?
딥러닝 모델을 학습하다 보면 특정 조건에서 역전파(Backpropagation) 시
기울기(gradient)의 크기가 기하급수적으로 커지는 현상이 발생할 수 있습니다.
이를 **Gradient Explosion(기울기 폭발)**이라고 합니다.
특히 RNN, LSTM, GAN 등에서 매우 자주 발생하며,
발생하면 Loss가 NaN으로 터지고 모델이 망가집니다.
🧠 왜 이런 일이 생길까?
기울기가 레이어를 거치며 연속적으로 곱해지기 때문입니다.
→ 깊거나 순환적인 구조에서 가중치가 큰 값일 경우,
backward 시 ∇L이 계속 커지며 무한대 수준까지 치솟을 수 있음
🛡️ 해결 방법: Gradient Clipping
Gradient Clipping은 기울기의 크기를 특정 임계값 이하로 자르는 방식입니다.
학습 중 기울기가 설정한 threshold 이상으로 커지지 않도록 강제로 잘라냅니다.
if ||∇L|| > threshold:
∇L ← (threshold / ||∇L||) * ∇L
∇L ← (threshold / ||∇L||) * ∇L
즉, 방향은 그대로 두고 크기만 조절하는 방식입니다.
📦 실습 예시 (PyTorch)
import torch
import torch.nn as nn
import torch.nn.functional as F
model = nn.LSTM(input_size=128, hidden_size=256, num_layers=2)
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
for batch in dataloader:
input_seq = batch['input'] # 예시 입력
target_seq = batch['target']
output, _ = model(input_seq)
loss = F.mse_loss(output, target_seq)
loss.backward()
# 💡 Gradient Clipping 적용!
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
optimizer.step()
optimizer.zero_grad()
import torch.nn as nn
import torch.nn.functional as F
model = nn.LSTM(input_size=128, hidden_size=256, num_layers=2)
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
for batch in dataloader:
input_seq = batch['input'] # 예시 입력
target_seq = batch['target']
output, _ = model(input_seq)
loss = F.mse_loss(output, target_seq)
loss.backward()
# 💡 Gradient Clipping 적용!
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
optimizer.step()
optimizer.zero_grad()
✅ 위 예제에서는 clip_grad_norm_을 통해 기울기 norm을 최대 1.0으로 제한하고 있습니다.
너무 낮게 설정하면 학습이 느려지고, 너무 높으면 clipping 효과가 줄어드니 실험적으로 조정해야 합니다.
📌 실전에서 언제 써야 하나?
상황사용 추천 여부
RNN / LSTM / GRU | ✅ 필수적 |
GAN | ✅ 매우 추천 |
CNN / MLP | ⛔ 일반적으로는 불필요 |
딥한 Transformer | 🟡 gradient accumulation 시 고려 가능 |
🔍 Clipping 종류 정리
방식설명
clip_grad_norm_ | 기울기 벡터의 전체 norm을 제한 (L2 norm 기준) |
clip_grad_value_ | 개별 기울기 값들을 제한 (절대값 기준 max) |
일반적으로는 clip_grad_norm_을 더 많이 사용합니다.
✨ 마무리 요약
- Gradient Clipping은 학습 중 기울기 폭발을 방지하는 안전장치
- 특히 RNN, GAN, Deep Transformer 구조에서 효과적
- PyTorch에서는 clip_grad_norm_() 한 줄로 간편하게 적용
- clipping은 성능 향상보다 학습 안정성 확보가 목적
'AI > AI Info' 카테고리의 다른 글
Layer Normalization: 배치가 아니라, ‘특정 샘플’을 정규화한다 (0) | 2025.06.24 |
---|---|
Residual Connection: 깊은 네트워크도 뚫고 가는 잔차의 힘 (0) | 2025.06.24 |
Weight Initialization: 시작이 엉키면 끝도 엉킨다 (0) | 2025.06.22 |
Activation Function: 딥러닝을 ‘딥’하게 만드는 비선형의 힘 (0) | 2025.06.22 |
Batch Normalization이란? 딥러닝 학습의 가속 페달 (0) | 2025.06.22 |