JUINTINATION

ETRI 2024 동계 연구연수생 - 4주차 본문

ETRI(한국전자통신연구원)

ETRI 2024 동계 연구연수생 - 4주차

DEOKJAE KWON 2024. 1. 28. 14:20
반응형

4주차 후기

처음에는 과제가 너무 막막했지만.. 아직도 너무 막막하다! 지난 3주차 후기에 fastai의 회귀 모델인 Tabular_learner를 사용했다고 했는데 여러 이유로 지금은 다른 시계열 모델로 넘어가는 과정에 있다. 데이터를 계속 분석하다 보니 이 데이터는 협업 필터링 모델과는 맞지 않다는 생각이 계속해서 들고 있고, 동기와 얘기하면서 협업 필터링 모델을 통해 어떤 달에 대해 점수가 가장 높게 예측되는 상품을 추천하면 시계열 모델로 그 상품의 예상 판매량을 뽑는 방향으로 갈 것 같다.

Tabular_learner의 문제점

일단 가장 큰 문제는 cuda를 사용하면 오류가 난다는 것이다. 정확한 원인은 모르겠지만.. 추측하기론 특정 데이터셋에만 오류 없이 모델이 돌아가는 것도 그렇고, 학습 데이터와 테스트 데이터를 기간으로 나눠놨는데 각각의 기간동안 구매한 상품의 종류가 완전히 동일하지 않고 없거나 추가돼서 index가 맞지 않아 생기는 문제가 아닐까 싶다. 아무튼 gpu를 사용할 수 없어 device='cpu' 매개변수를 추가하면 오류 없이 돌아가긴 하지만 속도도 느리고 성능도 매우 떨어진다.

정보처리기사 필기 시험 1차 신청

지난 1월 23일 화요일에 정보처리기사 필기 시험 1차 신청이 있었다. 사실 생각 못하고 있었는데 아침 9시 40분 정도부터 카톡방이 분주했다. 9시 50분 정도부터 부랴부랴 핸드폰으로 접속을 시도했다. 그런데 로그인 대기자가 몇만명이 있는 것이다. 게다가 다 기다리니 로그인이 튕긴다! 세상에 이런 억까도 없다. 아무튼 그렇게 전전긍긍하다가 학교 동기가 어플을 설치해보라고 해서 어플로 재도전해봤다. 이제는 어플 접속도 25%에서 멈추고 접속이 완료돼도 로그인 대기자는 여전히 몇만명이다. 그렇게 로그인에 성공하니 지난번에 사전 접수했던 내역 들어가는 것도 대기자 몇만명.. 결제하러 들어가는 것도 대기자 몇만명.. 아무튼 40분동안 대기만 했던 것 같다. 모든 기사 시험이 이 날 1차 신청이었던 것 같은데 각 기사 시험마다 신청 날짜를 다르게 했다면.. 내 데이터를 하루만에 다 쓰는 일은 없었을텐데

그래도 다행히 3월 3일 일요일에 12시 40분에 내가 원하는 장소에서 시험을 볼 수 있게 되었다.

이날은 저녁에 ETRI에서 석식으로 돌솥비빔밥을 먹었었는데 주문번호가 777로 잭팟도 터졌다. 뭔가 기분 좋아서 지갑에 넣고 다니고 있다.

과제 중간 발표

2주차에 진행했던 방식 그대로 과제 중간 발표를 수요일에 진행했다. 지난 발표 때 받았던 피드백을 어떻게 적용했는지, 결과는 어땠는지, 추가적으로 어떤 연구를 했는지에 대해 발표했다. 일단 상품 추천 알고리즘이기 때문에 train 데이터와 test 데이터를 train_test_split 메서드를 사용해서 나누지 않고 기간 또는 전체 기간의 비율로 나눴고, Collab_learner로 구현한 협업 필터링 모델은 사용자별로 나눈 후에도 User를 사용자로 해놔서 month, week로 바꿔서 테스트해봤으며 Tabular_learner로 회귀 모델을 적용하여 지난 1년 동안의 데이터를 학습하여 다음 1달의 데이터로 테스트하는 로직을 구현하여 발표했다.

결과는 결국 예상했던대로 다른 적합한 모델을 찾아 다른 로직을 구현하거나 협업 필터링 모델에서 박사님이 이번에 올려주신 다른 피처를 적용한 새로운 점수 집계 방식을 고안해봐야겠다는 생각이 들었다.

추천 시스템 라이브러리 비교

이 블로그에 정리가 아주 잘 되어있길래 참고해서 어떤 모델이 괜찮은지 고민해봤다.

 

[Survey] 추천시스템 라이브러리 비교

작성자: 강지우 이번 시간엔 간단하게 추천시스템을 구현할 수 있는 라이브러리들을 비교해보았습니다. 대부분 베이직한 CF의 Neighborhood model, Matrix Factorization model들이 구현되어있습니다. Koren의

velog.io

결국 완벽한 모델이란 것은 없고 데이터에 맞는 모델을 써야한다는 것인데 우리가 보고 있는 이 데이터는 너무 애매했다. 아무튼 고민 끝에 지금은 LightFM 모델을 쓰는 쪽으로 마음이 기울었다. 다른 시계열 모델을 구현하느라 아직 구현은 안 했지만 나중에 구현될 시계열 모델 성능이 안정화되면 구현할 예정이다.

