4 minute read

Training & Inference

  • 모델 학습에 필요한 요소(Loss, Optimizer, Metric)를 알아보자.
  • Optimizer가 Learning rate를 스케쥴링하는 방법을 알아보자.
  • Metric의 중요성에 대해 알아보자.
  • 진짜로 학습과 추론 Process

Loss & Optimizer & Metric

Loss

역전파

Loss

  • Loss 함수 = Cost함수 = Error함수 -> 에러를 측정한다.

nn.Module Family

  • forward를 가지고 있다. -> module의 성질을 가진다.
  • loss.backward()가 실행되면 모델의 파라미터 grad값이 업데이트된다.

special Loss

  • 에러를 만들어내는 과정에 양념을 치는 것
  • Focus Loss
    • Class Imbalance 문제가 있는 경우, 맞춘 확률이 높은 Class는 조금의 loss를, 맞춘 확률이 낮은 Class는 Loss를 훨씬 높게 부여.
  • Label Smoothing Loss
    • Class target label을 Onehot 표현으로 사용하기 보다는 조금 Soft하게 표현해서 일반화 성능을 높이기 위함 ex) [0.1, 0.14, 0.0021, …]

Optimizer

optimizer

  • 옵티마이저는 최적 점으로 어떤 방향으로 얼마나 움직이게 할 것인가를 결정한다.

LR scheduler (torch.optim.lr_scheduler)

학습시에 learning rate 를 동적으로 조절하는 방법들.

  • StepLR - 특정 Step 마다 LR 감소
  • CosineAnnealingLR - Cosine 함수 형태처럼 LR을 급격히 변경(local min을 빠르게탈출)
  • ReduceLROnPlateau - 더 이상 성능 향상이 없을 때 LR 감소

Metric

모델의 평가

  • 학습된 모델을 객관적으로 평가할 수 있는 지표가 필요하다.
  • Classification
    • Accuracy, F1-score, precision, recall, …
  • Regression
    • MAE, MSE
  • Ranking
    • MRR, NDCG, MAP

Score의 허와 실

score

  • 위의 오른쪽 그림을 보면 클래스의 숫자가 편향되어 있어 1을 예측할 때 100개 밖에 맞추지 못했다.(하지만 90퍼센트의 정확도를 나타냈다.)
  • 어느 쪽이 더 좋은 모델이라고 할 수 있을까?
  • 하나의 Metric으로 좋은 결과가 나왔다고 끝내지말고, 좀 더 상황을 고려한 metric을 선정하자.

Metric을 선택하는 방법

  • Class 별로 밸런스가 적절히 분포 -> Accuracy
  • Class 별로 밸런스가 좋지 않아서 각 클래스 별로 성능을 잘 낼 수 있는 지 확인이 필요하다 -> F1-Score

Training Process

Training 이해하기

  • model.train() : model을 training mode로 설정한다.
  • optimizer.zero_grad() : 이전 배치에 grad가 남아있기 때문에 초기화 시켜줘야한다.(하지만 이전 배치 학습에서 훈련된 grad를 남기고 싶으면 초기화 안시켜줘도 된다. default는 초기화 안시킴.)
  • loss = criterion(outputs, labels) criterion = torch.nn.CrossEntropyLoss
  • loss 는 grad를 업데이트만 한다.
  • optimizer.step() - loss가 업데이트한 grad를 적용해 parameter에 업데이트 한다.

Gradient Accumulation

NUM_ACCUM 마다 parameter를 업데이트하고 초기화 한다.(자원이 부족할 떄 성능 향상을 기대할 수 있다.)

NUM_ACCUM = 2
optimizer.zero_grad()
for epoch in range(2):
  running_loss = 0.0
  for i, data in enumerate(train_loader, 0):
    inputs, labels = data
    outputs = net(inputs)

    loss = criterion(outputs, labels) / NUM_ACCUM
    loss.backward()

    if i % NUM_ACCUM == 0:
      optimizer.step()
      optimizer.zero_grad()

Inference Process

추론 프로세스

Inference 프로세스 이해하기

  • model.eval() : evaluation mode로 설정한다.
  • with torch.no_grad() : 추론 과정이기 때문에 grad를 변화를 막기위함. 다음과 같은 함수안에서 실행.
def __enter__(self):
  self.prec = torch.is_grad_enabled()
  torch.set_grad_enabled(False)

Validation 확인

  • 추론 과정에 Validation 셋이 들어가면 그것이 검증이다
  • torch.no_grad() 에서 model.eval() 모드로 validation 셋으로 실행

Checkpoint

다음처럼 자유롭게 짜면 된다. score

최종 output, submission 형태로 변환

  • 최종 output을 submission 형태로 변환하여 제출한다.(궁극적인 결과물)

Pytorch Lightning

  • 직관적이고 간단하게 코드를 알 수 있다.
  • 하지만 충분한 이해가 바탕이 되지 않은 상태에서는 오히려 독이 된다.
  • 현재 개발중.
  • 차후에 알아보자.

Comments