본문 바로가기
C.W.K.
Stream
Lesson 06 of 09 · published

기울기 소실과 기울기 폭주

~22 min · vanishing, exploding, depth

Level 0호기심
0 XP0/73 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

같은 근본 원인에서 생기는 두 가지 실패

연쇄 법칙에 따라 도함수는 계속 곱해져. 도함수가 대부분 1보다 작으면, 깊어질수록 곱한 값이 기하급수적으로 0에 가까워져. 이것이 기울기 소실이야. 반대로 대부분 1보다 크면 곱한 값이 무한대로 커져. 이것이 기울기 폭주야. 어느 쪽이든 깊은 층은 학습을 멈춰.

1990년대 후반에는 기울기 소실이 지배적인 문제였어. Sigmoid와 tanh 활성화 함수는 양쪽 끝에서 포화되고 도함수가 ≈ 0이 돼. 그래서 시그모이드를 사용한 20층 신경망에서는 초기 층이 거의 학습되지 않았어. ReLU, 신중한 초기화, 배치 정규화가 이 문제의 대부분을 해결했고, 나머지는 잔차 연결이 해결했어.

기울기 폭주는 보통 설정 하나로 해결해

기울기 폭주는 순환 신경망(LSTM, GRU)과 학습률 스케줄링이 잘못된 Transformer에서 가장 자주 나타나. 해결책은 기울기 클리핑이야. 옵티마이저가 갱신하기 전에 기울기의 전역 노름이 정해진 임계값을 넘지 않도록 제한해. torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0) 한 줄이면 돼.

팁: 학습 도중에 아무 경고 없이 NaN이 나오면 기울기가 폭주했을 가능성이 커. 기울기 클리핑을 추가하고(max_norm=1.0이 합리적인 기본값이야) 증상이 사라지는지 확인해.

기울기 소실은 구조로 해결해야 해

기울기 소실에는 클리핑을 쓸 수 없어. 기울기가 이미 0이라 클리핑할 값 자체가 없거든. 해결책은 구조를 바꾸는 거야. ReLU/GELU 활성화 함수, He/Xavier 초기화, 배치/층 정규화, 잔차 연결을 사용해. 현대 Transformer는 이 4가지를 모두 기본으로 함께 사용해. 그래서 2014년에는 불가능했을 깊이에서도 학습할 수 있어.

원칙: 딥러닝은 결국 기울기의 연쇄가 끊기지 않도록 유지하는 기술이야. 다음 트랙에서 다룰 규제, 정규화, 잔차 연결이 바로 그 기술이야.

Code

세 줄로 구현하는 기울기 클리핑·python
import torch
from torch.nn.utils import clip_grad_norm_

opt.zero_grad()
loss.backward()
clip_grad_norm_(model.parameters(), max_norm=1.0)
opt.step()
층별 기울기 노름 진단·python
def layer_grad_norms(model):
    norms = []
    for name, p in model.named_parameters():
        if p.grad is not None:
            norms.append((name, p.grad.norm().item()))
    return norms

for name, n in layer_grad_norms(model)[:5]:
    print(f"{name:40} {n:.6f}")

External links

Exercise

합성 시퀀스 과제로 LSTM을 학습해. 클리핑을 적용하기 전과 후의 기울기 노름을 기록해. 클리핑을 끄고 어떤 일이 일어나는지 확인해. 두 결과의 차이가 기울기 클리핑이 필요한 이유를 가장 구체적으로 보여주는 실험이야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.