주제: TS-3 Gradient 안정화 (Vanishing / Exploding Gradient와 Gradient Clipping)

분류: foundations

타입: concept

난이도: 입문

선수지식: 있음 - 미분, 체인룰(chain rule), 경사하강법(gradient descent)

깊은 모델에서는 gradient가 너무 작아져서 안 움직이거나, 너무 커져서 발산할 수 있다. gradient 안정화는 학습이 실제로 진행되게 만드는 기본 안전장치다.

직관적 이해 (비유)

딥러닝 학습을 산을 내려가는 과정이라고 생각해보겠습니다.

문제는 모델이 깊어질수록 경사가 두 가지 문제를 일으킬 수 있다는 점입니다.

이 문제 때문에 딥러닝에서는 gradient 안정화 기법이 중요하며, 대표적으로 gradient clipping을 사용합니다.

왜 깊은 모델에서 Gradient 문제가 생기나

딥러닝에서 gradient는 체인룰을 통해 뒤에서 앞으로 전달됩니다.

Loss -> Layer3 -> Layer2 -> Layer1

각 레이어에서 gradient가 계속 곱해지기 때문에 값이 급격히 커지거나 작아질 수 있습니다. 그래서 깊은 네트워크에서는 forward뿐 아니라 backward의 수치 안정성도 같이 관리해야 합니다.

Transformer에서 residual connection과 normalization을 강하게 쓰는 이유도 결국 깊은 층에서 gradient 흐름을 유지하기 위해서입니다.

수식 1: Gradient Descent 업데이트

θ=θ-ηL(θ)

기호 의미

왜 필요한가

이 수식은 모델이 loss를 줄이기 위해 파라미터를 업데이트하는 기본 규칙입니다.

한계 / 주의점

수식 2: 체인룰로 인한 Gradient 전파

Lx1=Lxnxnxn-1...x2x1

기호 의미

왜 필요한가

역전파(backpropagation)는 마지막 레이어의 gradient를 처음 레이어까지 체인룰로 전달합니다.

한계 / 주의점

수식 3: Gradient Clipping

g=g×(cg) if g>c

기호 의미

왜 필요한가

gradient가 너무 커질 경우 크기를 제한하여 학습이 폭발하지 않도록 합니다.

한계 / 주의점

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개

체크리스트 (스스로 설명 가능해야 하는 질문)