본격적으로 모델 학습을 진행해보자

학습 프로세스에 필요한 요소는 크게 세 가지이다.



영리하게 움직일수록 수렴은 빨라진다.

학습 시에 Learning Rate을 동적으로 조절할 수는 없을까?








optimizer.zero_grad() : 이전 배치에서 각각의 파라미터가 얻은 gradient를 없애줌
-> 그냥 초기값으로 초기화만 하기에는 loss가 대치가 안되고 쌓이게 되므로 zero_grad() 해주는 것이 좋음
-> optimizer가 파라미터를 가지고 있으므로 optimizer에다가 zero_grad()

loss = criterion(outputs, labels)
loss를 마지막으로 chain 생성

loss의 grad_fn chain -> loss.backward()
optimizer.step()








우리가 중간중간 모델의 결과를 저장하고 싶은 경우가 있습니다. 학습되는 중간에 좋은 성능의 모델이 발견이 되었으면 모델을 저장하는 것이 좋은데요. 이러한 체크포인트 저장 과정을 Evaluation에 추가해서 체크포인트 모델이 저장되도록 설계하세요.
모델 평가에 Metric을 올바르게 사용하는 것도 중요합니다. Evaluation 과정에서 모델 학습 결과를 Loss와 Accuracy만 보는것 보다는 다른 Metric도 참고하는 것도 좋습니다. F1-score Metric 을 구현 or 코드를 찾아서 추가하고, 매 에폭마다 결과를 확인할 수 있도록 설계하세요.
Training Process에 어느정도 익숙해지셨다면 Gradient Accumulation을 내 프로젝트에 적용시켜보세요. 적용한다고 반드시 성능이 올라가는 것은 아닐겁니다. 적용을 했다면 전후 성능 비교를 해봐야겠지요?
Optimizer의 스케줄러가 종류에 따라 어떻게 Learning rate를 변경해 가는지, 옵션에 따라 또 어떻게 스케쥴링하게 되는지 확인해보세요. 대표적으로 많이 사용하는 SGD 와 Adam Optimizer를 각각 구현해 보고 비교해 봅시다. 아래 Further Reading에 좋은 예제가 있습니다.
새로운 Loss를 만들어 봅시다. 새로운 Loss를 적용해서 학습에 사용해보겠습니다. (Label smoothing, Focal Loss, F1 Loss 등) 무엇이든지 상관없습니다. 구현 후 학습에 활용해서 비교해보세요!
Optimizer scheduler plot 분석 : https://www.kaggle.com/isbhargav/guide-to-pytorch-learning-rate-scheduling
학습에 진전이 없을 때, 일찍 끝내고 싶을때 등의 경우에 파이토치 프레임워크 위에서 사용할 수 있는 여러 라이브러리들의 코드를 참고하는 것도 좋아요. (Ignite, Catalyst)
캐글에는 다양한 학습 및 추론에 대한 코드가 공유되고 있습니다. 그 코드들을 하나하나 따라가다보면 효율적이고 성능을 높일 수 있는 학습 방법을 발굴할 수도 있어요. 예시로 SE-ResNeXT를 이미지 분류 문제에 학습시키는 코드가 Bengali 대회에 공유되었어요. 링크
Pretrained Model에 대해 최신 기술을 매우 빠르게 업로드하고 간단하게 사용할 수 있게 공유해주는 레포가 있어요. 이를 참고해서 최고의 모델을 통해 문제에 가장 적합한 모델을 학습해보세요. 링크
어떠한 loss 함수를 써야할지 고민이 되신다구요? Label Smoothing, F1 Loss (F1 Score를 목표로 하는 손실함수)와 같이 다양한 손실함수를 찾아보실 수 있어요.