국문과 유목민

[일일리포트] Day 25 (DL기초_Training&Inference) 본문

IT 견문록/2022_부스트캠프 AITech 3기(100일)

[일일리포트] Day 25 (DL기초_Training&Inference)

논곰 2022. 2. 24. 00:00

 

해당 일일리포트에서는 네이버 커넥트에서 진행하는 '부스트캠프 AI Tech 3기'에서 배운 내용을 다루고 있습니다. 저작권 이슈 때문에 관련 자료를 올릴 수는 없기에 핵심 이론과 코드를 요약해서 올리고 있기에 내용이 부족할 수 있습니다.

▶ Today I Learned (핵심 요약 정리)

Training & Inference

Loss, Optimizer, Metric

학습 프로세스에 필요한 요소는 크게 Loss, Optimizer, Metric으로 나눌 수 있다. 

Loss

Error BackPropagation 과정에서 Output과 Target의 Error 차이를 알아내기 위해 사용한다. Loss함수는 Cost함수나 Error함수라고도 한다. Loss는 nn 패키지에서 찾을 수 있는데, 이 말은 loss에도 Forward가 정의되어 있어 Loss가 모델과 연결될 수 있다는 의미다.

  • loss.backward(): 이 함수가 실행되면 모델의 파라미터의 grad값이 업데이트 된다. loss는 criterion이라는 변수를 사용해서 정의한 값이 들어간다.

Error를 만들어내는 과정에서 양념을 치는 조금 특별한 Loss도 존재한다.

  • Focal Loss: Class Imbalance 문제가 있는 경우, 맞춘 확률이 높은 Class는 loss를 조금, 맞춘 확률이 낮은 Class는 loss를 훨씬 높게 부여한다. 이렇게 함으로써 클래스 불균형 문제를 어느정도 해결할 수 있다.(Class가 다양한 경우 사용)
  • Label smoothing loss: Class target label을 Onehot 표현으로 사용하기 보다는 조금 Soft하게 표현해서 일반화 성능을 높이는 방법이다. 

Optimizer

WeightParameter를 학습할 때, 특정 방향으로 얼마나 움직일 지(Learning rate)를 결정하는 것이다. 

$$w' = w - \eta \frac{\partial E}{\partial w}$$

Loss는 값만 발생시키는 것이고, 실제 Loss를 Weight를 갱신하는 역할을 하는 것이 Optimizer이다.

  • LRscheduler
    • StepLR: 고정된 Step값만큼 학습이 되다가 특정 Step이 지날 때마다 LR 급격히 감소
    • CosineAnnealingLR: Cosine함수 형태처럼 LR을 급격히 변경시킨다. 변화를 다양하게 줄 수 있기에 local minima에 빠지는 위험을 방지할 수 있다.
    • ReduceLRonPlaeateau: 더 이상 성능 향상이 보이지 않을 때 LR이 감소.

Metric

학습에 직접적인 영향을 미치지 않지만, 학습된 모델을 객관적으로 평가할 수 있는 지표가 필요한데 이게 바로 Metric이다. 모델의 평가지표는 어떤 Task를 수행하느냐에 따라서 달라진다. 아래 예시 외에도 다양한 메트릭 지표가 존재한다. 

  • Classification: Accuracy. F1-Score, Precision, recall, ROC-AUC
  • Regression: MAE, MSE
  • Ranking: MRR, NDCG, MAP (추천 시스템에서 사용)'

Metric을 사용할 때에는 데이터 상태에 따라서 적절한 것을 활용해야 한다. Metric이 가지고 있는 허와 실을 구분할 수 있어야 한다. 

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

Training Process

Training 준비: Dataset - DataLoader - Model(Pretrained Model) - Loss/Optimizer/Metric

  • model.train(): 모델의 파라미터를 train 가능하게 만들어준다. Dropout과 BatchNorm을 train 과정에서 사용가능하게 만들어준다.
  • optimizer.zero_grad(): 배치마다 gradient가 생성이 되는데, 다음 batch 때 이전 gradient의 값을 zero로 만들어야 계산이 수월해진다. zero_grad()를 활용해 모델의 파라미터를 컨트롤 할 수 있다.
  • criterion = torch.nn.CrossEntropyLoss() \
  • loss = criterion(outputs, labels): loss를 마지막으로 모델 간 chain을 생성할 수 있다. 따라서 loss의 함수를실행시키기만 하면 연결된 모든 파라미터에게 grad 값을 업데이트할 수 있다.
  • optimizer.step(): optimizer가 업데이트된 grad를 바탕으로 update시키는데 사용되는 코드

