코린이의 공부일기

[Boost Camp] Week 4 Day 4 P.stage (Training and Inference)+회고 본문

BOOST CAMP_정리

[Boost Camp] Week 4 Day 4 P.stage (Training and Inference)+회고

SOJUNG 2021. 8. 27. 13:17

Training 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 진행방식 생각해보기

 

Comments