Deep Learning

Gradient clipping

Kimhj 2023. 10. 6. 20:45

 

Gradient Clipping

 

 

  • 그래디언트 클리핑(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