호기심 많은 분석가

[BoostCamp] Week4_Day18. 여러가지 실험들 본문

Coding/BoostCamp

[BoostCamp] Week4_Day18. 여러가지 실험들

DA Hun 2021. 8. 31. 16:14
 

부스트캠프

개발자의 지속 가능한 성장을 위한 학습 커뮤니티

boostcamp.connect.or.kr

🕵🏻‍♂️마스크착용 분류 대회

  • Batch_size를 256까지 키우니까 일반화 성능이 떨어지는 것으로 판단
  • transforms대신 더 빠른 albumentation을 사용해봄
    • Image 라이브러리 대신 cv2를 사용하는데, BILINEAR의 경우 INTER_LINEAR로 ToTorch는 있었으나 사라지면서 ToTensorV2를 사용해야 한다고 함
    • ToTensorV2를 사용하면 tensor형태가 되어 Normalize시에 astype이 적용되지 못한다. 그래서 Normalize를 먼저 시행해줘야 함
    • augmented = self.transforms(image = img)처럼 image라고 명시해줘야하고, img = augmented['image']의 문법을 따름
  • ResNet152 model을 사용하고자 했으나 1epoch에 10분 이상이 걸려서 ResNet50으로 성능 확인 중
    • ResNet18과 다르게 feature가 2048개기 떄문에 2048 → 512로 보내주는 layer를 한층 더 쌓아주었다.
  • 멘토님이 알려주신 black과 isort 라이브러리를 굉장히 잘 사용 중

📙개인학습

(7강) Training & Inference 1

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

  • Loss, Optimizer, Metric

1. Loss

1-1. 복습: (오차) 역전파

  • Error Backpropagation

  • Loss도 사실은 nn.Module Family

  • loss.backward()
    • 이 함수가 실행되면 모델 파라미터의 grad 값이 업데이트 된다.
    • Net이라는 모델은 모듈을 상속하고 있는 패밀리다. criterion이라는 loss도 모듈을 상속하고 있다. 같은 클래스, 패밀리라는 뜻 → model에 input으로 들어간 것이 output으로 나오는 chain이 만들어짐, criterion도 모듈을 상속한 것이기 때문에 output을 받으면 forward 함수와 연결 짓는 chain이 이어지게 됨 → backward 하나로 전체 chain의 파라미터를 업데이트할 수 있다.
    •  

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,...]

2. Optimizer

  • 어느 방향으로, 얼마나 움직일지?
    • 영리하게 움직일수록 수렴은 빨라집니다.

2-1. LR scheduler

  • 학습 시에 Learning rate를 동적으로 조절할 수는 없을까?
  • StepLR - 특정 Step마다 LR 감소
  • CosineAnnealingLR - Cosine 함수 형태처럼 LR을 급격히 변경
  • ReduceLROnPlateau - 더 이상 성능 향상이 없을 때 LR 감소

3. Metric

3-1. 모델의 평가

학습에 직접적으로 사용되는 것은 아니지만 학습된 모델을 객관적으로 평가할 수 있는 지표가 필요

  • Classification - Accuracy, F1-Score, precision, recall, ROC&AUD
  • Regression - MAE, MSE
  • Ranking - MRR, NDCG, MAP / 순서가 중요할 때

3-2. Metric의 허와 실

  • 우측의 경우 정확도가 90% 더라도 타깃이 1번일 때 200개 중에 100개 밖에 맞추지 못함, 그래서 평가지표가 중요
  • 데이터 상태에 따라 적절한 Metric을 선택하는 것이 필요
    • Class 별로 밸런스가 적절히 분포 → Accuracy
    • Class 별 밸런스가 좋지 않아서 각 클래스 별로 성능을 잘 낼 수 있는지 확인 필요 → F1-Score

(8강) Training & Inference 2

1. Training Process

  • PyTorch는 이론적인 내용들을 다 구현해볼 수 있는 프레임워크

1-1. Training 준비

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

