본문 바로가기
회고 🤔/네부캠 AI Tech

[네부캠 AI Tech] 10주차 학습 정리 🤓

by judy@ 2024. 1. 12.

학습 정리 & 배운점

# 240108

학습 정리 및 배운점 📚

3강 정리

- 시퀀스 데이터는 집계, FE하여 일반 정형 데이터처럼 또는 트랜젝션 데이터 그대로 사용할 수 있는데, 전자의 경우 정보의 손실이 불가피함

- Tabular Approach/Sequential Approach 를 통해 시퀀스 모델링이 가능함.

- Tabular Approach 정형 데이터로 가정하고 접근.

- FE

   - 문제를 푼 시점에서 사용자의 적중률
   - 문제 및 시험 별 난이도 (전체 정답수)/(전체 풀이수)
- Train/valid data split: leakage 발생 없이 쪼개려면 시퀀스를 쪼갤 때, 유저 별로 묶어야 제대로 된 평가가 된다. train/test 데이터의 ID 공유 여부를 확인하고, 공유하지 않는다면 유저 기반 스플릿
- Hyperparameter tuning 하기 해야되지만 너무 많은 시간을 투자하면 안되고, Feature importance가 모델의 전부를 보여주는 건 아니긴 하지만 볼 수 있음
- Sequential data: DKT, DSB는 주로 many-to-one!
- LSTM, Transformer는 batch_size, seq_len, input_size 의 입력 형태를 가짐
- LSTM, Transformer에서 continuout 데이터는 임베딩 레이어를 통해 b,s, i, h 의 크기로 바뀌고, i, h를 곱해 하나의 차원으로 변경해줌. 이후 linear transformation을 통해 hidden_size//2 의 크기로 데이터를 줄여주고, layernorm 이후 hidden_size//2 크기의 continuous 데이터와 concat한다.
- 즉, 사용자 단위로 시퀀스를 생성한다.

 

[내가 만든 gbdt baseline]
- default 세팅에서 xgboost, lightgbm, catboost 중 catboost가 가장 높은 성능을 냄

- 아주 간단한 엔지니어링만 하였더니, 카테고리 데이터가 많아서 그럴 것으로 보임

 

# 240109

학습 정리 및 배운점 📚

 

- 지지난주 여행의 여파로 듣지 못한 강의 오전에 수강 (linux, docker)

- 4강. Sequence Data 문제 정의에 맞는 Transformer Architecture 설계 수강: DSB, Riiid!, Predicting Molecular Properties, MoA 데이터 세트가 있었으며, 트랜스포머 구조가 유리했음. 특이했던 점은 분자 결합 정보의 경우 순서가 있기는 하지만 일부 순서가 바뀌어도 동일한 결과가 나와야 하는 특성이 있어 positional encoding을 사용하지 않았던 것. MoA 대회의 경우, 시퀀스 데이터가 아니지만 데이터를 FC를 통해 펼치고 시퀀스와 같이 취급하여 1D-CNN을 적용한 것이 인상깊었음.

# 240110

학습 정리 및 배운점 📚

 

1월 일정 파악 및 학습 계획

# 240111

학습 정리 및 배운점 📚

5강 수강: 트랜스포머, 인풋 표현과 아웃풋 구현 방법

- 버트를 사용하였는데, 사전 학습 때문은 아니고 트랜스포머 인코더 구조를 손쉽게 불러오기 위함
- 트랜스포머 레이어를 몇 개 쌓은 것인지? - 1개 쌓았다! 보통 DKT에서는 1개만 사용한다고 함

 

LSTM, RNN 구현

- RNN은 시퀀스 길어지면 장기 기억력이 안좋아져서, 성능이 떨어져야하는데, 오히려 좋음

- 이 문제는 전체를 기억하는 것보다는 최근 데이터에 대한 정확성이 더 중요해서 성능에 큰 영향이 없지 않을까?

- RNN, CatBoost 앙상블: 두 모델의 출력 분포가 매우 다르고, CatBoost에 가중치를 더 줬을 때 약간 더 좋아짐

# 240112

학습 정리 및 배운점 📚

 

6강 정리: Kaggle Riiid Competition Winner's Solution 탐색

- 중요한 또 다른 특징. multi-head attention의 head 수를 달리하여 앙상블한 것
- ** 마지막 쿼리만 쓰는 것에 대한 논문 참고 자체해석: 마지막 문제(question)에 대한 정답확률을 예측하는 것이므로, 전체 시퀀스에 대해 어텐션을 구할 필요가 없다 + last query 만 사용하면 시간 복잡도는 줄어드는데 성능 차이는 별로 없다. 구한 어텐션을 skip-connection을 통해 모든 시퀀스 value에 다시 더해주는데, 사실은 last query에 대해서만 전달되어야 하는 게 아닌가 싶음. query에 대해 구한 어텐션을 전체 시퀀스에 다시 더해주는 것은 잘 이해가 되지 않음.

 


10주차 총평 🤔

잘한 점

  • GBDT series 학습과 데이터 준비를 from scratch로 하여 제출해본 것
  • LSTM, RNN 모델과 데이터셋, 로더 구현을 from scratch로 구현한 것
  • 지난 번 적용하지 못했던 learning rate scheduler를 넣어 튜닝없이도 어느 정도의 성능을 확보한 것
  • config를 yaml파일로 관리해본 것
  • 강의 듣고나서 항상 뭘배웠는지 정리하고, 되뇌인 뒤, 향후 방향에 참고한 것

못한 점

  • 매일매일 일찍 일어나서 공부하려고 했는데, 3일밖에 일찍 못일어났다 ㅠㅠ
  • 강의 9강까지 들으려고 했는데, 7강까지만 들었(듣고 있)다. 그러니까, 진도가 느리다.

배운점

  • 집계한 데이터, 시퀀스 데이터를 어떻게 모델의 입력으로 처리할 수 있을지 직접 구현해보며, 새로운 데이터가 주어져도 목표하는 형태로 만들어낼 수 있다는 자신감+능력(?)이 생김
  • 아직 구현은 많이 못해보았지만, 트랜잭션 데이터를 다양한 방법으로 엔지니어링하는 방법에 대해 익혔고, 적용하면 성능의 향상이 가능할 듯함

더 해볼 것

  • 다양한 가설 기반의 FE 방식을 적용해보기
  • 데이터 증강
  • 새로운 모델 구조 설계 및 구현해보기
  • 랩업 리포트 형식과 초안 만들기
  • CV 구현하기

 

반응형