- 그래디언트 클리핑(Gradient Clipping)은 딥러닝 모델을 학습할 때 그래디언트 값의 폭발적인 증가를 방지하기 위한 기법임.
- 위 그림의 original gradient를 보면 목표 minimum 을 넘어가는 것을 볼 수있는데, 이때 gradient 값에 특정 cut-off의 제한을 줘서 안정적으로 수렴시키는 방법임.
- 특히 순환 신경망 (Recurrent Neural Networks, RNN)과 같은 모델에서 주로 사용되는데, sequence 가 길어지면 gradient가 계속 곱해지기 때문에 기하급수적으로 증가할 수 있음. (모델 Layer가 깊어져도 마찬가지임)
- Gradient Exploding(그래디언트 폭발)은 가중치 업데이트 과정에서 그래디언트 값이 너무 커져 모델의 가중치가 불안정해지고, 수렴하지 않는 문제를 해결하기 위해 사용됨
- Gradient값을 epoch 마다 print하거나(아래 예시코드 참고) pytorch_tensorboard 패키지를 이용해서 Gradient를 모니터링할 수 있음. (공식 documentation : https://tutorials.pytorch.kr/recipes/recipes/tensorboard_with_pytorch.html)
import torch
# 모델 및 옵티마이저 생성
model = MyModel()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
# 그래디언트 클리핑을 적용하려면 다음과 같이 수행
max_grad_norm = 1.0 # 클리핑할 최대 그래디언트 크기
for batch in data_loader:
inputs, targets = batch
optimizer.zero_grad()
outputs = model(inputs)
loss = loss_function(outputs, targets)
loss.backward()
# 그래디언트 클리핑
torch.nn.utils.clip_grad_norm_(model.parameters(), max_grad_norm)
optimizer.step()
# 매 에폭(epoch) 또는 일정한 간격으로 그래디언트 값 출력
if iteration % print_interval == 0:
for name, param in model.named_parameters():
if param.grad is not None:
print(f'Gradient for {name}: {param.grad.norm().item()}')
- 그래디언트 클리핑은 아래와 같은 단계로 이루어짐.
- Backpropagation을 통해 그라디언트 계산
- 모델의 Loss function 을 미분해서 각 파라미터값에 대한 그라디언트 값을 얻음
- Gradient clipping
- 특정 임계값(Threshold)을 기준으로 제한하는데, 보통 1.0 이하로 설정하며 1.0을 초과하면 1.0으로 변경됨
- 제한된(Clipping 된) Gradient 값으로 weight를 update
- 예시 코드는 위 코드블럭의 torch.nn.utils.clip_grad_norm_ 부분 참고
'Deep Learning' 카테고리의 다른 글
비전 트랜스포머(Vision Transformer, ViT) 개념, 설명 (0) | 2023.10.10 |
---|---|
트랜스포머(Transformer) 개념, 설명 (0) | 2023.10.09 |
Internal Covariate Shift와 Batch Normalization (0) | 2023.10.02 |
opencv (0) | 2023.10.02 |
seq-to-seq (0) | 2023.09.26 |