시계열 모델

시계열을 예측하는 데 쓰이는 모델들은 ARIMA, SARIMA, LSTM, ES 등등 다양하다. 그 중 우리는 아래의 모델들을 생각해봤다.

Prophet

Prophet은 페이스북에서 공개한 시계열 예측 라이브러리로 정확도가 높고 빠르며 직관적인 파라미터로 모델 수정이 용이하다는 장점을 갖고 있는 모델이라고 한다. Prophet의 모형은 트렌드(growth), 계절성(seasonality), 휴일(holidays) 3가지의 main components로 이루어져 있으며 계절효과가 강하면서 여러 시즌의 과거 데이터가 있는 경우에 가장 잘 작동한다고 하는데, 트렌드를 파악해야 하는 우리 데이터셋과 잘 맞을 것 같다는 생각이 들었다.

하지만 알아보니 Prophet은 PyTorch를 사용하지 않기 때문에 gpu를 사용할 수 없다고 한다. 그래서 더 찾아보니 PyTorch를 사용하는 Prophet이 있다고 해서 구현해봤다.

Neural Prophet

Neural Prophet은 위에서 설명했듯이 PyTorch를 사용하는 Prophet이다. 처음에 새로운 미니콘다 가상환경을 만들고 이 라이브러리를 설치할 때 버전 의존성 문제가 너무 많이 발생했었다. 일단 python 3.11.0 버전보다 낮아야 했으며 $ conda install 명령어로 어찌저찌 다 설치하면 pytorch 버전이 gpu를 사용할 수 없는 버전으로 다운그레이드된다. $ conda update --all 명령어를 섞어 여러 경우의 수를 다 시도해본 결과 gpu를 사용할 수 있는 모든 환경을 구축한 상태로 Neural Prophet도 설치가 완료됐다.

지난 Collab_learner, Tabular_learner 모델들과 다르게 Neural Prophet은 필수 조건이 좀 있었다. 일단 데이터에는 ds라는 이름의 datetime 열과 정답 열인 y 열, 이렇게 딱 2개만 존재해야 했다. 또한 데이터에 중복된 날짜가 있으면 안되며 다른 열을 추가할 수 없기 때문에 당연히 여러 상품에 대한 학습도 한 번에 할 수 없고 다른 피처의 상관관계를 적용하여 예측할 수도 없다.

어찌저찌 다 구현해서 하나의 상품에 대한 1년치 데이터를 학습하여 다음 1달의 판매량을 예측해보게 했다. 그런데 여기서 $ nvidia-smi 명령어를 실행하여 확인해보니 gpu 사용률이 0%였다. 그래서 더 찾아보니 Neural Prophet은 pytorch를 사용하긴 하지만 아직 gpu로 돌아가는 기능은 구현되지 않았다고 한다. 뒤통수를 쎄게 맞은 듯한 기분과 함께 엄청난 현타를 느끼며 퇴근했던 기억이 있다.

LSTM

다음으로 생각해본 모델은 LSTM이다. 작년 1학기에 들었던 머신러닝및실습(2) 수업에서 구현했던 간단한 LSTM 코드를 가지고 간단한 Single Step 모델을 구현하여 지난 30개의 데이터를 학습하여 다음 1개 데이터의 판매량을 예측하도록 했다. 이 코드는 다행히 $ nvidia-smi 명령어를 실행했을 때 gpu가 정상적으로 사용되는 것을 확인햇다. 그러나 어쨌든 성능이 가장 중요한데 너무 간단하게 예시로만 구현해서 그런가 성능이 너무 처참했다.

모델을 제대로 구현하기 위해 각 layer가 어떻게 구성돼야 하는지에 대한 확실한 개념이 필요해 보이는데 . . 누가 나한테 쪽집개 강의를 해줬으면 좋겠다는 생각이 마구마구 든다.

다른 모델

동기는 박사님이 새로 만들어주신 데이터 피처를 적용하여 데이터 분석 및 전처리를 나름 했던 것 같고 LSTM으로 싱글스탭, 멀티스탭 모델 등 여러 시계열 모델에 대한 성능을 비교할 수 있는 코드를 작성중이었다. 이 블로그에 비슷한 글이 있는데 아무튼 성능을 더 끌어올리기 위해서는 더 공부가 필요할 것 같다는 생각이 들었고 다음주에는 시계열 모델에 사용되는 transformers 모델 구현을 해봐야겠다는 생각과 함께 이번주도 마무리된다.

 

초간단 시계열 예측 모듈 만들기

아 내일 점심 뭐먹지

velog.io


결론

지난 주와 마찬가지로 스퍼트 프로젝트 준비를 하느라 정신없이 지내고 있다. ETRI에서 여러 책을 빌리면서(어쩌다보니 Node.js 책만 4권, 도커 책만 2권 빌렸다.) 각각의 책에 있는 내용들을 비교해가면서 필요한 내용을 적용해보며 어찌저찌 기능을 구현중이다.

다음주까지 힘내서 스퍼트 프로젝트 완성한 이후에 밀린 정처기 준비도 하면서! ETRI 과제도 무사히 끝낼 수 있으면 좋겠다. 공부하자!

728x90
Comments