728x90
반응형
[팀 회고 요약]
프로젝트 주제 : DKT
DKT는 딥러닝 방법론으로, 학생의 지식상태를 추적하는데 사용된다. 다만 이번 프로젝트에서는 학생 개개인의 지식상태를 예측하기 보다는, 아직 풀지 않은(Unseen) 문제에 대한 정오답을 예측하는 것을 목표로 한다. Iscream 데이터셋을 이용하여 각 학생의 푼 문제 목록과 정답 여부를 통해 최종 문제에 대한 정답 확률을 예측한다.
팀 목표
- 새로운 베이스라인 작성 : 제공된 베이스라인을 참고하여 우리 팀만의 자체적인 베이스라인 구축
- 스프린트 방식 도입 : 전반적인 계획 수립을 통한 체계적인 진행을 위해 스프린트 방식 도입
- 적극적인 Github 도입 : 이전보다 적극적인 issue 사용 및 PR을 통한 코드 리뷰 활성화
- 다양한 Tool 사용 : Pytorch Lightning, hydra, github action 등과 같은 다양한 tool 경험
프로젝트 협업 문화
노션을 사용한 효율적인 협업
- 고민 해결 일지: 고민 해결 일지에 프로젝트 관련하여 필요하다고 생각하는 것을 공유하고 해결하는 과정을 문서화하였음
- 칸반 보드: 노션에 Jira를 토대로 애자일 방법론을 적용하여 칸반보드를 제작해 협업을 수행하였음
- 스프린트 단위 자체 팀 회고 진행: 스프린트 단위로 자체 팀 회고를 진행하여 매주 목표와 각 작업들의 완료 여부 및 계획 공유
적극적인 Git 활용
- Git Convention: commit 메시지, github flow 전략 도입
- Pre-commit 활용: black 포매터를 이용해 코드 스타일 통일
- Github issue 활용: 작업할 목록을 issue에 정리
- Github Action을 이용한 자동 테스트: pytest를 이용한 모델 러닝 테스트
프로젝트 수행 과정
1. 탐색적 데이터 분석 (EDA)
- 풀이시간, Question Number, Test Type을 중심으로 EDA 처리
2. Feature Engineering
- FE를 통해 약 30개의 파생변수를 생성함
- EDA를 통해 train 과 test 데이터에서 공통적으로 발견되는 데이터의 특성을 파악하고 파생변수로 생성함
- 여러 DKT논문에서 사용되는 feature들을 본 대회 데이터와 각 approach에 적합한 방식으로 재구성함
3-1. Approach : Tabulr
- 주어진 데이터를 정형 데이터로 취급하여 LightGBM과 같은 일반적인 지도학습 모델을 통해 예측하는 방식
- 30개 파생변수가 추가된 데이터를 LightGBM, CatBoost, XGBoost에 학습시키고 성능을 평가함
3-2. Approach : Sequential
- Sequential Approach를 위해 LSTM, LSTMATTN, GRUATTN, BERT, GPT2, LQTR, SAINT+ 사용
- 그 중 SAINT는 아래의 항목을 변형 및 도입하였음
- 입력 임베딩: Elapsed Time과 Lag Time을 Solving Time(0~300s)로 구현, Test Id, Test Type추가
- Data Augmentation: sliding window 방식으로 하나의 sequence에서 여러 개로 증강
- Parameter Customization: encoder layer, decoder layer 수를 2, head개수를 2로 수정
- T-fixup: 모델의 깊이에 따라 parameter를 scaling하는 가중치 초기화 방법 도입
3-3. Approach : Graph
- LightGCN 모델과 userID, AssessmentID 변수를 사용하여 모델링 및 처리
- layer의 범위는 작을 수록 AUC가 높았으며, epoch는 900회가 넘었을 때 수렴
4. 학습 방법 및 평가지표와 앙상블
- Holdout: train_data.csv 전체를 7:3 비율로 나누어 학습 및 검즈엥 사용
- K-fold CV: 전체 데이터셋을 5개의 폴드로 나누어 각 valid_auc를 얻어내어 평균값인 cv_score을 계산
5. 앙상블 전략 수립
- 각 모델에 따라서 정답을 예측하는 방법 및 추이, 잘 예측하는 경우가 다를 것이라고 가정
- 각 모델이 예측한 값과 정답 값의 분포 추이를 비교
- 서로 다른 예측 분포를 가진 모델들을 다양한 기법으로 앙상블하여 상호 보완하는 효과를 내는 것을 기대
6. 최종 솔루션 모델
Simple Weighted Ensemble | Stacking Ensemble |
- SAINT+ (0.8) - LightGCN (0.2) |
- 1st SAINT+ - 2nd SAINT+ - LightGCN - LightGBM - LSTMATTN - LSTM |
프로젝트 코드 및 랩업 리포트 저장소
https://github.com/boostcampaitech5/level2_dkt-recsys-03
[개인 회고]
⭐ 나의 학습 목표 ⭐
1. 최소한 3~5가지의 기능 구현 하기
2. 매일/주간 개인회고 작성하기
3. 논문 리뷰로 배운 것 혹은 알게 된 것을 프로젝트에 적용하기
4. 비즈니스 모델 책 Level2 기간 내에 다 읽기
1. 내 학습목표를 달성하기 위해 한 노력
- 개인 학습 목표를 매일 작성하는 데일리 리포트에 등장하게 함으로써 목표를 매번 되새길 수 있도록 하였다. 그리고 무엇보다 첫 번째 학습 목표를 꼭 달성하기 위해서 가장 노력을 많이 하였다!
- 난관에 봉착하여 포기하고 싶거나 막막한 부분이 있다면 팀원들에게 '함께 자라기' 요청을 하여 문제를 해결하였다! 예전같은 습관이었다면 해결할 때 까지 혼자 머리를 싸매고 끙끙 앓고 있었을 텐데, 이제는 좋은 동료에게 잘 물어보는 것도 좋은 능력이라는 것을 알기에 좀더 자주 물어보고 문제를 공유하게 되었다!
- 테크 블로그의 글 보다는 공식 문서나 공식 깃헙의 코드, PR, issue, 다른 사람의 코드를 위주로 참고하는 습관을 들였다. 대부분 테크 블로그보다 공식 문서가 각 함수나 인자에 대해서 더 자세히 설명해준다! 만약 그렇게 느끼지 못했다면, 그 이유는 그 문서와 코드를 더 자세히 뜯어보지 않아서이기 때문인 것 같다. 따라서 공식 자료들을 더 적극적으로 활용하는 습관을 들였다.
- 그 결과, Pytorch Lightning을 이용한 Sequential approach baseline 구축, Hydra를 이용한 config 관리, sweep을 이용한 편리한 실험환경 구축, k-fold cv 학습 방법 구축, 3가지 방법의 ensemble을 구축하였다.
2. 내가 성능 향상을 위해 한 노력
- 데이터 크기에 맞는 모델 추가: Data Augmentation을 하기 전까지 데이터를 유저 단위로 묶기 때문에 약 6~7000개 내외로 딥러닝 학습에 이용하기에는 매우 적은 수를 보였다. 따라서 베이스라인에서 제공되는 LSTM 기반의 모델보다 적은 수의 데이터에서 좀 더 잘 동작할 것이라고 추정되는 GRU 기반의 모델을 추가하였다. 그리고 Data Augmentation 후에는 데이터가 대폭 증가하게 되었는데, 일반적으로 대규모의 Sequential 데이터셋에 대해서 더 큰 규모의 파라미터를 가진 모델이 더 좋은 성능을 보일 것으로 추정하였다. 따라서 더 큰 모델인 GPT2를 추가하였다.
- 하이퍼 파라미터 최적화: Sequential 방법론의 모델들에 대해서 하이퍼파라미터 최적화 과정을 수행하였다. Transformer의 적용 여부 등과 같이 같은 Sequential 계열 내에서도 각 모델의 특징이 크게 달라졌다. 따라서 각 모델이 최대한 좋은 성능을 발휘할 수 있도록 LSTMATTN, GPT2 모델에 대해서 하이퍼파라미터 탐색 및 최적화 과정을 수행하였다.
3. 내가 한 행동의 결과로 달성한 것 및 얻은 깨달음
- 태스크와 데이터를 꼼꼼히 살펴보고 아이디어를 내자: 이번 프로젝트에서는 구현과 실험을 위주로 참여하느라 데이터를 꼼꼼히 살펴보고 이에 대해서 많은 아이디어를 내보지 못했었다. 그래서 딥러닝을 공부하면서 개괄적으로 알고 있던 정보들을 토대로 모델 추가 및 실험들을 해보았는데, 크게 성능을 향상 시키지는 못했다. 하지만 팀원들이 데이터를 꼼꼼히 살펴보고 수행했던 피처 엔지니어링을 통해서는 성능이 꽤 올랐던 것으로 기억한다. 이를 통해 EDA를 통해 뽑아내는 아이디어의 구현이 얼마나 중요한 것인지 알게 되었다.
4. 내가 새롭게 시도한 변화와 효과
- 추상화와 안티패턴 발견: 제법 정말 다양한 기능 구현에 적극적으로 참여하면서 다른 사람들의 코드를 많이 뜯어보게 되었다. 그러다보니 평소에 제대로 쓰지 못하고 개념만 이해한채로 있었던 class도 비교적 이전보다 잘 활용하게 되었고, 내 코드에 내재되어 있었던 안티패턴같은 것들을 발견하고 어떤 방향으로 고치면 좋을 지 알게 되었다.
- Level1 보다 더 적극적인 Git 활용: Level 1 때에도 적극적으로 Git을 활용했다고 생각했지만, 멘토님의 특강을 들으면서 Git을 더 훨씬 활발하게 사용하였다. 각 작업을 issue로 업로드하고, 이를 해결하는 PR을 올리는 재미로 코드를 짰던 것 같다. 꽤나 성취감도 있었고, 각 컨벤션도 잘 도입이 되어서 저장소를 더 풍부하면서도 잘 정돈시킬 수 있었다.
5. 마주한 한계와 아쉬웠던 점
- 너무 많은 오토로깅: 다양한 프레임워크와 라이브러리를 사용하면서 각 프레임워크들이 자동으로 추적해주는 로그 파일들이 정말 많이 생성되었었다. '일단 저장해두면 언젠가 필요할 때 다시 살펴보지 않을까'라고 생각했지만, 로그 파일을 뒤져보는 경우는 거의 없었고 사실상 wandb에 저장된 내용들만 주로 살펴보았다. 그리고 그렇게 불필요하게 많이 쌓인 로깅 파일들은 꽤나 서버 용량을 많이 잡아먹게 되어서 불편했었다.
- 언제나 건강이 문제: 의식하지 못했는데 바르지 않은 자세로 오랫동안 앉아있다보니 허리에 부담이 가서 또 병원 신세를 졌다. level 1 프로젝트때도 건강을 제대로 관리하지 못해서 병원 신세를 졌어서 이번에는 절대 아프지 않겠다고 다짐했었는데 그 각오가 무너진 것이 정말 속상하고 아쉬웠다. 한창 최고의 성능을 뽑아내야 할 프로젝트 막바지에 아프게 되어서 팀원들에게 더욱 미안했다. 정말로 건강관리를 제대로 해야겠다고 다짐했다.
6. 다음 프로젝트에서 시도해볼 것
- EDA 및 피처 엔지니어링: 지난 프로젝트에서는 모델 변경 및 실험, 이번 프로젝트에서는 구현 및 실험 위주로 참여하느라 데이터를 꼼꼼히 살펴보지 못했던 것이 아쉽다. 따라서 다음 프로젝트에서는 EDA와 이를 통한 피처 엔지니어링을 위주로 참여하고, pandas 라이브러리와 더 친해져보고자 한다!
- streamlit으로 분포 시각화 자동화: 이번 프로젝트에서는 각 모델의 예측 분포 결과를 늦게 살펴본 것이 아쉽다. 따라서 초반에 streamlit을 활용하여 바로 모델별 예측 분포를 시각화해볼 수 있도록 하고싶다.
본 포스트는 팀 랩업 리포트를 토대로 작성되었고,
랩업 리포트는 팀원들과 함께 작성하였기 때문에 본 포스트에 리포트의 전체 내용을 담지 않았습니다
728x90
반응형