(7강) Training & Inference 1
Loss
실질적으로 모델을 학습시키는 역전파는 Loss를 통해 이루어진다. 이 Loss는 Output과 Target을 통해 구성되는데, 이때 Loss Function이 사용된다. 이 Loss Function은 근사하고자하는 목적에 맞는 함수와 동일한 의미를 가지기 때문에, 목적함수라고도 부른다.
Loss Function은 Torch.nn
안에 존재한다. 즉, Loss Function도 다른 구성요소와 마찬가지로 nn.Module
인 것이다. Loss Function도 forward
메서드를 가지며, 이를 통해 Loss가 계산되는 것이다.
loss
객체는 Module을 상속하기 때문에, 다른 Module과 마찬가지로 Chain으로 연결되어 있음. loss.backward()
을 수행하면 연결되어 있던 Chain (grad_fn
)을 타고, Gradient가 전파되는 것이다.
이처럼 Loss Function과 Loss까지 Torch는 Module로 구성해놓았기 때문에, 간편하게 연산을 수행할 수 있는 것이다. 더 나아가서, 내 목적에 맞는 다양한 Loss Function을 정의해서 사용 할 수 있다.
Optimizer
Optimizer는 계산된 Gradient를 통해 Parameter를 조정하는 역할을 한다. Learning Rate는 Gradient를 통해 구해진 방향에 대해서 얼마나 움직일지를 정하는 Hyper Parameter이다. 학습 중에 이 LR에 조작을 하고 싶을 경우에는 LR Scheduler를 사용할 수 있다.
Metric
Metric은 학습에 직접적인 영향을 미치는 개념은 아니다. 하지만, 오히려 Task 전체에 대해 방향성을 제시하는 중요한 지표이다. 각 Task에 적절하고 객관적인 지표를 설정해서, Model을 평가해야 실제로 해당 Model이 유용하다고 생각할 수 있다. 특히 실무에서는 지표를 누군가 정해주는 것이 아니다. 해당 Task에 대한 이해를 바탕으로 올바른 Metric을 지표로 삼는 능력이 필요하다.
(7강) Training & Inference 2
Training Process
PyTorch는 학습에 사용되는 각각의 과정을 Pythonic하게 구성할 수 있다. 각 과정에서 실질적으로 이루어지는 작업이 무엇인지 알아보자.
model.train()
은 Model이 학습하는 상태임을 명시하는 함수이다. Dropout과 Batch Normalization등의 구성요소는 학습시와 추론시 동작하는 방식이 다르기 때문에, 이를 명시해줄 필요가 있다.
optimizer.zero_grad()
는 Parameter의 Grad 값을 초기화 시킨다. Optimizer는 정의될 때, Model의 Parameter를 Input으로 받기 때문에, 이러한 조작이 가능하다.
기본적으로 Parameter는 새로운 Grad 값이 생성될 때, 이전의 값에 누적하도록 설정되어 있다. 이를 활용하는 Grad Accumulation 기법도 있으나, 일반적으로는 각 Batch에서 발생하는 loss만으로 학습을 진행한다.
loss=criterion(output, labels)
는 정해진 Loss Function을 통해 Loss를 계산하는 과정이다. 최종적으로 생성된 Loss는 grad_fn
이라는 Chain을 통해 연결되어 있다.
loss.backward()
수행 시 Chain을 타고, Output을 생성한 모든 Parameter에 Grad 값이 갱신된다.
optimizer.step()
은 실질적으로 Parameter의 값을 변경하는 과정이다. 생성된 Grad 값을 활용해서 Optimizer의 특징대로 Parameter의 값을 갱신한다.
Inference Process
Inference는 학습한 Model의 성능을 검증하거나, 실제로 활용되는 과정이다.
model.eval()
은 학습과정과 마찬가지로, Model의 상태를 명시하는 함수이다. Dropout의 경우, 모든 Parameter가 추론에 사용될 수 있도록 하는 것이다.
with torch.no_grad()
는 Block의 형태로 일련의 과정을 감싼다. 이 Block내에서는 모든 Tensor의 Grad를 비활성화 하도록 한다.
즉, 추론 시에 발생하는 일련의 과정이 Model에 영향을 주지 않도록 하는 것이다.
검증은 Model의 일반화 성능을 확인하는 과정이다. 이 때, Model의 상태를 영속적으로 저장하고 싶은 경우에는 load_state_dict
를 통해서 이를 저장하고 활용할 수 있다.
Pytorch Lightning
Keras의 Code처럼 간편하게 활용할 수 있는 Library이다. PyTorch에 대해 깊은 이해를 가진 이후에 사용하기를 권장한다. 실무에서는 생산성을 위해 활용 되는 경우가 있으니, 이런 Library가 있음을 알고 넘어가면 좋을 것이다.
Reference
Project
오늘의 목표 및 진척상황
- CenterCrop 적용 (Score 향상)
- GrayScale 적용 (Score 하락)
- Age Filtering 적용 (Score 최고 지점 확인)
- Train Data와 Test Data의 분포 확인
직면했던 문제와 학습한 내용
- Center Crop 적용
먼저, Random Crop이 필요한지에 대해서 고민해봤다. Center Crop의 결과를 보니, 충분한 Random성을 갖는 것으로 판단됐다. 다음은, Size의 문제였다. 어느정도 사이즈를 해야 중요한 정보가 누락되지 않을지 고민했고, 얼굴이 꽉 차더라도, 누락되지 않는 크기를 지정했다. Crop한 Image를 Resize하는 것이 좋을지 고민했는데, 세세한 부분을 식별해야 하는 것이 아니기 때문에 적용하지 않았다.
- Gray Scale 실험
굳이 Color가 아니더라도 충분한 데이터가 있으리라 판단하고, Parameter도 줄일 겸 시도해봤다. 결론은 성능이 하락했다. Color에서 오는 정보가 많은 것 같다.
- Age Filtering 적용
60세 이상의 Data가 너무 적어서, 인접한 나이의 Data를 60세로 통합했다. 성능이 매우 좋아졌다. 최고점을 찾기 위해서 여러번 시도했고, 적절한 값을 찾았다.
- Test Data 분포와 비교
Train Data에 유독 적은 Class에 대해서 예측을 수행해서 결과를 보니, Test에서는 해당 Data들이 생각보다 비중이 높았다. Data에 대한 전처리와 증강을 수행해야, 높은 Score를 기대할 수 있을 것 같다.
추가로 진행 할 사항
- LR Scheduler 적용
- CutMix 등 데이터 증강 확인
- 추가적인 Augmentation 도입
- 다른 Optimizer 확인
- 다른 Loss 확인
- 오피스아워 시간에 나온 정보 확인
'네이버 부스트캠프 AI Tech' 카테고리의 다른 글
[P1] Saturday 4 April (0) | 2021.04.11 |
---|---|
[P1] Day 45 (0) | 2021.04.11 |
[P1] Day 43 (0) | 2021.04.11 |
[P1] Day 42 (0) | 2021.03.31 |
[P1] Day 41 (0) | 2021.03.31 |
Uploaded by Notion2Tistory v1.1.0