🏃 Mask Image Classification [P Stage Wrap up 개별 리포트]
1. 프로젝트 목표 및 결과
- AI 프로세스를 이해하고 스스로 전체 파이프라인을 구축하면서 이해한다.
- 원활한 커뮤니캐이션을 위하여 팀원들의 아이디어를 추합하고 정리한다.
- 모델의 성능 향상을 위해서 시도해 볼만한 것들을 시도해본다.
결과 : 1등!🏅
2. 목표를 위해 노력한 것들
우선 내용을 쓰기 이전에 본인의 AI 수준에 대해서 이야기하자면, AI 프로젝트는 경험해보았지만 코드를 복사하고 붙여 넣어서 살짝 바꾸기만 하는 정도(?) 였다. 즉, 과제같은 스스로 처음부터 모든 것들을 구축하기에는 어려움이 많았고 파이프라인을 언젠간 전체적으로 이해 및 구현하고자 하는 목표가 있었다.
일주일 동안, 팀원모두 AI 파이프라인을 이해하고자 스스로 공부하는 시간을 가졌다. 나는 아무것도 없는 코드부터 시작했다. 무엇부터 해야할지 몰라서 처음에는 PyTorch Docs에 들어갔다. PyTroch Docs에는 여러가지 Tutorial로 구성되어 있는 자료들이 있었다. 그 중에 Pre-Trained 모델을 사용해보고 싶어서 해당 URL을 기반으로 구축해 나갔다.
(참고 : https://pytorch.org/tutorials/beginner/transfer_learning_tutorial.html)
팀원들과 원활한 의사소통을 위해서 매일 매일 진행했던 내용에 대해서 회의를 거쳤다. 실무에서는 이를 스크럼 데일리 미팅(?)이라고 부르는 것 같은데(실제론 아닐 수도 있다.), 계획했던 시스템의 아키텍쳐와 목적을 달성하기 위해서 빠른 속도로 개발하고 다시 리뷰, 수정을 거치는 미팅인 것 같다. 그런 식으로 우리도 매일 각자의 할당량을 이야기하고 코드도 보여주면서 하루는 EDA, Modeling 등등 진행상황을 공유하고 피드백하는 식으로 진행했다. 이 과정에서 나는 다음날을 대비하기 위해서 해당 도메인을 익히기 위해 스스로 많은 것들을 찾아보면서 진행했던 것 같다.
모델링 향상을 위해서 서로 다양한 아이디어를 내었다. 내가 처음 생각했던 것은 18개의 Class 에 대해서 예측을 진행할때, 데이터 정교화와 적절한 PreTrained모델을 사용한 Custom모델과 하이퍼파라미터 정도라면 충분히 성능을 낼 수 있을 것이라 생각했다. 하지만, 다른 캠퍼분은 여러 모델을 나누고 해당 모델에서 예측한 각각의 분류들을 추합해서 예측해보자고 했다. 나는 확률적으로 한개의 모델에서 잘못 결과가 나온다면 예측도 완벽히 틀리기 때문에 (서로 독립적이기 때문) 리스크가 있을 것 같다고 생각했다. (최종적으로 나누어 모델 예측을 진행했을 때, 성능이 높게 나왔다.)
3. 모델 개선 사항과 배운 것들
스스로 배운 것들
- 모델을 훈련하기 이전에 문제가 무엇인지 여러번 생각하고 어떤 식으로 해결해 나갈지 생각한다.
- 데이터들의 분포를 확인하기 위해서 EDA(탐색적 데이터 분석)을 진행하고 시각화를 통해서 데이터에 분포, 잡음 등이 있는지 판단한다.
- TrainSet과 ValidSet을 적절히 나눈다. Dataset, DataLoader를 거쳐서 여러 Transform을 적용하고 Tensor로 바꾸는 작업이 들어간다. 그래야 모델에 학습이 가능하기 때문이다.
- Model 은 nn.Module을 상속받은 클래스로, getitem, len 등등 기본적인 함수를 구현하고 이를 통해서 train이 가능하다.
- Train 하는 함수에서는 정의한 Loss 함수, Optimizer, Epoch, Batch-Size 등을 고려해서 학습이 진행된다. PyTorch의 강력한 점 중의 하나는 autograd를 지원하기 때문에 Gradient를 직접 계산할 필요는 없다. 그리고 Acc 와 Loss 를 구하고 최종적으로 model의 state_dict를 저장하면서 정보를 저장한 모델(객체)를 생성하게 된다.
팀을 통해 배운 것들
- 예측하고자하는 것에 따라서 모델의 아키텍쳐를 다양하게 구성한다. 꼭 모델을 하나 쓸 필요는 없다는 뜻이다. 다만, 모델을 여러개 썼을 때 실무에서는 그만큼의 메모리, 예측 비용이들기 때문에 고려해야한다.
- Pseudo Labeling을 적용한다. Semi-Learning의 일종인 Pseudo Labeling을 적용하는 것은 테스트 데이터에 라벨링하여 재학습시키는 방법으로 약간의 성능을 더 높힐 수 있다고 한다.(그래프의 선을 더 부드럽게 하는 효과? → 더 일반화를 잘 시킬 것이다.)
- Augmentation을 적용할 때, Random하게 적용하는 방법도 의외로 성능이 높다는 것을 알게 되었다.
4. 스스로 고찰과 아쉬운 점들
아쉬웠던 점이라고 한다면, 팀단위로 협업을 한 것은 아니었다. 아이디어와 내용에 대해서 이야기했고, 소스코드를 직접적으로 나누어 단위 코드를 작성한 것은 아니다. 분명히 현업에서는 모든 것을 구현하지는 않을 것이다.그래서 다음 팀에서는 하나의 Base Code를 토대로 역할을 나누어서 한 작업에 몰두하는 것도 괜찮을 것 같다.
여전히 스스로 부족하다고 느낀다. 뭐 U Stage를 통해서 이론을 한번 경험했고, 정리도 했는데 자꾸 까먹는 부분이 생긴다. 다시 정리했던 내용과 강의를 보면서 복습하는 시간도 가져봐야겠다.
5. 다음 P-Stage에서 도전해볼만한 것들
이번에는 이미지 Classification 주제를 가지고 진행했으나, 내가 선택한 NLP에서 필요한 이론 공부를 열심히 준비하고 이를 구현하는 작업을 진행하겠다. 그리고 여러 오픈소스로 제공하는 모듈들을 적절히 조합하고 사용 이유에 대해서 잘 정리하여 또 다음의 진행을 위하여 준비할 것이다.