대회 개요
기간: 2022.11.07 ~ 2022.12.02
LG U+에서 주최하고 Upstage에서 주관한 추천시스템 AI 경진대회로써 유아-아동 전용 미디어 서비스 '아이들나라'를 기반으로, 캐릭터부터 교육용 콘텐츠까지 포함한 다양한 콘텐츠를 제공하며 AI Task 및 실제 사용자 데이터를 활용하여 새로운 추천 아이디어 및 프로필별 맞춤형 콘텐츠 추천 AI 모델을 개발하는 대회다.
이번엔 아이의 프로필 정보, 부모의 관심사 정보, 시청 이력 및 메타 데이터 등을 고려하여, 아이들에게 좋아할 만한 콘텐츠 뿐만 아니라 부모가 보여주고 싶은 콘텐츠까지 추천하는 AI 모델을 제안하며 다양한 추천시스템 모델링을 시도할 수 있는 기회가 생겨 참여하게 되었다.

평가지표
순위를 매기기 위한 평가지표로는 Recall@K와 NDCG@K가 사용되었다.
K: 고려할 상위 아이템의 개수를 의미하며 이 대회에서는 K를 25로 통일
Recall@K: 추천 시스템에서 K에 대한 Recall은 사용자에게 추천된 아이템 중 해당 사용자에게 관련성이 있는 아이템의 비율을 나타내며 전체 점수 중 75%의 비중을 차지
NDCG@K: 추천 시스템에서 K에 대한 NDCG는 추천된 아이템들의 관련성과 랭킹을 고려하여 랭킹 알고리즘의 효과를 측정하는 지표로 전체 점수 중 25%의 비중을 차지
score = 평균 Recall@K * 0.75 + 평균 NDCG@K * 0.25 (K = 25)
데이터 전처리
ERD
시청, 구매 이력, 프로필 정보 등 다양한 데이터가 총 7개의 csv파일로 구성된 데이터로 학습을 한 후 사용자가 이후에 시청할 콘텐츠를 추천하는 것이 최종 목표였다. 데이터가 7개의 파일로 나뉘어져 있어서 ERD를 통해 파일의 연결성을 확인 후, 각 파일의 primary key들을 찾고, 연결된 파일들을 확인하여 데이터가 세션마다 적재되는 흐름을 확인하였다. 주어진 파일 중 병합해도 데이터의 원본성을 망가뜨리지 않으며 비슷한 속성을 가진 파일들은 병합을 진행하였다. 예시로 콘텐츠 파일은 세션, 시청 정보, 구매 이력 등이 포함되어 있지 않기에 병합해도 문제가 없다고 판단하여 진행했다.
병합을 완료한 후에 각 파일들을 살펴보고 EDA를 진행하였다. 각 파일들이 서로 다른 속성 (성별, 구매 이력, 시청 시간, 등)을 가지고 있기에 파일별로 EDA를 진행하며 전처리를 아래와 같이 진행해보았다:
결측치가 과반수 이상인 컬럼들은 제거
결측치가 어느정도 있고 피처들이 다른 피처들보다 관련성이 적어보이는 컬럼 제거
결측치가 존재하지만 필요한 피처들의 결측치 보완
컬럼들 중 세분화가 된 속성들의 존재 확인 후 제거
예시: 캐릭터 1~7, 콘텐츠를 추천함에 있어 주인공 이외 캐릭터는 데이터에 포함될 필요가 없다는 결론을 내려 제거)
시간 데이터가 문자열 데이터로 적재되어 잘못 저장되는 경우가 있는 데이터 수정 및 데이터를 시간 데이터 타입으로 변환
예시: 초는 60초까지만 있지만 파일을 확인해보니 0093으로 적재된 경우 0133으로 수정)
범주형 데이터는 정수 데이터로 변환
예시: N/Y → 0/1)
중복 데이터 제거
Negative Sampling
Negative Sampling
Random Negative Sampling (RNS)
Popularity-biased Negative Sampling (PNS)

