본문 바로가기

Activity/네이버 부스트캠프 5기 (AI Tech)

[Naver Boostcamp AI Tech 5기] 10~12주차 Level2 Project DKT (Deep Knowledge Tracing)

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: 모델의 깊이에 따라 parameterscaling하는 가중치 초기화 방법 도입

 

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. 앙상블 전략 수립

  1. 각 모델에 따라서 정답을 예측하는 방법 및 추이, 잘 예측하는 경우가 다를 것이라고 가정
  2. 각 모델이 예측한 값과 정답 값의 분포 추이를 비교
  3. 서로 다른 예측 분포를 가진 모델들을 다양한 기법으로 앙상블하여 상호 보완하는 효과를 내는 것을 기대

 

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
반응형