공부한 내용
1. Training
학습에 필요한 3가지 요소 Loss, Optimizer, Metric -> Training에 직접적인 영향
1.1. Loss
• (Error) Backpropagation
- loss(error)가 backward 방향으로 다른 노드의 parameter에 update
- loss function, class에 따라 달라진다.
- loss에 따라 backpropagation에서 parameter update 과정도 달라진다.
- loss function == cost function == error function
• Loss function도 nn.Module 상속
- loss도 module과 비슷하다.
- loss도 forward 함수 존재
- 학습 과정에서 어떻게 연결되지 알 수 있다.
- backward 작동 방식 이해할 수 있다.
• backward
- loss.backward() : model의 parameter들의 grad update
- requires_grad=False인 경우 grad update 안함
- trainloader : data (input, target) generation
- criterion : loss function
- parameter의 grad값 확인 가능
- forward로 input부터 loss까지 생긴 연결로 인해 backward 가능
• Loss examples
- Focal Loss
· class imbalance : data가 부족해서 맞출 확률이 낮은 class 존재
· 맞춘 확률 높은 class는 작은 loss, 맞춘 확률 낮은 class는 높은 loss 적용
· 불균형의 다양한 class에서 사용
- Label Smoothing Loss
· 확률이 높은 class가 100퍼센트 target이라고 확정할 수 없다.
· image에 다른 class의 물체도 포함되어 있을 수 있다.
· label 나눌 때 one-hot vector를 사용하지 않고 soft하게 표현해서 일반화
1.2. Optimizer
• 학습 방향과 속도
- optimize는 각 weight에 어떤 학습률을 적용해서 update할 것인지 결정하는 과정
- optimizer는 loss값을 update하는 주체
- Learning rate : 학습 속도
- partial derivative : 방향
• LR scheduler
- scheduler : optimizer가 learning rate 조정하는 전략 수행
- 학습 시 learning rate 동적으로 조절하여 유연하게 최저점에 도달
• StepLR
- 가장 기본적인 scheduler
- 고정된 step만큼 learning rate 유지 후 감소
• CosineAnnealingLR
- cosine 함수 형태처럼 learning rate 급격히 변경
- 급격한 움직임 통해 다양한 변화를 줄 수 있다.
- local minimum 탈출에 효과적
• ReduceLROnPlateau
- 일반적으로 많이 쓰이는 scheduler
- 더 이상 성능 향상이 없을 때 learning rate 감소하여 안정적인 학습에 효과적
1.3. Metirc
• 학습 결과에 대한 객관적인 지표
• task에 따라 다양한 metric
• classification
- class가 unbalance한 경우 다양한 metric 적용
- accuracy, F1-score, precision, recall, ROC & AUC, ...
• Regression
- MAE, MSE, ...
• Ranking
- 순서가 중요한 경우 ranking metric 사용
- e.g. 추천시스템
- MRR, NDCG, MAP
• confusion matrix
- accuracy가 성능을 대표할 수 없다.
- data 분포가 unbalance한 경우 class마다 accuracy 차이가 있다.
• 풀고자 하는 문제의 성격, data의 분포에 따라 적절한 metric 선택
- class 별로 balance가 적절히 분포 : accuracy
- class 별로 balance가 좋지 않아 클래스 별로 성능 확인 : F1-score
2. Process
2.1. Training
• training & inference : input으로부터 output 만들어내는 과정
• model.train()
- 학습 전 반드시 사용해야 한다.
- model을 trainable하게 바꿔준다.
- parameter를 train할 수 있게 mode 변경
- train mode와 eval mode에 따라 dropout, batchnorm이 다르게 작동
• epoch : 전체 데이터 1회 학습
• dataloader : batch 단위로 data generate
• optimizer.zero_grad()
- optimizer 정의 시 model의 parameter를 input으로 받아 control할 수 있다.
- parameter의 grad를 초기화 한다.
- grad : parameter의 멤버
- e.g. training example
· batch #1 : parameter는 grad 가지고 있지 않고 loss가 grad 가지고 있다.
· batch #2 : 각 parameter의 grad에 값이 존재하는 상태
· parameter가 가진 batch #1의 grad를 그대로 사용할 것인가? 아니면 batch #2의 학습 결과만 사용할 것인가?
· 일반적으로는 mini batch에서 발생한 grad만 가지고 update
· 각 parameter가 가진 grad 초기화 필요 -> optimizer.zero_grad()
- parameter의 grad를 초기화하지 않으면 grad 중첩
• loss = criterion(outputs, labels)
- outputs의 tensor로 loss계산
- loss function도 nn.Module 상속 -> forward 함수 존재
- model의 module들의 forward 함수와 loss function의 forward함수를 통해 loss부터 input까지 연결되어 backward 가능
- loss control로 전체적인 parameter control 가능
• loss.backward()
- loss의 grad_fn에서 연결점 발생 -> model의 parameter 연결
- loss가 backward 실행하면 grad_fn을 찾고, grad_fn 안의 next_funtions를 찾아 실행하는 과정 반복 -> loss 1회 실행만으로 연결된 모든 parameter의 grad update 가능
- backwrad 실행 후 각 parameter의 grad 변경되지만 data(tensor)는 update 되지 않음
- 결국 loss의 역할은 grad 업데이트
• optimizer.step()
- update된 grad를 parameter에 적용하는 것은 optimizer
- optimizer는 model의 parameter를 가지고 있어서 parameter control 가능
- step 실행으로 update된 grad를 parameter에 적용
• Gradient Accumulation
- mini batch에서 data의 분포를 다 담지 못하는 경우에는 큰 batch 학습 필요
- gpu memory 등 resource가 한정적이거나 batch size가 중요한 task에서 사용
- batch size 늘리는 것과 비슷한 효과
- n회마다 optimizer가 step 실행하여 loss 중첩
2.2. Inference
• model.eval()
- evaluation mode로 변경
- inference 작업 전 실행
- model.train(False)와 동일
• with torch.no_grad()
- evaluation(inference)는 검증, 테스트 과정이므로 parameter update되면 문제 발생 가능
- no_grad는 inference위한 함수
- with wrapper 안에서는 enable한 grad를 모두 False로 변경하여 forward 과정에서 gradient 발생하더라도 parameter update되지 않도록 설정
• validation
- inference에 validation set 사용
- validation set은 fitting되지 않은 data
- 일반화된 parameter 찾기 위해 사용
• checkpoint
- model 저장
- validation 결과 높은 model 저장
• Submission
- test set으로 output 생성
- model 성능 확인 가능
2.3. Appendix
• PyTorch Lightning
- 현업에서는 생산성 중요
- training process를 간략하게 하나의 class로 요약
- trainer가 fit으로 학습
- pytorch lightning 사용 전 pytorch로 공부하며 process 정확히 이해 필요
3. 대회 진행
• EDA
- 나이 별 비율
이전 EDA에서는 성별, 나이만 비율을 대충 보았고, 이번에는 나이만 가지고 비율을 정확히 나타내 보았는데 생각보다 60대 이상의 데이터가 많이 부족한 것을 알 수 있다. 전체 data의 약 7%에서 성별과 마스크에 따라 다시 6개의 class로 나눠질 것을 고려하면 data가 매우 적다고 볼 수 있다. 60대 이상의 data를 더 보충하거나 전체 연령의 data를 고르게 사용하기 위해 train dataset의 크기를 줄이는 방법을 고민해야할 것 같다.
- class 분포
class의 분포가 매우 불균형한 것을 확실하게 알 수 있다. data가 가장 적은 class는 83개 밖에 없고 특정 class에 대다수의 data가 몰려있는 것을 볼 수 있다. 전체 class를 고르게 학습할 수 있는 전략이 필요해 보인다.
- class별 count sort
class 별로 data 수가 적은 순서대로 feature를 나열한 것이다. age는 나이 구간 안에 존재하는 값들 중 하나를 선택해서 나타내었다. 예상대로 60대 이상 data가 가장 적은 축에 모두 속해있고, 성비에 따라 남성의 data가 여성보다 적은 것을 알 수 있다. mask feature의 경우도 각 사람마다 wear, incorrect, not wear 값이 불균형하기 때문에 data 불균형이 분포에 영향을 주었다.
• model
- pretrained model 사용 : EfficientNet b0
• Trainer class
- Tansforms 미적용
- Loss function : Cross Entropy
- Optimizer : Adam
- epoch, batch size, learning rate 등 hyperparameter 조정하며 accuracy, loss 측정 실험
- epoch 5 이하에서는 학습이 거의 안되는 것 같다.
- learning rate 0.001에서 0.005로 높여도 학습이 잘 안되는 것 같다.
- test 제출 결과 accuracy 3.8%, f1 score 0.018 : 학습이 거의 안되었다.
- 학습 결과 loss가 1 이상, accuracy가 60~70%로 나오는데 뭐가 잘못 된건지 모르겠다.
4. 피어세션
https://bagineer.notion.site/level1-22-Day-18-08-26-4ff20f96fa714f87a732fd9533f2e96f
5. 마스터 클래스
• Competition을 잘하는 것은 문제해결의 기댓값이 높다는 것
• 많은 실험을 통해 시행착오와 경험을 겪고 문제를 해결하는 것이 중요
• Competition = compete + share
• 문제를 먼저 이해하는 것이 필수
• Competition은 스스로 돌아볼 수 있는 시간이고, 어떤 것을 배웠는지가 더 중요하다.
• Baseline 코드 보면서 하나하나 해보며 어떤 부분에서 부족한지 깨닫고 확장할 수 있는 기반 다지기
• 추천 시스템도 아이템들 간 관계에 대한 아이디어가 필요하다.
• 현업에서의 CV (번개장터)
- 사기범 색출 위해 채팅 모니터링하여 이미지에서 텍스트 검출
- 다른 플랫폼으로 이동하려는 시도가 보이면 계정 block
- 이미지 검수 후 다른 플랫폼과 아이디에 대한 텍스트를 검출하면 사기 징후로 간주
- 추천 시스템에서 item 성격 정의에 이미지 분석하여 clustering
• 실력을 가장 빨리 끌어올릴 수 있는 방법은 자기 실력을 인정하는 것이다.
• baseline을 잘 만드는 것이 중요
• 신입역량 (스타트업 기준)
- 회사마다 중요하게 생각하는 fit에 맞추기
- 가장 중요한 것은 문제를 파악할 줄 아는 일머리
• 이력서
- 이력서 : 요약서 1, 관련 링크 1
- 관련 포트폴리오 바로 확인 가능
- 요약서 : 어떤 문제를 어떤 실험을 통해 어떻게 해결했고, 어떤 결과를 냈는지?
이번 주는 정말 힘들다.
모르는 부분을 공부하면서 기초를 닦아야 할지 팀원들 쫓아가면서 대회에 더 집중해야 할지 모르겠다.
이번 주까지는 개인적으로 진도에 맞춰 공부하면서 개인 제출로 확인해보고 싶었는데 일정이 당겨져서 빨리 팀을 합치게 되어 기회가 사라졌다.
공부가 힘든 것보다 머리가 복잡해서 더 힘든 주인 것 같다.
'BoostCamp' 카테고리의 다른 글
2021.08.30 - [Week 5] Day 1. 대회 2주차 시작 (0) | 2021.08.31 |
---|---|
2021.08.27 - [Week 4] Day 5. 대회 1주차 마무리 (0) | 2021.08.27 |
2021.08.25 - [Week 4] Day 3. 대회 진행 중 (2) (0) | 2021.08.27 |
2021.08.24 - [Week 4] Day 2. 대회 진행 중 (0) | 2021.08.25 |
2021.08.23 - [Week 4] Day 1. 대회 시작 (0) | 2021.08.23 |