⚠️ Gradient가 폭발한다고?

딥러닝 모델을 학습하다 보면 특정 조건에서 역전파(Backpropagation)
기울기(gradient)의 크기가 기하급수적으로 커지는 현상이 발생할 수 있습니다.
이를 **Gradient Explosion(기울기 폭발)**이라고 합니다.

특히 RNN, LSTM, GAN 등에서 매우 자주 발생하며,
발생하면 Loss가 NaN으로 터지고 모델이 망가집니다.


🧠 왜 이런 일이 생길까?

기울기가 레이어를 거치며 연속적으로 곱해지기 때문입니다.
→ 깊거나 순환적인 구조에서 가중치가 큰 값일 경우,
backward 시 ∇L이 계속 커지며 무한대 수준까지 치솟을 수 있음


🛡️ 해결 방법: Gradient Clipping

Gradient Clipping은 기울기의 크기를 특정 임계값 이하로 자르는 방식입니다.
학습 중 기울기가 설정한 threshold 이상으로 커지지 않도록 강제로 잘라냅니다.

if ||∇L|| > threshold:
    ∇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()
 

✅ 위 예제에서는 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은 성능 향상보다 학습 안정성 확보가 목적

+ Recent posts