Traning & Inference
Training & Inference
- 모델 학습에 필요한 요소(Loss, Optimizer, Metric)를 알아보자.
- Optimizer가 Learning rate를 스케쥴링하는 방법을 알아보자.
- Metric의 중요성에 대해 알아보자.
- 진짜로 학습과 추론 Process
Loss & Optimizer & Metric
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
- 옵티마이저는 최적 점으로 어떤 방향으로 얼마나 움직이게 할 것인가를 결정한다.
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의 허와 실
- 위의 오른쪽 그림을 보면 클래스의 숫자가 편향되어 있어 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
다음처럼 자유롭게 짜면 된다.
최종 output, submission 형태로 변환
- 최종 output을 submission 형태로 변환하여 제출한다.(궁극적인 결과물)
Pytorch Lightning
- 직관적이고 간단하게 코드를 알 수 있다.
- 하지만 충분한 이해가 바탕이 되지 않은 상태에서는 오히려 독이 된다.
- 현재 개발중.
- 차후에 알아보자.
Comments