또르르's 개발 Story

[Stage 1 - 이론] Training & Inference 본문

[P Stage 1] Image Classification/이론

[Stage 1 - 이론] Training & Inference

또르르21 2021. 4. 1. 11:40

1️⃣ Loss

1) Custom Loss

  • Focal Loss

    Class Imbalance 문제(확률 자체가 낮게 측정됨)가 있는 경우,

    맞춘 확률이 높은 Class는 조금의 loss를, 맞춘 확률이 낮은 Class는 Loss를 훨씬 높게 부여합니다.
  • Label Smoothing Loss

    Class target label을 Onehot 표현으로 사용하기보다는 ex)[0,1,0,0,0,…]

    조금 Soft하게 표현해서 일반화 성능을 높이기 위함 ex)[0.025,0.9,0.025,0.025,…]

 

2️⃣ Optimizer

 

Optimizer는 Loss 값을 실제 Weight에 적용해 조정하는 역할을 합니다.

이때, 중요한 것은 Learning rate (학습률)로 얼마나 움직일지를 결정하는 역할을 합니다.

https://www.edwith.org/bcaitech1

 

1) StepLR

Learning rate를 특정 step마다 고정적으로 감소시키는 역할을 합니다. 

 

https://www.kaggle.com/isbhargav/guide-to-pytorch-learning-rate-scheduling/log

 

 

2) CosineAnnealingLR

Cosine 함수 형태처럼 LR(Learning Rate)를 급격히 변경하는 방법입니다.

변화를 다양하게 줌으로써 local minimum에서 벗어날 수 있게 만들어줍니다.

 

https://www.kaggle.com/isbhargav/guide-to-pytorch-learning-rate-scheduling/log

 

 

3) ReduceLROnPlateau

더 이상 성능 향상이 없을 때 LR이 감소합니다.

가장 많이 사용합니다.

 

https://www.kaggle.com/isbhargav/guide-to-pytorch-learning-rate-scheduling/log

 

 

3️⃣ Metric

 

Metric은 객관적인 지표를 만들어서 모델의 성능이 어느정도인지를 확인하는 절차입니다.

따라서 데이터 상태에 따라 적절한 Metric을 선택하는 것이 필요합니다.

 

  • Accuracy

    Class 별로 밸런스가 적절히 분포

  • F1-Score

    Class별 밸런스가 좋지 않아서 각 클래스 별로 성능을 잘 낼 수 있는지 확인 필요

 

 

4️⃣ Training Process

 

Training process는 다음 순서로 진행됩니다.

 

  • model.train()

    train 모드에서는 Dropout, BathNorm 등에서 조금 다르게 작용됩니다.

  • optimizer.zero_grad()

    batch iteration이 돌아가면서 이전 batch의 grad들이 남아있게 됩니다.

    parameter들이 각각의 grad를 가지고 있기 때문에 그 grad 값들을 초기화시켜줍니다.

    만약, zero_grad를 하지 않으면 default가 loss를 더해주는 방향으로 가기 때문에 zero_grad를 해주어야 합니다.

 

 

  • loss = criterion(outputs, labels)

    output tensor와 ground truth tensor를 비교해서 차이 값 tensor를 발생시킵니다.

    nn.module을 상속받기 때문에 forward 함수를 가질 수 있고, input에서 loss까지 하나의 연결된 chain 형태를 띄게 됩니다.

  • loss의 grad_fn chain -> loss.backward()

    input을 넣고 forward 했을 때 각각 연결되어있는 module의 grad_fn function에 backward 함수가 적용되어있는 것을 볼 수 있습니다. iteration을 수행하면서 tree 구조의 chain이 만들어지는 것을 확인할 수 있습니다.

    따라서 loss를 확인하게 되면 grad_fn에서 계속 backward 함수가 추가되면서, 이전 module의 parameter들이 연결되는 것을 알 수 있습니다.

    backward()는 loss가 grad_fn을 찾은 후, chain으로 이어져 있는 backward 함수를 계속 찾아나가면서 grad를 업데이트하는 과정을 가지게 됩니다.

 

 

  • optimizer.step()

    이후, backward()로 업데이트된 gradient들을 parameter에 적용시키는 역할은 optimizer가 수행합니다.

    optimizer의 step은 정의되어 있는 알고리즘 (adam, momentum, 확률적 gradient 등)에 따라서 값을 update 하게 됩니다.

 

5️⃣ Gradient Accumulation

 

각 batch마다 optimizer.step()을 수행하는 것이 아니라 일정한 batch 횟수 후에 optimizer.step()을 수행하는 방법입니다.

loss는 계속 update 하기 때문에 gradient가 accumulation (쌓이게) 됩니다.

 

여기서 optimizer.zero_grad()는 optimizer.step()을 했을 때만 수행합니다.

 

 

 

6️⃣ Inference Process

 

Inference process는 다음 순서로 진행됩니다.

 

  • model.eval()

    eval 모드에서는 Dropout, BathNorm 등을 사용할 수 있게 만들어줍니다.

  • with torch.no_grad()

    __enter__라는 함수가 수행되면서 set_grad_enabled를 False로 주게 됩니다.

    set_grad_enabled의 False로 인해 해당 영역 안에 있는 모든 grad의 사용이 불가합니다.

 

  •  Validation 확인

    Inference 과정에 Validation dataset 검증을 통해 확인합니다.

  • Checkpoint

    훈련을 진행하면서 loss나 validation accuracy가 좋은 결과물들을 저장합니다.

 

'[P Stage 1] Image Classification > 이론' 카테고리의 다른 글

[Stage 1 - 이론] Ensemble  (0) 2021.04.02
[Stage 1 - 이론] Model  (0) 2021.03.31
[Stage 1 - 이론] Dataset & DataLoader  (0) 2021.03.30