Training & Inference

Andrew·2021년 4월 1일
0

Training & Inference 1

  • 데이터셋도 준비했고, 모델도 준비했으니 드디어 본격적으로 모델 학습 과정에 들어간다
  • 그 전에, 모델 학습에 필요한 요소(Loss, Optimizer, Metric)의 의미를 다뤄보자
  • 앞서 설명한 파이토치 프레임워크에서 각각의 요소가 표현될 수 있을지 알아보자
  • 그리고, Optimizer가 Learning rate를 스케쥴링 하는 방식에 대해서 다뤄보자
    (Optimizer의 종류에 대해서는 따로 설명하지 않는다)
  • 마지막으로, 태스크의 속성과 데이터 분포에 따른 Metric의 중요성에 대해서 다뤄보자

Overview

  • 본격적으로 모델 학습을 진행해자

  • 학습 프로세스에 필요한 요소를 크게 아래와 같이 나눌 수 있다

Loss

복습: (오차) 역전파

  • Error Backpropagation

Loss도 사실은 nn.Module Family

  • nn 패키지에서 찾을 수 있다

loss.backward()

  • 이 함수가 실행되면 모델의 파라미터의 grad 값이 업데이트 된다

Example: 조금 특별한 loss

  • 쉽게 말해서 Error를 만들어내는 과정에 양념을 치는 것
  • 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,…]

Optimizer

어느 방향으로,얼마나 움직일 지?

  • 영리하게 움직일 수록 수렴은 빨라진다

LR scheduler

  • 학습 시에 Learning rate를 동적으로 조절할 수는 없을까?

LR scheduler : StepLR

  • 특정 Step 마다 LR감소

LR scheduler : CosineAnnealingLR

  • Cosine함수 형태처럼 LR을 급격히 변경

LR scheduler : ReduceLROnPlateau

  • 더 이상 성능 향상이 없을 때 LR감소

Metric

모델의 평가

  • Classification
    • Accuracy, F1-score, precision, recall, R…
  • Regression
    • MAE, MSE
  • Ranking
    • 보통 추천시스템에서 많이 사용한다
      • 높은 점수가 있는 것들이 상단에 노출되는 것이 중요하다
      • 따라서 순서 자체도 중요한 경우에는 ranking metric을 사용하게 된다
    • MRR, NDCG, MAP
  • 학습에 직접적으로 사용되는 것은 아니지만 학습된 모델을 객관적으로 평가할 수 있는 지표가 필요

Metric의 허와 실

  • 제가 만든 모델은 정확도가 90%입니다.^^
  • 1이라는 모델을 잘 못맞추는 모델 보다는 0 과 1 을 어느정도 맞출수 있는 왼쪽 모델이 더 좋다고 판단할 수 있다
  • 이렇듯 클래스의 밸런스(분포)가 맞지 않으면 위와 같이 accuracy 자체가 굉장히 높을 수 있다

올바른 Metric의 선택

  • 데이터 상태에 따라 적절한 Metric을 선택하는 것이 필요
  • Accuracy
    • Class 별로 밸런스가 적절히 분포 했을때 사용해도 유의미하다
  • F1-Score
    • Class별 밸런스가 좋지 않아서 각 클래스 별로 성능을 잘 낼 수 있는지 확인 필요할때 사용

Training & Inference 2

  • 이제 정말 본격적으로 학습과 추론 프로세스를 시작한다
  • 앞서 정의한 데이터셋, 모델, Loss, Optimizer, Metric을 가지고 실제 파이토치가 모델의 파라미터를 업데이트 하는 과정과 방식을 조금 디테일하게 접근해보자
  • 각각의 요소들이 하는 일과, 그로 인해 발생할 수 있는 side effect들이 모델을 업데이트하는 과정을 하나하나 보도록 하자
  • 그리고, 모델을 추론하고 제출하는 것도 간략히 다룬다
  • 마지막으로, Pytorch Lightning이 어떤 것인지 간략히 다룬다

Overview

  • 학습과 추론 프로세스의 과정을 이해 하는 것이 목표

Training Process

Training 준비

  • 학습 한번 하기 위해 지금 까지 만든 결과물

Training 프로세스의 이해

  • model.train()

Training 프로세스의 이해

  • optimizer.zero_grad()
    • optimizer.zero_grad()를 먼저하는 이유는 batch iteration이 돌면서 optimizer가 이전 batch에 있는 gradient가 그대로 남아 있게 된다
    • 통상적으로 각각의 mini-batch에서 발생한 loss만 가지고 gradient를 update 하는데 활용하지 일반적으로는 이전 단계들의 loss를 활용하지 않는다
    • 따라서 zero_grad()를 통해 각각의 파라미터가 가지고 있는 grad의 수치를 0으로 초기화 시킨다
    • 매 iteration 때 이런식으로 처리를 해주지 않으면 loss가 더해진다
  • loss = criterion(outputs, labels)
  • loss를 마지막으로 chain 생성
  • loss의 grad_fn chain → loss.backward()
  • optimizer.step()

More: Gradient Accumulation

  • 지금까지의 모든 과정을 이해했다면 이를 응용하는 것도 가능하다
  • 배치사이즈를 크게하여 학습할 필요가 있지만 GPU의 메모리가 부족하여 작은 배치로 학습할때
  • 배치사이즈를 늘리는 것과 비슷한 효과를 줄 수 있는 방법이다
  • 미니배치를 지정해준 숫자만큼 skip하고 지정해준 숫자를 지난 다음 optimizer.step(), 즉 업데이트를 하게끔 만든다
    • 이 방법으로 loss는 배치가 계속 돌아가면서 중첩적으로 쌓이게 되고 실직적으로 쌓인 loss를 step을 밟아서 parameter를 업데이트한다

Inference Process

Inference 프로세스 이해

  • model.eval()
  • with torch.no_grad():
    • gradient의 업데이트를 막아준다

Validation 확인

  • 추론 과정에 Validation셋이 들어가면 그게 검증이다

Checkpoint

  • 직접 짜면 된다

최종 Output, Submission형태로 변환

  • 최종 Submission스펙을 확인 후 변환하여 제출

Appendix: Pytorch Lightning

Pytorch Lightning

  • Keras 코드를 보는 듯..

그래도 공부는 Pytorch로 했으면 해요

  • 충분한 이해가 바탕이 되지 않은 상태에서는 오히려 독이 될 수 있다
  • 코드로 부터 머신러닝 프로세스를 배울 수 있고 자유롭게 응용할 수 있음
profile
아기개발자

0개의 댓글