일반적으로 negative sampling은 각 사용자가 안좋아하는 아이템들의 집합을 뜻한다. 다만 추천시스템은 사용자들의 직접적인 실시간 피드백 대신 implicit 피드백을 가지고 추천해야 하기때문에, 좋아하지 않는 아이템 대신 접하지 않은 아이템들을 다 negative samples로 두고 추천을 한다. 이 대회에서는 아이템이 콘텐츠이며, 이진분류를 통해 사용자가 시청한 이력이 있는 콘텐츠는 1 (pos) 그리고 시청한 적이 없는 콘텐츠는 0 (neg)로 데이터를 반환했다.
다양한 negative sampling 기법이 존재하지만 heuristic negative sampling 알고리즘 중 가장 기본이 되는 random negative sampling (RNS)으로 먼저 진행하였다. 전체 시청 이력이 있는 콘텐츠와 시청 안 한 일부 콘텐츠 중 랜덤으로 시청 안 한 콘텐츠를 뽑아 RNS를 정해놓은 비율에 맞게 생성했다. 처음에는 pos와 neg의 비율을 1:100으로 맞춰놓고 진행해봤고 결과는 0.2143이 나왔다. 사용된 모델의 성능 향상을 위해 NCF 논문에서 저자들이 사용한 negative sampling비율 (3~7)을 참고하여 사용해봤지만 처음보다 결과가 더 안좋은 0.2003, 0.1950으로 나와서 다른 heuristic negative sampling기법 중 하나인 popularity-biased negative sampling (PNS)을 시도해 보기로 하였다.
PNS는 아이템에 순위를 매겨 순위대로 가중치를 추가한 후 샘플링에 참고하는 알고리즘이다. RNS는 콘텐츠들이 샘플링 될 확률 (시청 안한 콘텐츠들이 뽑힐 확률)을 동일하게 두는 반면, PNS는 콘텐츠마다 다른 확률을 두고 샘플링을 하는 것에 차이가 있다. 예를 들어 가장 많이 시청된 콘텐츠 (뽀로로)는 가장 높은 확률을 가져 뽑힐 확률이 제일 높고, 거의 아무도 시청한 적이 없는 콘텐츠 (유럽 유아 프로그램)은 가장 낮은 확률을 가져 뽑힐 확률이 제일 낮다고 보면 된다. 유명한 콘텐츠에 가중치를 더 두어 샘플링을 하기에 PNS를 통해 모델의 성능 향상을 기대했었지만, 0.1901과 0.1898로 RNS보다 오히려 더 낮은 성능을 보이는 것을 알수가 있었다. 원인 중 하나는 전체 데이터 기반에서 아이템의 순위를 매기기 때문에 사용자마다 다를수 있는 선호도에 맞추지 못하는 것이라고 생각한다.
모델
Neural Collaborative Filtering (NCF)
NCF
Matrix Factorization
Optuna

유명한 Netflix Prize를 통해 matrix factorization (MF)가 latent-factor model 기반 추천의 상식이 되었다. 다만 단순히 MF로만 추천한다는 것에 한계가 있었고 그로 인해 MF와 DNN을 결합한 NeuMF를 사용하게 되었다. MF에서 유저와 아이템 데이터를 집어넣고, DNN에는 유저, 아이템 이외에 나이, 성별 등 다른 피처들을 추가로 집어넣고 학습 및 추론을 진행하였다. 처음 시도했던 결과는 0.2143이었고 초반부터 단순히 하이퍼파라미터를 바꿔가며 성능을 높이는 것보다는 다양한 피처를 추가하거나 바꿔가며 학습하는 것이 맞다고 생각하여 성별, 콘텐츠 주인공, 시청 시간 등 다른 피처들을 사용해보았다. 그 결과 0.2167까지 향상시킬 수 있었다.
NCF 논문의 실험방식을 읽어보니 DNN에 layer수와 최종 hidden layer의 output의 크기에 따라 모델 성능의 변환을 보여주었다. 논문에 맞춰서 진행하여 모델의 향상을 0.2180까지 이뤄낼 수 있었다. 모델에 집어넣을 피처들을 정하고 DNN의 layer와 최종 output 차원의 수를 조정한 다음 모델의 성능을 더 끌어올리기 위해 하이퍼파라미터를 전반적으로 조정해 주었다. 최적의 하이퍼파라미터를 찾기 위해 optuna와 grid search를 사용했다. Batch size나 layer dimension이 너무 큰 경우 한번 학습에 너무 결과가 오래 걸려 grid search를 사용하였고 반대의 경우에는 optuna를 사용하여 결과를 찾아 0.2230까지 성능을 향상시킬 수 있었다.
LightGCN

