-
Lv2. P-Stage 14Daily 2022. 4. 8. 03:29
오늘 데일리 스크럼 때는 어제 돌렸던 결과를 팀원들과 공유하고, 다른 모델들을 학습해 보며 inference 파일을 만들어 보겠다는 계획을 세웠다.
학습 한 모델을 깃허브에 올려도 되는가에 대한 질문도 했는데, 이후에 부스트캠프에서 같은 대회를 진행하게 될 수도 있고 저작권 문제도 확실하지 않아서 올리지 않고 나머지 파일들만 올리기로 했다.
오늘 학습을 시작한 모델은 ENMF 모델이다. 사실 그 전에 Context-Aware 기반인 AutoInt나 DIN 모델을 학습시켜보려고 시도를 해봤는데, 이미 .item 파일을 만들어 놓았기 때문에 학습을 바로 시킬 수 있지 않을까 기대를 하고 실행을 했는데 에러가 났다.
Context-Aware 기반의 모델들은 이미 만들어놓은 .inter파일과 .item 파일 뿐만 아니라 .user파일도 필요한데 대회에서 사용 중인 data를 확인해보니 item에 대한 정보인 장르, 제목, 작가, 감독에 관한 정보는 있지만 정작 user에 대한 정보는 하나도 없어서 Context-Aware 모델을 사용하는 것은 불가능 할 것 같다는 결론을 내려서 다시 general 기반 모델이며 최신 모델인 ENMF 모델을 사용해서 학습을 시작했다.
학습이 금방 끝날 것이라 기대를 하고 돌렸는데 이미 10시간 넘게 학습이 진행중이다.
ENMF가 어떤 것을 사용해서 학습을 하는건지 논문과 자료를 찾아보고 학습을 하면 좋겠지만 앞으로 학습할 모든 모델을 공부할 시간이 없기도 하고 성능이 좋을 것이라는 보장이 없어서 일단 학습을 시킨 후에 성능이 잘 나오면 찾아보는 방법을 선택했다.
피어세션 시간에는 팀원 두 분이 기쁘게도 Recbole을 같이 공부해보고 싶다고 Recbole을 시작하셔서 모델을 학습시키는 방법이나 데이터 셋을 만드는 부분에 대해서 설명해드렸다.
거의 1주 넘게 dataset과 recbole의 구성, 실행 방법, inference는 어떻게 할 것인가에 대해서 고민하고 찾아보고 필요하면 만들었던 것들을 누군가가 필요로 하고 내가 도와줄 수 있다는 것이 굉장히 뿌듯했다.
이후 다른 팀원 분들이 각자 공부했던 내용을 듣고 최종 프로젝트에 관한 공지가 올라와서 어떤 주제로 최종 프로젝트를 할 것인가에 대해서 고민을 하는 시간을 가졌다.
마침내! inference를 만들었다.
다른 분들이 만든 MultiVAE 주피터 파일로 실행했을 때는 결과는 나왔는데 점수가 학습이 안된 모델 처럼 나와서, 무엇이 어디서 부터 잘 못 된건지 감이 안와서 처음부터 공부를 해야 될 것 같아서 recbole 기반으로 따로 만들어보자는 생각으로 만들었다.
만들고 보니 나온 점수가 안나왔던 이유는 recbole은 token으로 변환을 해서 학습을 하기 때문에 이를 다시 id로 바꾸는 작업이 필요하기 때문인 것 같다.
https://recbole.io/docs/user_guide/usage/case_study.html
Case study — RecBole 0.2.0 documentation
Case study Case study is an in-depth study of the performance of a specific recommendation algorithm, which will analysis the recommendation result of some users. In RecBole, we implemented full_sort_scores() and full_sort_topk() for case study purpose. In
recbole.io
이 홈페이지를 참고해서 training을 하는 csv 파일에서 user id를 뽑고 중복을 제거한 다음 numpy 리스트로 만들어서 파일로 먼저 저장하는 파일을 만들고(csv 파일을 불러오는데 시간이 많이 걸려서 매번 불러오지 않고 user 리스트를 따로 저장할 수 있게 만들었다)
만들어진 파일과 학습된 모델을 불러와서 점수를 기반으로 top k개의 토큰화 된 item_id를 출력하고 이것을 token화를 해제하고, 리스트를 numpy로 변환, userid를 k 개에 맞게 확장한 다음 dataframe 형식으로 바꾼 다음 이를 csv 파일로 만들었다.
만들어진 inference.py 파일. index를 추출하는 파일은 따로 만들어야 한다. 사실 아직 부족한 점이 많이 보이는데 model이나 index파일을 불러오는 과정에서 argparse를 사용하면 더 깔끔하고 사용하기 편해질 것이고 csv파일로 저장하는 부분도 argparse로 사용해서 원하는 위치에 저장 할 수 있게, 그리고 여러개를 만들면 파일이 수정되는 형식이 아니라 숫자가 추가되는 방식으로 구현하면 더 좋을 것 같다.
또한 MacridVAE 값을 제출했는데 제출값이 test에 비해서 완전히 좋지는 않아서 이후에 성능이 잘 나오는 모델의 여러가지 하이퍼 파라미터들을 수정해서 학습을 진행해보려고 한다.
그래서 내일은 다른 모델을 학습함과 더불어서 임시로 만든 inference파일을 수정해서 조금 더 사용성이 좋게 만들어보려고 한다.
또한 Recbole에서 텐서보드를 지원하는 것으로 알고 있는데 이를 사용해서 결과 분석도 같이 진행하려고 한다.
오늘의 문제는 https://www.acmicpc.net/problem/14222
14222번: 배열과 연산
연산을 적용해서 1부터 N까지의 수가 모두 하나씩 있는 배열을 만들 수 있으면 1을, 없으면 0을 출력한다.
www.acmicpc.net
배열과 연산 문제이다.
조금 생각해보면 배열 내에서 첫 번째로 등장하거나 중복되지 않는 숫자는 굳이 숫자를 바꿔 줄 필요가 없다는 것을 알 수 있고 숫자를 빼는 것이 불가능하므로 중복되는 숫자를 더해서 남는 자리가 있다면 그냥 채워주면 되는 그리디 문제라고 볼 수 있다.
따라서 배열의 크기와 같은 test 배열을 하나 만들고, 배열의 숫자를 하나씩 순회하면서 중복되는 숫자들만 남겨서 이를 K와 더해가면서 test에 없었던 숫자와 일치한다면 체크해주는 방법으로 구현했다.
'Daily' 카테고리의 다른 글
Lv2. P-Stage 16 (0) 2022.04.12 Lv2. P-Stage 15 (0) 2022.04.10 Lv2. P-Stage 13 (0) 2022.04.07 Lv2. P-Stage 12 (0) 2022.04.06 Lv2. P-Stage 11 (0) 2022.04.05