일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 카카오 파이썬
- 부스트캠프AITech
- 카카오 코딩테스트
- 카카오코테
- 프로그래머스 레벨1
- 부스트캠프
- 코딩테스트
- 도커오류
- 프로그래머스LEVEL1
- 파이썬 카카오코딩테스트
- 도커연결오류
- 프로그래머스
- Cannot connect to the Docker daemon at unix
- 양과늑대
- 프로그래머스 레벨2
- 파이썬 재귀함수
- 네이버 부스트캠프
- 부스트캠프 회고
- 파이썬 프로그래머스
- 라이브러리란?
- 프로그래머스 파이썬
- 부캠
- docker시작하기
- 파이썬
- 프로그래머스 양과늑대
- 프로그래머스 레벨3
- 카카오코딩테스트
- level1
- 프레임워크란?
- 파이썬 양과늑대
- Today
- Total
코린이의 공부일기
[Boost Camp] Week 4 Day 4 P.stage (Training and Inference)+회고 본문
[Boost Camp] Week 4 Day 4 P.stage (Training and Inference)+회고
SOJUNG 2021. 8. 27. 13:17Training and Inference (1)
-Loss,Optimizer, Metric
이전 까지 모델을 구성했다면 이번 포스팅은 훈련 Task을 진행해보자 !
Trainging Process의 종류
1. Loss
-내가 예측한 output값과 target 값 간의 차이를 Cost 함수라고 부르며
줄이도록 목표를 가지고 Backward을 거치며 Cost함수의 Parameter값들을 최적화된 값으로 업데이트한다.
-> 최적화 값을 찾는데에 Loss는 중요한 역할을 가진다.
- Loss도 사실은 nn.Module Family이다.
Loss함수 자체도 Module처럼 Family로 활동할 수 있다.
그래서 Loss도 Forward함수를 가지고 있다.
-loss.backward()
loss= critertion(outputs,labels)
Loss의 필요한 원소들(output, label)로 계산을 진행한다.
각각의 forward가 진행된 체인에서 반대로 backward을 진행하며 loss값의 gradient을 업데이트한다.
loss가 backward을 통해 gradient값이 업데이트가 되고 이전 포스팅 처럼 boolean함수인 requires_grad로
gradient을 계산할지 / 계산하지 않을지 결정할 수 있다.(핸들링 가능)
조금 특별한 Loss도 있을 까?
쉽게 말하면 Error을 만들어내는 과정에 양념을 치는 것
-Focal Loss
Class Imbalance 문제가 있는 경우, 맞춘 확률이 높은 Class는 조금의 loss을 , 맞춘 확률이 낮은 Class는 Loss을 훨씬 높게 부여한다.
-Label Smoothing Loss
Class target label을 onehot 표현으로 사용하기 보다는 ex> [0,1,0,0...]
조금 Soft하게 표현해 일반화 성능을 높이기 위함이다. ex>[0.025,0.9,0.025,0.025 ...]
2.Optimizer
각각의 weight들에게 어떤 학습을 정해주어서 극솟값을 찾도록 해주는 방식 을 Optimizer라고 한다.
LR scheduler
학습횟수에 따라 유연하게 LR을 조절해주며 극솟 값에 도달하도록 해준다.
그렇다면 어떤걸 적용해주면 될까?
바로 Step LR!
- StepLR
Cosine함수 형태로 크게 변경해주며 값이 Local Miminum에 빠져도 빠르게 나올 수 있도록 LR을 조절해준다.
- ReduceLROnPlateau
3.Metric
모델에 학습에 직접적 영향이 미치진 않지만 왜 중요할까?
모델을 학습하고 평가할 때 객관적인 지표로 평가가 됐는지 안됐는지 Metric으로 평가할 수 있다.
그래서 Metric을 통해서 객관적인 점수를 매기기 때문에 정말 중요하다.
-Task에 따라 적용하는 Metric이 다르다.-Ranking은 추천시스템에서 많이 사용하는 방식이다.
이렇게
Metric은 학습하는데에 직접적 역할을 하는 건 아니지만 모델을 선택하고 평가를 하는데에 있어 중요하다.
TIP> 사실, 현업에서는 일을 할 때는 Metric을 결정해주지 않기 때문에 데이터의 상태에 따라 어떤 모델을 선택하고 이러한 지표로 Metric을 선택해야하기 때문에 많은 경험이 필요하다!
그렇다면 Metric을 잘못 선택한다면 어떻게 될까?
정확도는 오른쪽 모델이 더 높지만 Target(0,1)을 골고루 맞출 수 있는 왼쪽모델이 성능면에서 더 나을 수 있다.
그래서 올바른 Metric이 필요하다
데이터 Class 별 밸런스가 좋지 않다면 Accuracy로 충분한 지표가 될 수 없다.
-Competition에서는 metric이 정해져있지만 다른 문제 해결에서는 내가 Metric을 지정해야할 때가 있으니 metric을 보는 눈을 키우는게 중요하다!
Training and Inference (2)
목표 - 학습과 추론 프로세스의 과정을 어떻게 이해할까 ?
한번 파이토치 Framework 에서 학습과정이 어떻게 구성되어있는지 확인 해보자 !
Training 준비
-모델을 trainable 하게 상태를 변경하고 싶다면
Model.train() 함수를 통해서 Train할 때와 Eval할 때의 과정에서 Dropout이나 BatchNorm을 각 각 컨트롤 할 수 있다.
optimizer.zero_grad()을 넣는 이유는?
두 번째 Batch부터 Batch의 Grad가 남아있기 때문에 gradient을 초기화를 해주고 학습을 해준다.
Critertion은 Modules을 가지고 있으므로 forward함수를 가질 수 있다.
결국 input부터 시작한 모델의 forward함수와 critertion loss함수가 합쳐질수 있고 하나의 체인이 생성될 수 있다.
Loss로 전체의 parameter들을 업데이트할 수 있음을 알 수 있다.
input을 넣고 forward함수를 돌렸을 때 각각의 연결되어있는 모듈에서 gradient function에서 backward가 되어있는 트리구조를 확인할 수 있다.
optimizer_step() 은 optimizer가 input으로 받은 알고리즘을 가지고 gradient을 업데이트한다.
+Gradient Accumulation
지금까지 배운 Training process을 응용해보자
loss값을 중첩은 시켜주돼 optimizer step을 iteration마다 하지않고 중간중간 지정된 부분에만 해주며 GPU의 메모리를 고려하며 훈련을 진행시킬 수 있다.
-> 이러한 응용과정을 생각하고 적용하기 위해선 training process의 이해는 필수이다.
Inference Processing
내 모델을 검증하는 Evaluation 을 만들어 보자!
torch.no_grad는 평가를 위해 안에 모든 Gradient Tensor을 False로 변경해준다->Gradient업데이트를 하지 못하도록 한다.
->torch.set_grad_enabled(False)
Validation 확인
위에 함수를 통해 Validation set 이나 Test set 모델을 예측해볼 수 있다.
Checkpoint 저장하기
torch.save을 통해서 파라미터들을 저장하여 비교해볼 수 있다.
최종 Output, Submission 형태로 변환
Appendix: Pytorch Lightning
현업에서 적용할 때는 생산성이 정말 중요하기 때문에 training processing나 inference processing이 오래리기 때문에 간략하게 정의되어서 나온 것
pytorch lightning은 하나의 class 안에서 모두 정의 되어 빠르게 사용할 수 있다.
하지만. 충분한 이해가 바탕이 되지 않은 상태에서는 오히려 독이 될 수 있다.
꼭 Process에 대한 이해가 충분할 때 사용하기 !
2021-08-26 회고 +Competition
오늘은 드디어 어제 약속한 트레이닝을 진행해보았다!
처음 진행한거였는데 Test Data 기준 정확도가 72 % 정도 나와서 기분이 좋았다!
그 다음에 epoch수를 약간 늘리고 epoch이 늘어날 때마다 LR을 줄이도록 했는데 75 까지 올랐다 !ㅎㅎ
나는 epoch이 늘어날 때 마다 LR을 줄이도록 내가 직접 코드에 짰는데 이게바로 Scheduler 였다..
이런 좋은 함수가 있는줄도 모르고 ㅜㅜ 만약 Scheduler로 추가해서 진행했다면 좀 더 높은 정확도를 낼 수 있었을 것 같기도하다 !: )
역시 여러 함수들을 적용해보며 익히는게 중요한 것 같다.
사실 모델링하면서 오류가 하나고치면 하나 또 나오고 이래서 산넘어산 느낌이었는데
역시 누군가와 함께 공부하니 물어볼 수도 있고 너무 좋은 것 같다.!
옛날 혼자 공부했을 땐 막히면 혼자 그냥 시간은 계속가고 해결된 건 없고 이래서 굉장히 스트레스 받았는데
역시 개인은 팀을 이길 수 없다라는 말이 여기서 나온 것 같다 : )
아 그리고 오늘 강의에서 사실 Train process을 좀 더 보고 실행해봐야 확실히 이해할 것 같은 느낌이 들었다.
마스터분께서도 Train process의 이해가 정말 중요하다고 하셨으니 꼭꼭 이해해보고 line by line구현도 해보자!!!
그리고 metric부분도 이전엔 단순히 회귀에는 어떤 것을 쓰고 이미지에선 어떤 걸 쓰고 너무 단순하게 생각했었는데
여러 도메인에서 어떤걸 쓰는지 보는 눈도 키우는게 중요한 것같다!
그리고 내일부턴 팀으로 Competition이 진행되는데 절대 민폐끼치지 않고 같이 협업할 수 있도록 EDA나 Process과정에 최적화된 방법을 찾아보고 구상해보며 내가 짠 코드에 적용해봐야겠다 !
사실 요 몇일 동안baseline코드들이 제공되었는데 내 힘으로 코드를 짜본다고 제대로 보지않아서 이번 주말에는 baseline코드들을 보며 내가 적용하지 않은 부분을 적용해보며 실험해봐야겠다 :- )
내일도 화이팅!!!
2021-08-27 할 일
* 제발 강의 좀 빨리 듣기 !
* Baseline코드를 보며 내 코드에 적용시켜보기
*다음 주 Team Competition 진행방식 생각해보기
'BOOST CAMP_정리' 카테고리의 다른 글
Week 5 - Day 1,2 Team Competition (0) | 2021.09.01 |
---|---|
[Boost Camp]Week 4 Day 5 P.stage(Ensemble)+회고 (0) | 2021.08.28 |
[Boost Camp] P.stage (Model) (0) | 2021.08.26 |
[Boost Camp] Week 4 Day 2. P.stage( Dataset ) (0) | 2021.08.24 |
[Boost Camp] WEEK 4 Day 1. P stage(EDA) (0) | 2021.08.23 |