(오차)역전파
loss = cost = error
역전파를 통해 loss가 작아지는 방향으로 weight update
nn.modules , loss backward
loss 도 nn.module의 family이기 때문에 forward함수 가지고 있다. module을 상속하는 모델과 연결이 가능하다는 말
loss.backward() 가 실행되면 모델의 파라미터의 grad값이 업데이트 된다.
required_grad=False 인 경우는 업데이트 안함
특별한 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, 0.025]
학습에 직접적으로 사용되지는 않지만 학습이 잘 되었는지 객관적으로 평가할 수 있는 지표가 필요하다.
Classfication
: Accuracy, F1-score, Precision, recall, ROC&AUCRegression
: MAE, MSERanking
: MRR, NDCG, MAP현업에서 일을 할때에는 metric을 결정해주는 사람이 없다. 문제를 보고 어떤 metric을 설정할지 competition을 통해 익히자.
데이터 상태에 따라 적절한 Metric을 선택하는 것이 필요하다.
Class 별로 밸런스가 적절히 분포
: Accuracy
Class 별 밸런스가 좋지 않아서 각 클래스 별로 성능을 잘 낼수 있는지 확인 필요
: F1-score
train 시작전 만든 결과물
model.train()
optimizer.zero_grad()
batch iteration이 돌아가며 이전 iteration에 있는 gradient가 남아있기 때문에 0으로 초기화 시켜줌으로서 현재 batch에 있는 값으로만 update하는데에 사용한다. (default는 이전 grad와 더함)
loss = criterion(outputs, labels)
loss를 마지막으로 chain이 생성되었기 때문에 loss.backward로 연결된 모든 parameter의 grad를 구할 수 있다.
optimizer.step
backward로 구한 gradient를 가지고 parameter를 update 한다. optimizer정의 시 parameter를 인자로 넘겨주고, 해당 parameter를 컨트롤하는 것이다.
gradient accumulation
작은 배치 안에서 데이터의 전체 분포를 다 담지 못하기 때문데 batch size를 크게해야 할 때, 이것과 비슷한 효과를 내는 방법
매 batch iteration마다 optimizer.step을 하는 것이 아니라, n번 마다 하게하는 방법이다.
grad가 중첩된 상태에서 update를 하기 때문에 step하기 전 optimizer.zero_grad()를 하지 않고 parameter update후 초기화를 해준다.
model.eval()
with torch.no_grad()
inference과정에서 모델의 parameter가 update되지 않게 하기 위하여 torch.set_grad_enabled(False)를 해주는 과정.
Validation 확인
추론 과정에 validation set이 들어가게 해서 검증하는 것
check point
loss, acc 등이 이전의 가장 좋은 값보다 좋으면 torch.save로 모델 저장
현업에서 일을 할 때에는 생산성이 중요하다.
지금까지 해왔던 과정을 간단히 fit으로 할 수 있다.
Further Reading
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를 목표로 하는 손실함수)와 같이 다양한 손실함수를 찾아보실 수 있어요.
대회 관련 얘기
다양한 시도를 해보고 싶은데 코드를 짜는 속도가 느리다.
체력도 받쳐주지 않지만,,,, 다음주까지 힘내서 해보고 싶었던 준지도 학습을 꼭 해보겠다.