Gradient Accumulation: Optimizer를 특정 Step에만 활용하는 방법 

Inference Process

Trainig 과정을 거친 모델은 Inference 과정을 거치게 된다. 

  • model.eval(): self.train(False)와 동일하다. 파라미터들이 test과정에서 활용가능하게 해준다.
  • with torch.no_grad(): 모델의 Tensor 안에 모든 grad가 False가 되게 한다. 따라서 Forward과정에서 grad가 발생해도 grad나 파라미터가 업데이트 되지 않는다.
  • Checkpoint: 결과물들은 직접 코드를 짜서 그때그때 저장하면 된다.

Validation Set이 들어가면 그게 검증이 된다. 최종 Output, Submission 형태로 변환, 최종 Submission 스펙을 확인 후 변환하여 제출한다.

Ensemble

 여러 실험을 하다보면 여러가지 모델로 여러 결과를 만들 수 있게 된다. 그때 이렇게 만든 모델들을 활용해서 더 나은 결과를 만들 수도 있는데, 이 방법이 바로 Ensemble이다. 단, 앙상블은 현업에서 잘 사용되지는 않는데, 그 이유는 조금의 성능 향상보다는 Product Serving 측면을 더 신경써야 하기 때문이다. 앙상블은 반드시 해야한다기보다는 성능을 올릴 수 있는 방법 중 하나일 뿐이다.

 딥러닝은 보통 Overfitting 문제가 발생하는 경향이 존재한다. 이를 해결하기 위해 Ensemble방법을 활용할 수 있다.

  • Overfitting의 High Variance 문제의 경우 부스팅 방식을 활용한다.
  • Underfitting의 High Bias 0문제의 경우 배깅 방식을 활용한다.
  • Model Averaging(Voting): 같은 데이터 셋에 대해서도 다른 모델들은 보통 서로 다른 에러를 만든다. 따라서 여러 모델들을 합쳐서 결과를 선정한다. 보팅 방식에는 HardVoting과 SoftVoting이 존재한다.

Cross Validation

훈련 셋과 검증 셋을 분리는 하되, 검증 셋을 학습에 활용할 수 있는 방법은 없을까?라는 방법에서 나온 방법이다. CV 점수에 해당하는 부분이 바로 이것이다.

  • Stratified K-Fold Cross Validation: 가능한 경우를 모두 고려하고, Split 시에 Class 분포까지 고려한다. 보통 k의 개수는 5개를 사용한다. 또한 K의 개수가 많아지면 모델을 여러 개 만들어야 해서 시간이 오래 걸린다.
  • Test Time Augmentation(TTA): 테스트 이미지를 Augmentation 후 모델 추론, 출력된 여러가지 결과를 앙상블

앙상블의 효과는 확실히 있지만 그만큼 학습, 추론 시간이 배로 소모되게 된다. 따라서 성능과 휴율의 Trade-off를 잘 고려해야 한다.

Hyperparameter Optimization

하이퍼 파라미터는 시스템의 매커니즘에 영향을 주는 주요한 파라미터이기 때문에 이를 잘 설정하면 성능의 향상을 기대할 수 있다. 하지만 하이퍼파라미터 튜닝은 들인 시간 대비 성능의 효과가 다이나믹 하지는 않기 때문에 Competition과 같이 조금이라도 성능을 올려야할 때 사용하고는 한다. 튜닝으로 GridSearch, Random, Baysian Optimization(이론적으로 Hard하지만 가장 많이 사용) 등의 방법이 있다. 

  •  Optuna: 파라미터 범위를 주고 그 범위 안에서 trials만큼 시행한다. optuna같은 라이브러리를 통해서 파라미터 튜닝을 수월하게 할 수 있게 해주는 라이브러리
  • Ray

Training Visualization

