-
Lv2. P-Stage 18Daily 2022. 4. 14. 02:39
오늘 처음 시도 한 것은 Recbole-GNN을 잠깐 보다가 Hyperparameter Tuning을 했다.
Recbole에서 Hyperparameter Tuning을 지원한다고 하길래 로스율에 따라서 괜찮은 하이퍼파라미터만 계속 학습을 시키는 방법으로 최적의 하이퍼 파라미터를 찾게 되어 있을 줄 알았는데 구현되어 있는 것은 하이퍼파라미터 튜닝으로 제시된 모든 파라미터 값을 한번씩 돌려보고 값만 비교하는 것으로 구현되어 있었다.
또한 validation이 없으면 작동하지 않아서 원래 계획했던 RecVAE로 Hyperparameter Tuning을 해보니 1시간 반이 넘도록 1개의 파라미터 결과도 나오지 않아서 깔끔하게 접고 그나마 가장 결과가 빨리 나왔던 EASE 모델로 Hyperparameter Tuning을 해서 이번 데이터 셋에서는 reg_weight(lambda)를 500으로 설정했을 때 가장 성능이 좋다는 결론을 도출했다.
지금 우리 팀에서 가장 성능이 좋았던 결과가 EASE 모델을 사용했고 train 데이터를 100%로 사용해서 lambda 값을 250을 주었을 때 인데, recbole에서는 train 100%를 학습할 수 없어서 다른 방법으로 EASE를 구현했던 팀원과 얘기를 해서 학습을 하면 성능을 더 높일 수 있지 않을까 기대해본다.
또한 Rectorch를 구현해보려고 시도했는데 Recbole만 보다가 어떻게 구현해야 할지 감이 오지 않아서 Rectorch로 구현했던 팀원에게 도움을 받아서 CFGAN을 Rectorch로 구현해보려고 시도했다.
CFGAN이 Rectorch에서는 파라미터로 generator와 discriminator를 각각 넣어줘야 하도록 구현되어 있었는데 어떤 데이터를 넣어 주어야 하는지에 대해서 잘 모르겠어서 여러 깃허브를 찾아보다가 정보가 많이 없고 있더라도 user information이 들어간 데이터셋을 넣어 준 것이라 피어세션 시간에 팀원 분들에게 질문을 해서 알아봤는데 http://www.agape.hanyang.ac.kr/cfgan
Implementation of CFGAN - BigDaS Laboratory
Paper: Dong-Kyu Chae, Jin-Soo Kang, Sang-Wook Kim and Jung-Tae Lee*, "CFGAN: A Generic Collaborative Filtering Framework based on Generative Adversarial Networks", In Proc. of ACM Int'l Conf. on Information and Knowledge Management (ACM CIKM 2018), pp. 13
www.agape.hanyang.ac.kr
저자 분들이 참고하라고 올려놓은 파일을 발견해서 user info가 없이도 넣어줄 수 있구나 라는 것을 배웠다.
다만 Rectorch와는 넣어주는 형식이 조금 다른 것 같고, 여기서는 텐서플로로 구현되어 있어서 CFGAN 구현은 포기하고 앙상블로 넘어가기로 했다.
나는 이번에 Sequential model에서 성능이 잘 나왔던 S3Rec, VAE 중 성능이 잘 나왔던 EASE, Neural network 기반 중에서 성능이 잘 나왔던 NCF, 이 3가지 모델의 제출 파일만을 가지고 앙상블을 해 보기로 했다.
ensemble을 위한 파일 30분 동안 for문을 돌려서 조잡하게 구현을 했는데 아이디어는 굉장히 단순하다.
각각 csv 파일을 불러와서 S3Rec에서 먼저 top 3를 뽑는다. 그 후 NCF에서 top 3개, 가장 성능이 좋았던 EASE에서는 4개를 뽑는다. 다만 중복이 있는지 확인해서 중복이 있다면 다음 것을 뽑는다.
그 후 inference에서 한 것 처럼 user id값을 불러와서 데이터 프레임을 만들어주면 완성.
제출 한 결과 아쉽게도 성능은 오르지 않았다...
다음에 해 볼 앙상블은 중복값이 많은 item을 먼저 우선순위로 뽑는 것이다. 이 방법도 3가지 csv 파일로 앙상블 해서는 앞선 결과와 크게 차이가 없지 않을까 싶은데 다른 팀원분들도 다른 방법으로 앙상블을 시도하고 있어서 일단은 해보기로 했다.
오늘 두런두런 시간이 있었다.
여러가지 고민상담(특히 춘곤증, 잘 하고 있는지 불안감, 건강관리)와 Engineering Career Framework, 미리 취업을 원하는 회사에 대해서 알아보기에 대해서 설명해주셨다.
특히 Engineering Career Framework은 우리나라에서는 들은 적이 잘 없을 내용인데, 현재 나의 레벨과 역량이 어떤 단계에 위치해 있는지, 그리고 더 위에 있는 레벨로 올라가려면 어떤 것이 필요한지에 대해서 회사마다 정해놓은 기준 같은 것으로 꼭 그 회사의 사람 뿐만 아니라 관련 직종으로 취업하기 위해 내가 어느정도 레벨까지 올라와 있는지, 무엇을 더 쌓아야 할지 로드맵을 제시해 준다는 점에서 크게 도움이 될 것 같았다.
오늘의 문제...는 아니고 최근에 푼 문제 중 하나인 백준 10942번 팰린드롬? 문제이다
https://www.acmicpc.net/problem/10942
10942번: 팰린드롬?
총 M개의 줄에 걸쳐 홍준이의 질문에 대한 명우의 답을 입력으로 주어진 순서에 따라서 출력한다. 팰린드롬인 경우에는 1, 아닌 경우에는 0을 출력한다.
www.acmicpc.net
팰린드롬 아이디어는 잘 알려져 있지만 input으로 들어오는 질문의 개수가 최대 100만개라서 일반적인 방법으로는 시간초과가 난다.
따라서 DP로 구현을 해야하는데 어떤 방법으로 팰린드롬을 DP로 나타낼 수 있을지 생각하는 것 이 문제의 핵심이다.
아이디어는 2차원 배열을 만들고 0으로 초기화를 해놓은 다음 만약 들어온 질문의 DP[S][E]값이 0이 아니면 바로 결과를 출력, 만약 S와 E가 같다면 1자리니 무조건 팰린드롬, 1 차이라면 S와 E 위치의 값을 비교해서 같으면 팰린드롬, 다르다면 팰린드롬이 아니게 되고, 나머지는 재귀를 이용해서 S+1과 E-1 값으로 점점 줄여나가면서 비교를 해주면 된다.
'Daily' 카테고리의 다른 글
Lv2. P-Stage 17 (0) 2022.04.13 Lv2. P-Stage 16 (0) 2022.04.12 Lv2. P-Stage 15 (0) 2022.04.10 Lv2. P-Stage 14 (0) 2022.04.08 Lv2. P-Stage 13 (0) 2022.04.07