대회 후반부에 NeuMF 모델을 다듬으며 다른 negative sampling알고리즘과 모델을 시도해보는 것도 좋겠다고 생각하여 찾는 도중, 22년 7월에 나온 논문인 Bayesian Negative Sampling for Recommendation을 찾았고 대회 몇달전에 나온 논문이라 적용해보기로 결정했다. 협업 필터링 (collaborative filtering) 추천시스템의 SOTA인 Graph Convolutional Network (GCN)을 간소화시킨 LightGCN에 BNS 적용시킨 모델을 데이터셋에 사용해봤지만 모델의 학습 시간이 너무 오래 걸렸고 결과가 PNS를 적용한 NeuMF와 비슷하게 나와서 사용하지 않기로 결정하였다.
결과
참가한 총 216개의 팀 중 26위를 차지했다
약 3주 반동안 진행된 추천시스템 대회에 3명이서 참여하여 다양한 시각으로 대회 및 데이터를 바라보고 토론을 했던게 생각의 틀을 넓히는데 도움이 됐다
추천시스템의 기본 이론, PyTorch, 데이터 전처리 등 배웠던 것을 대회에 적용시킬 수 있었다는게 도움이 됐다
개선점
데이터 전처리
필요없는 피처는 많이 제거했지만 샘플은 반대로 다 사용하려는 방향으로 진행하다 시간을 허비한 것 같다. 데이터를 병합하는 과정에서 샘플 수를 다 보존하지 못 하더라도 전처리가 더 세세하게 된 데이터를 사용하는 것이 다른 결과를 야기했을 수도 있을거 같다는 생각이 든다
차원 축소, feature selection, feature extraction 등의 방법들을 통해 피처들의 중요도를 확인하며 제거 하는 방식이 더 논리적인 접근방식이었을 것 같다
PNS로 샘플링 했을 때, 글로벌하게 시청 이력만 가장 많은 콘텐츠별로 가중치를 두기 보단 시간, 나이, 성별 등과 클릭률을 고려한 PNS를 적용시켰다면 더 좋았을 거 같다
두개의 negative sampling 알고리즘에서 다양한 시도를 해봤지만, 더 많은 negative sampling 알고리즘을 테스트 해보며 성능을 확인해 보면 좋았을 거 같다
Model based negative sampling 알고리즘인 Dynamic Negative Sampling (DNS), Simplify and Robustify Negative Sampling (SRNS) 등
모델
NeuMF에서 layer의 수와 dimension 크기를 가능하면 많이 추가하며 실험을 진행해보고 싶었지만 제한된 리소스 (colab free & colab pro)에선 계속 커널이 죽는 현상이 발생하여 더 진행해보지 못한것이 아쉬웠다
NeuMF는 MF와 DNN의 결합으로 이루어진 모델인데 DNN대신 다른 모델을 써보는 것도 좋은 방법이었을 듯 하다
LightGCN에 BNS를 적용시켜보고 결과가 좋지 않아 폐기했는데, LightGCN을 NeuMF대신에 사용하고 negative sampling은 RNS나 PNS 등 다른 샘플링 알고리즘을 사용해보지 못해 아쉽다
Comentarios