1-2. Training 프로세스의 이해

  • 모델을 train 하기에 앞서서, trainable 하게 만들어줘야 함 → model.train()
    • Dropout, BatchNorm을 사용해줄 수 있게 해 줌
  • Epoch은 전체 데이터를 다 본다. 데이터 로더에 for문을 넣어서 batch단위로 뽑아내게끔,
  • optimizer.zero_grad() : optimizer는 loss가 backward가 되는 데 있어서 각각의 모델 파라미터 안에 있는 gradient를 update 시킨다. 이때 zero_grad를 사용해주지 않으면 이전의 그라드가 남아있다. 새로운 batch에선 새로운 학습을 시키기 위해 grad를 초기화시켜줌 → 일반적인 경우에 이렇지 항상 해줘야 하는 것은 아님
    • 그러니까 이미 backward를 호출하면 .grad 값에 변화도가 저장이 되는데 zero_grad를 하지 않으면 이전에 저장된 .grad의 값이 다음 루프의 업데이트에도 간섭을 받아서 원하는 방향으로 학습이 안된다고 한다.
  • loss = criterion(outputs, labels)
    • Input → nn.Module → forward → Criterion==loss : Chain → output
    • loss의 grad_fn chain → loss.backward()
      • 그 모델 파라미터에 인풋에 해당하는 이미지를 집어넣고 forward 하면 각각의 연결되어있는 모듈의 grad_fn에 backward가 적용된 것을 확인할 수 있다 → 걔네들이 iteration을 돌면서 연결되어 있는 chain이 만들어짐 → grad_fn에서 계속 추가되면서 이전에 작업했던 모델의 파라미터까지 연결됨, loss가 grad_fn을 찾아서 걔네들이 가지고 있는 adam 같은 함수를 실행시켜주면 각각의 연결된 파라미터에게 grad를 업데이트할 수 있다. → 이 모든 걸 backward() 한번 실행으로 가능하다.
    • More: Gradient Accumulation
      • batch_size가 중요한 Task가 있을 수 있다. GPU의 성능이 부족해서 작은 batch_size만 사용할 수 있는데, 이럴 경우(큰 batch_size를 써야 할 때)는 어떻게 해줘야 할까?
        • 일정 간격마다 optimizer.step()을 밟아주면 step 하기 전에는 batch가 돌면서 loss만 쌓이다가 일정 간격이 됐을 때, 지금까지 쌓인 loss를 통해 파라미터를 업데이트하면서 학습한다 == Gradient Accumulation

2. Inference Process

2-1. Inference 프로세스 이해

  • model.eval()
  • with torch.no_grad():
    • 검증을 거치는 과정이기 때문에 파라미터가 업데이트되길 원하지 않음
    • enter라는 함수가 실행되는데, set_grad_enable(False) - 이 영역 안에서 모든 grad enable는 False로 만든다

2-2. Validation 확인

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

2-3. 최종 Output, Submission 형태로 변환

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

3. Appendix: Pytorch Lightning

  • 이제껏 배웠던 내용들 굉장히 중요하다. 이해하는 데도 필수적이고, 하지만 협업에서는 생산성이 중요해서 이런 작업들이 번거로울 수 있다. → 그래서 Pytorch Lightning 등장
  • Keras 코드를 보는 듯 → 점점 개발되는 중
  • 하지만 공부는 Pytorch로 했으면 한다. 충분한 이해가 바탕이 되지 않은 상태에서는 오히려 독이 될 수도 있다. 코드로부터 머신러닝 프로세스를 배울 수 있고 자유롭게 응용할 수 있음

👨‍👨‍👦‍👦피어세션

굿모닝 세션 😉

  • 원상님께서 train과 val의 차이가 크지 않고 성능이 좋은데, 왜 결과가 안 좋게 나올까.. 테스트 셋 형태를 확인해봐야겠다 → 이미지를 잘라서 그런 건 아닐까? train과 val을 분리할 때 사람을 아예 분리해서 그런 건 아닐까?
    • 성능 하락 원인 예측
      1. 얼굴만 따로 자른다
      2. 해상도가 낮다
      3. 사람을 아예 분리한다
  • gnerator와 model의 성능을 비교해볼 수 있는 게 있을까
    • 조금 복잡할 것, model이 GPU에서 계산할 때 generator가 CPU가 작업하는 시간을 비교해봐야 해서
  • imbalance class에 가중치를 어떻게 주는가?
  • 정훈
    • 이미지를 잘라서 활용하는 것보다 그냥 활용하는 게 좋을 수도 있음
    • 배경, 옷 등 요인이 영향을 미칠 수 있음
  • 현동
    • crop 한 것과, crop 안 한 것 같이 학습을 시키니 성능이 좋아지더라..!
  • 주영
    • epoch 별로 가중치를 저장하여 5, 10, 15일 때의 성능을 비교해봤는데 epoch 별 성능 차이가 크지 않은 것 같음

굿에프터눈 세션 😄

오늘부터는 팀 병합을 해야 하기 때문에 협업 방법에 대해 심도 깊게 이야기 나눔

  • 데이터 정리 방법(실험)
    1. 같은 사람이 train과 val에 나뉘지 않도록 한다 → resnet18로 주영 실험
    2. class가 stratify 하게 나뉘게 사람 상관없이 나눈다.
  • 데이터 전처리 방법(실험)
    • crop 유무
  • 데이터셋 - 원상님
    • 3개의 classifier를 argument를 통해서 option으로 선택할 수 있다.

 

 

[AI Tech]Daily Report

Naver AI Tech BoostCamp 2기 캠퍼 허정훈 2021.08.03 - 2021.12.27 https://bit.ly/3zvJnSh

data-hun.notion.site