DKT 프로젝트
내 학습 목표
- 딥러닝 모델 구조 / 구현에 대해 더 익숙해지기
- 노트북 환경에서 벗어나서 프로젝트 템플릿에 더 익숙해지기
- 기존에 시도해보지 않은 다양한 툴을 활용해보기
모델 성능 개선을 위한 시도
- Feature Engineering
- EDA를 통해 주어진 데이터에 대한 다양한 인사이트를 얻은 것을 토대로 Feature Engineering을 진행했습니다. Boosting 계열 ML 모델의 경우 일단 넣어보기 전까지는 모른다고 판단하고, 결과 중심으로 Feature 구성을 진행하였습니다.
- DL 모델은 데이터의 특성에 맞게 Sequential model을 많이 활용하였는데, 최대한 모델 구조를 파악하고 그에 맞는 Feature를 생성하기 위해 노력했습니다. DL 모델의 경우 각 Feature의 영향력이 굉장히 크게 작용하는 것을 확인했고, ML 모델에 비해 간소화하고 효율적으로 Feature를 구성하기 위해 노력했습니다.
- Hyper Parameter Tuning
- LightGBM에서는 optuna 라이브러리를 활용한 Bayesian optimization으로 튜닝을 진행하였습니다. 과적합을 방지하기 위해 Early Stopping을 적절하게 설정하고, n_estimators 등의 Hyper Parameter 범위 조정을 신중하게 진행해서 일반화 성능 향상에 크게 기여하였습니다.
- DL 계열의 Sequential 모델들은 초반에는 수동으로 튜닝을 진행하다가, WandB Sweep을 활용하여서 자동화했습니다. 해당 툴을 처음 활용해보았는데, 생산성 향상에 크게 기여한다는 사실을 느꼈고, 앞으로도 프로젝트에 도움이 된다면 다양한 툴을 거리낌 없이 활용해 보면 좋을 것 같다는 생각을 했습니다.
- 모델 구조 변경 및 결합
- Baseline으로 제공된 sequential 모델들과 Graph 모델의 구조를 파악하고, 원하는 방향으로 구조를 변경, 결합하는 등의 다양한 시도를 했습니다. 기본적으로 sequential 모델들은 범주형 변수만 input으로 받게 설정되어 있었는데, 이를 연속형 변수도 input으로 받아서 concatenate가 가능하게 변경을 진행하면서 모델 구조와 tensor의 matrix 연산을 이해하는 데 도움이 많이 되었습니다.
- Graph 모델로 prediction을 진행할 때 최종적으로 업데이트된 embedding을 sequential 모델에 활용할 수 있도록 모델을 결합했습니다. 큰 모델 두 가지를 이렇게 직접 결합해 본 경험이 처음이라서 큰 흥미를 느꼈고, DL 모델 결합에 대한 유연성 느낄 수 있는 계기가 되었습니다.
- Ensemble 전략 수립
- 대회 후반에는 각 모델의 튜닝이 어느 정도 마무리된 상태였습니다. 그 모델들을 활용해서 ensemble을 진행하기 위해 다양한 관점에서 전략을 수립하려고 노력하였습니다. 각 모델에서 예측된 probabilities의 분포를 겹쳐서 시각화하고, 그 분포의 차이를 기반으로 여러 모델의 특성을 반영하기 위해 다양한 시도를 진행해서 성능 향상에 크게 기여하였습니다.
- Ensemble을 위해 분포를 확인하는 과정에서 같은 모델에 대해 Hyper Parameter에 따른 변화의 양상도 확인할 수 있었고, 다른 모델에 대한 분포의 차이에 따른 모델 특성의 차이도 시각적으로 확인할 수 있는 계기가 되었습니다.
느낀 점
- 모델 간의 특성 차이
- 이번 대회에서는 ML 모델과 DL 모델을 동시에 활용해 보면서 느낀 점이 많았습니다. ML 모델에서는 성능 향상을 위해서 일단 Feature를 많이 생성하고 실험적으로 평가 지표를 확인하는 방식이 효율적이었지만, ML에서 성능 향상을 이끌었던 Feature를 DL 모델에 그대로 집어넣으면 오히려 성능이 하락하는 경험을 많이 했습니다.
- 실제로 여러 대회의 솔루션이나 논문에 나와있듯이 DL 모델에서는 다양한 Feature를 생성하는 것보다 모델 구조를 이해하고 그 구조에 맞게 신중하게 데이터를 Preprocessing을 하는 것이 중요하다는 사실을 성능을 통해 수치적으로 느낄 수 있어서 좋았습니다.
- 모델 구조 변경에 대한 유연성
- 이전까지는 유명한 모델을 그대로 가져와서 최종적으로 prediction 하는 부분만 수정하거나 레이어의 개수 정도만 변경하는 등 굉장히 보수적으로 모델 구조 변경을 진행했었습니다. 이번 대회에서는 좀 더 유연하게 모델 구조를 변경하고, 두 가지 이상의 모델을 결합하는 등의 다양한 방법론을 활용할 수 있다는 사실을 깨달았습니다.
- 예를 들어, LSTM이나 GRU 모델의 단점을 보완하기 위해 Attention 메커니즘을 적용하거나, Graph 계열 모델에서 한번 학습된 임베딩을 Sequential 모델에 활용해서 성능을 개선하는 등 유연한 모델 구조 변경 및 결합을 직접 진행하면서 큰 흥미를 느꼈습니다.
아쉬운 점
- DL 모델 구현
- DL 모델을 PyTorch 등의 프레임워크로 밑바닥부터 구현하지는 못했습니다. 아직은 제한된 시간 안에 성과를 내려면 여러 자료나 base code를 참고해야 된다는 사실이 아쉬웠습니다. 하지만 지난 대회와 비교했을 때 확실히 모델이나 코드의 이해도 면에서 계속 성장하고 있다는 생각이 들어서 지금처럼 조금씩 발전하면 될 것 같다는 확신이 들었습니다.
- 논문 리딩
- 아직 논문 리딩 능력이 부족합니다. 주어진 task에 맞는 모델을 빠르게 서칭하려면 관련 논문들을 빠르게 리딩 해야 하는데, 그러지 못해서 모델 선정에 대한 시야를 넓게 잡지 못했다고 생각합니다.
- 협업 툴 활용
- git, GitHub 등의 협업 툴을 제대로 활용하지 못한 점이 아쉬웠습니다. 조원들이 각자의 모델을 맡아서 진행해서 conflict 같은 오류는 없었지만, 그럼에도 불구하고 학습 측면에서 GitHub의 PR 기능과 같은 code review를 제대로 해보지 못한 것이 아쉽습니다. 다만, 저번 대회 때보다는 WandB 등의 협업 툴은 더 잘 활용했다고 생각해서 조금씩 발전하면 된다고 생각하고 있습니다.
다음 프로젝트에서 시도할 것
- 더 다양한 툴 활용
- 이번에 파이썬의 argparse를 대체할 Hydra를 도입하고 싶었는데, 그러지 못해서 아쉬움이 남았습니다. 해당 툴을 포함해서 프로젝트 생산성 향상에 도움이 된다면 어떤 툴이든지 적극적으로 도입할 것입니다.
- git, GitHub 등의 협업 툴 활용을 더 적극적으로 할 것입니다. 또, black 라이브러리를 활용해서 각자의 코드 포맷을 통일하는 것도 시도할 예정입니다.
- PyTorch lightning 활용
- 이번 대회에서 PyTorch lightning에 대해 처음 알았는데, 굉장히 간편하게 느껴져서 다음 대회에 적극적으로 도입할 생각입니다.
- 직접 PyTorch template 구성하기
- 쉽지 않겠지만 template을 직접 구성해 보는 것도 조금씩 연습할 생각입니다. 대회 기간이 길지 않아서 바로 도입하는 건 쉽지 않겠지만, 조원들과 함께 공부하면서 진행하면 많은 도움이 될 것이라고 생각합니다.