Tensorboard

학습 과정을 기록하고 트래킹하는 데 사용한다. 사용법은 다음과 같다. (우리의 경우 서버에서 사용하기 때문에, PORT연결하는 부분 기억)

  • --logdir PATH: log가 저장된 경로
  • --host ADDR: 원격 서버에서 사용 시 0.0.0.0 (default: localhost)
  • --port PORT: 포트번호
from torch.utils.tensorboard import SummaryWriter
logger = SummaryWriter(log_dir=f"results/{name}")

logger.add_scalar("Train/loss", train_loss, epoch * len(train_loader) + idx)
logger.add_scalar("Train/accuracy", train_acc, epoch * len(train_loader) + idx)

 

wandb

딥러닝 로그의 깃허브 같은 느낌의 딥러닝 시각화 도구이다.

  • wandb login: 계정 설정
  • wandb init & log 사용

Some Tips

  • Tip1) 분석코드보다 코드를 설명한 글을 유심히 보자. 좋은 노트북이라면 코드의 방향성을 쉽게 이해할 수 있다. 그렇게 한다면 필자가 생각하고 있는 흐름을 읽을 수 있다. 그리고 이러한 것을 적어둘 때, 우리는 흐름을 이해할 수 있게 된다.
  • Tip2) 코드를 볼 때는 디테일한 부분까지 보도록 하자. 내가 이것을 언제든 활용할 수 있을 정도로 이해해야 한다.
  • Tip3) Paper with Codes: 최신논문과 그 코드까지 볼 수 있다. 이를 활용해 SOTA 모델을 보고 코드도 살펴볼 수 있다.
  • Tip4) 공유하는 것을 주저하지 말자. 새로운 배움의 기회가 될 수 있다.

▶ Review (생각)

 3일만에 강의 10개를 드디어 끝내게 되었다. 강의를 들으면서 계속해서 코드를 보고 싶다는 생각을 했다. 내용도 알찼고, 이전에 배운 내용들을 복습하는 느낌에서 충분히 좋은 강의였다. 하지만 프로젝트를 하고 싶다는 생각에 집중을 잘 못했다. 그래서 나중에 모델에 대해 궁금한 부분이 있다면 해당 강의를 다시 찾아 보는 것도 좋은 방법일 것 같다.

 

 추가적으로 피어세션에서 슬슬 프로젝트에 관해서 얘기를 하고 있는데, 걱정도 되고 기대도 된다. 팀원들 다 열심히 하려고 하기에 나 또한 더 열심히 해야겠다. 팀 프로젝트라는 환경은 언제나 어색한 부분이 있지만, 그 과정에서 얻을 수 있는 것도 많다는 점을 매순간 기억하면서 감사하게 임해야겠다.

 

 오늘은 학업적인 강의말고도 특강이 있었는데, 변성윤 마스터님께서 새로 'DoLearnDoRun(두런두런)'이라는 특강 시간을 준비해주셨다. 근데 이 강의가 나에게 굉장히 울림이 있었던 강의였다. 개념이 제대로 잡혀있지 않은 직무들에 대한 얘기나 산업에서 실제 이 직무들의 역할에 대해 설명을 해주시기도 했고, 그 외에도 내가 혼자 공부하면서 얻기 어려웠던 지식들에 대해서도 말씀을 해주셨다. 만약, 내가 혼자 공부했더라면 알 수 없는 지식들이었을 것이라고 생각하니 새삼 해당 강의가 얼마나 감사한 지 느낄 수 있었다. 나중에 기회가 되면  해당 강의의 내용을 블로그에 정리해서 동기부여를 할 때 사용하면 좋겠다. 

 

 강의를 들으면서 다양한 마스터님들을 뵐 수 있는 것의 장점은 다양한 마스터님들의 인사이트를 들을 수 있다는 것이라고 생각한다. 다른 사람의 인사이트를 책을 통해서 접할 수 있지만서도, 강의나 특강 등을 통해 들을 때 더 큰 동기부여가 된다. 물론, 이렇게 동기부여를 받고 바로 행동으로 옮겨야 한다는 것을 잊지 말아야겠다.

 

p.s. 빨리 자소서 쓰고 싶다...

Comments