[P stage DAY 17] 이미지 분류 (4) - Training&Inference

먼지감자·2021년 8월 26일
0

AI Boostcamp 2기

목록 보기
16/48
post-custom-banner

강의 내용 복습

(7강) Training & Inference 1

  • 모델 학습에 필요한 요소(Loss, Optimizer, Metric)의 의미
  • Optimizer가 Learning rate를 스케쥴링 하는 방식
  • 태스크의 속성과 데이터 분포에 따른 Metric의 중요성

Loss

(오차)역전파

loss = cost = error
역전파를 통해 loss가 작아지는 방향으로 weight update

nn.modules , loss backward
loss 도 nn.module의 family이기 때문에 forward함수 가지고 있다. module을 상속하는 모델과 연결이 가능하다는 말

loss.backward() 가 실행되면 모델의 파라미터의 grad값이 업데이트 된다.

required_grad=False 인 경우는 업데이트 안함

특별한 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를 동적으로 조절하여 loss의 최저점을 효율적으로 찾게 하는 방법
    • StepLR : 특정 Step 마다 LR 감소
    • CosineAnnealingLR : Cosine 함수 형태처럼 LR을 급격히 변경
    • ReduceLROnPlateau : 더 이성 성능 향상이 없을 때 LR 감소

Metric

학습에 직접적으로 사용되지는 않지만 학습이 잘 되었는지 객관적으로 평가할 수 있는 지표가 필요하다.

  • 모델의 평가
    Classfication : Accuracy, F1-score, Precision, recall, ROC&AUC
    Regression : MAE, MSE
    Ranking : MRR, NDCG, MAP

현업에서 일을 할때에는 metric을 결정해주는 사람이 없다. 문제를 보고 어떤 metric을 설정할지 competition을 통해 익히자.

  • metric의 허와 실

    내가 만든 모델의 정확도가 90%일 때..
    오른쪽의 경우 데이터의 분포가 굉장히 불균형하여 target이 1일 경우 2000개 중에 100개만 맞추는 데도 정확도가 높게 나온다.
    즉 class가 두개인 데이터 2000개를 예측하는데 이중 90%가 0, 10%가 1이기 때문에 그냥 무조건 0이라고 예측하면 정확도가 90%가 나오게 되는 것이다.

데이터 상태에 따라 적절한 Metric을 선택하는 것이 필요하다.
Class 별로 밸런스가 적절히 분포 : Accuracy
Class 별 밸런스가 좋지 않아서 각 클래스 별로 성능을 잘 낼수 있는지 확인 필요 : F1-score


(8강) Training & Inference 2

  • 앞서 정의한 데이터셋, 모델, Loss, Optimizer, Metric을 가지고 실제 파이토치가 - 모델의 파라미터를 업데이트 하는 과정
  • side effect들이 모델을 업데이트하는 과정
  • 모델을 추론하고 제출하는 과정
  • Pytorch Lightning

Training Process

train 시작전 만든 결과물

model.train()

optimizer.zero_grad()
batch iteration이 돌아가며 이전 iteration에 있는 gradient가 남아있기 때문에 0으로 초기화 시켜줌으로서 현재 batch에 있는 값으로만 update하는데에 사용한다. (default는 이전 grad와 더함)

loss = criterion(outputs, labels)
loss를 마지막으로 chain이 생성되었기 때문에 loss.backward로 연결된 모든 parameter의 grad를 구할 수 있다.

optimizer.step
backward로 구한 gradient를 가지고 parameter를 update 한다. optimizer정의 시 parameter를 인자로 넘겨주고, 해당 parameter를 컨트롤하는 것이다.

gradient accumulation
작은 배치 안에서 데이터의 전체 분포를 다 담지 못하기 때문데 batch size를 크게해야 할 때, 이것과 비슷한 효과를 내는 방법

매 batch iteration마다 optimizer.step을 하는 것이 아니라, n번 마다 하게하는 방법이다.
grad가 중첩된 상태에서 update를 하기 때문에 step하기 전 optimizer.zero_grad()를 하지 않고 parameter update후 초기화를 해준다.

Inference Process

model.eval()

with torch.no_grad()
inference과정에서 모델의 parameter가 update되지 않게 하기 위하여 torch.set_grad_enabled(False)를 해주는 과정.

Validation 확인
추론 과정에 validation set이 들어가게 해서 검증하는 것

check point
loss, acc 등이 이전의 가장 좋은 값보다 좋으면 torch.save로 모델 저장

pytorch Lightening

현업에서 일을 할 때에는 생산성이 중요하다.

지금까지 해왔던 과정을 간단히 fit으로 할 수 있다.

Further Reading

  • Optimizer scheduler plot 분석 : https://www.kaggle.com/isbhargav/guide-to-pytorch-learning-rate-scheduling

  • 학습에 진전이 없을 때, 일찍 끝내고 싶을때 등의 경우에 파이토치 프레임워크 위에서 사용할 수 있는 여러 라이브러리들의 코드를 참고하는 것도 좋아요. (Ignite, Catalyst)

  • 캐글에는 다양한 학습 및 추론에 대한 코드가 공유되고 있습니다. 그 코드들을 하나하나 따라가다보면 효율적이고 성능을 높일 수 있는 학습 방법을 발굴할 수도 있어요. 예시로 SE-ResNeXT를 이미지 분류 문제에 학습시키는 코드가 Bengali 대회에 공유되었어요. 링크

  • Pretrained Model에 대해 최신 기술을 매우 빠르게 업로드하고 간단하게 사용할 수 있게 공유해주는 레포가 있어요. 이를 참고해서 최고의 모델을 통해 문제에 가장 적합한 모델을 학습해보세요. 링크

  • 어떠한 loss 함수를 써야할지 고민이 되신다구요? Label Smoothing, F1 Loss (F1 Score를 목표로 하는 손실함수)와 같이 다양한 손실함수를 찾아보실 수 있어요.


과제 수행 과정 및 결과

  • 대회
    ViT 더 큰 모델 사용해봤으나 오버피팅 되어 일반화 성능 더 안좋음
    F1 loss, label smoothing 사용해봤으나 성능 차이 없음

피어 세션

대회 관련 얘기

  • 다른 분이 인종 관계 없이 모든 데이터를 받아 pseudo labeling 으로 labeling 한 후 wide resnet으로 모델 학습 결과 성능이 꽤 좋게 나왔다.
  • 도메인 자체는 동양인이기 때문에 동양인 age, gender가 labeling되어 있는 데이터셋을 찾아 마스크 데이터셋을 만들어 줄 예정
  • 이렇게 만든 마스크 데이터 셋으로 준지도 학습 진행 예정

학습 회고

다양한 시도를 해보고 싶은데 코드를 짜는 속도가 느리다.
체력도 받쳐주지 않지만,,,, 다음주까지 힘내서 해보고 싶었던 준지도 학습을 꼭 해보겠다.

profile
ML/AI Engineer
post-custom-banner

0개의 댓글