관리 메뉴

TEAM EDA

[추천시스템] 후처리의 모든 것 (서빙전 필터링) 본문

TEAM EDA /UpstageAI (2022.01.01 ~ )

[추천시스템] 후처리의 모든 것 (서빙전 필터링)

김현우 2023. 3. 30. 08:00

이번 글에서는 추천 모델을 생성한 후에 적용하는 후처리에 대해서 알아보겠습니다. 요새 개인적으로 많이 고민하는 주제인데, 후처리는 추천 모델이 제공한 추천 결과를 보완하여 사용자에게 더욱 적합한 추천을 제공하는 과정입니다. 예를 들어, 사용자의 취향을 더욱 정확하게 반영하여 추천 나가는 상품의 순서를 섞거나 특정 상품을 구매하지 않은 이유를 분석하여, 추천 모델이 해당 상품을 추천하지 않도록 제외시킬 수 있습니다. 혹은, 문제가 될만한 상품들 (ex. 성인 상품)을 추천에서 제외해주기도 합니다. 

 

[일부 추천 상품 제외] 

추천 상품을 제외하는 대표적인 필터링 기법 중에 하나는 이미 구매한 상품을 추천에서 제외하는 로직입니다. 모델의 추천결과를 보게 되면 실제 클릭하거나 구매, 좋아요를 누른 상품들이 대부분 추천 결과에 포함되는 것을 확인할 수 있습니다. 어찌 보면 당연한 것인데, MF를 생각해 보면 히스토리의 점수를 맞추도록 학습하기에 히스토리가 있는 부분은 1에 없는 부분은 0에 가까워지게 됩니다. 결국, 히스토리가 있는 부분이 평균 점수가 더 높아서 추천 결과는 대부분 히스토리에 있는 상품들 기반으로 채워지게 되는 것입니다. 컴퓨터, 노트북, 티비 등과 같 상품을 구매하고 단기간에 바로 다시 같은 상품을 구매하는 사람을 적을 테니 관련 상품을 제외해 주는 게 소비자 입장에서는 많은 도움이 되고 implicit 패키지의 기능을 보면 filter_alreay_liked_items가 있어서 히스토리 상품을 제외하기도 합니다. 

 

 

라이너에서 근무하시는 허훈 님의 페이스북 글 [추천 시스템: Bloom Filter for Filtering Layer]에서도 관련 내용을 찾아볼 수 있었는데,

확률적 자료구조인 Bloom Filter에 사용자들이 이미 소비했던 문서의 키 값을 모두 미리 저장해두도록 합니다. 그리고 추천 아이템을  Aggregate해서 최종적으로 반환해주는 게이트웨이가 Bloom Filter와의 통신을 통해 사용자가 이미 소비한 문서는 추천 목록에서 배제하도록 합니다.

Bloom Filter를 사용해서 추천 목록에서 제외하였다고 합니다. 하지만, 반드시 구매한 상품을 제외해야 하는지에 대해서는 고민이 필요합니다. 위의 예시에서 노트북, 컴퓨터, 티비 등과 같은 고가의 상품의 경우는 재구매 비율이 떨어지지만 옷, 우유, 콜라 등과 같이 일부 상품의 경우는 다시 구매하는 경우가 분명 있습니다. 실제 캐글의 H&M Personalized Fashion 추천 대회에서도 이미 구매했던 상품을 그대로 추천해 주는 전략이 MAP@12에서 1등 0.03792 대비 절반 이상인 것을 확인할 수 있습니다. (이미 구매한 상품을 추천에서 제외하면 이만큼의 점수를 잃어버리게 되므로, 매우 중요합니다) 

 

 

그 외에도 판타지, 무협 소설을 좋아하는 저에게 로맨스, BL등과 같은 소설을 추천하는 상황을 제외할 수도 있고 어린이들에게 성인 상품이 추천되는 것을 후처리로 제외할 수도 있습니다. 이런 로직을 적용할지 말지에 대해서는 데이터, 소비자, 상품 등의 성향을 잘 파악해서 실험을 해보고 결정이 필요한 것 같습니다. 

 

[Item Shuffling] 

두 번째로는 추천된 상품의 결과를 섞어주는 reranking 계열의 후처리 방법이 있습니다. 해당 방법은 기업에 적용된 자료 많이 찾아볼 수 있었는데, 대표적으로 요기요의 [돈까스 좋아해요?] — 요기요 ML엔지니어의 3개월과 라이너의 Bag-of-Tricks for Recommendation: Recency, Clustering 그리고 Item Shuffling 에서 관련 내용을 다루고 있습니다. 

 

간단한 컨셉은 상의, 하의, 외투 등과 같은 카테고리별 추천 후보 결과가 있을 때 이의 순서를 적절하게 섞어서 사용자가 연속된 카테고리 결과를 보지 못하게 하는 것입니다. 로직에 대한 자세한 내용은 [Recommender System] - 결과 정렬에서의 Shuffle 알고리즘글이나 위의 2개 글을 참고하시기 바랍니다. 

(좌) Item Shuffling 적용 결과 / (우) Item Shuffling 적용 전 결과

실제 데이터에 대해 한번 Item Shuffling을 적용한 결과를 보여드리겠습니다. 왼쪽이 적용 후의 결과이고 오른쪽이 적용 전의 결과입니다. x 축은 1~50등의 추천 결과의 카테고리 색을 의미하고 y 축은 유저를 의미합니다. 약 30명 정도의 유저에 대해서 50개 정도의 추천결과 카테고리가 무엇인지 보여주는데 결과를 보면 오른쪽 위의 before 그림과 같이 살색 카테고리로만 채워진 경우도 있었고, 바로 위의 결과도 보라색 (?) 결과가 쭉 나열된 것을 볼 수 있습니다. 즉, 같은 카테고리의 결과가 쭉 나열된 형태입니다. 이에 Item Shuffling을 적용한 경우 왼쪽 그림과 같고 정렬이 생각보다 잘된 것을 확인할 수 있습니다. (참고 : 로직은 일부 수정했습니다) 사용 시에 조금 어려움은 있었는데, 첫 번째로 각 카테고리별 추천결과가 적으면 Shuffling 하는 의미가 없습니다. 어느 정도의 결과가 보장이 되어야 Shuffling 되는 모습을 보였습니다. 그로 인해, 50개의 결과로 섞는 것이 아닌 그 이상의 결과를 가지고 섞어야 했고 메모리의 부담이 늘어나는 한계가 있었습니다. 두 번째로는 과연 이게 성능을 높여줄까? 유저의 Impression 혹은 Click으로 이어질까?입니다. 실제 요기요의 경우는 무한 지면이라는 화살표로 스크롤을 내리면 추천 결과가 계속해서 나타나는 지면에 적용을 했습니다. 

이러한 무한 지면은 사용자가 검색이나 추천을 통해서 아직 마음에 드는 탐색을 하지 못한 유저 혹은 새로운 경험을 하려고 하는 유저집단이고 이러한 유저들에게 중국집 - 중국집 - 중국집보다 중국집 - 치킨 - 카페 등과 같이 새로운 모습을 보여주는 게 의미가 있을 것입니다. 

 

유튜브의 지면도 무한 지면으로 추천 결과가 계속 생기는데, 이러한 지면의 결과를 눈으로 봤을 때 6개 결과가 모두 다른 카테고리 형태임도 확인할 수 있었습니다. (게임 - 영화 - 축구 - 노래 -.. ) 하지만, 그 외의 목적을 가진 지면에 이를 적용하는 게 의미가 있을까? 에 대해서는 사실 모르겠습니다. 그러한 유저도 있을 것 같고, 그렇지 않은 유저 또한 있을 것 같습니다. 그리고, 추천을 하는 대상이 원하는 목적에 따라서도 다를 것 같습니다. (소비자에게 다양한 카테고리를 추천해주고 싶은지 - diversity vs 소비자가 볼법한 카테고리만 추천할지? - Accuracy) 위의 기구매 필터링의 언급과 같이 모든 게 케이스 바이 케이스로 다른 결과를 보여줄 것 같고 온라인 A/B 테스트를 통해서 파악하는 게 가장 좋은 방법일 것 같습니다. 

 

문득 Item Shuffling을 보고 들었던 생각이, 상품 카테고리보다 더 작은 범주인 이름을 통해서 추천 순서를 섞을 수도 있지 않을까? 에 대한 생각을 했습니다. 거창하게 Name Shuffling이라고 지었는데, 아이템 기반의 추천 결과를 보면 완전히 동일하지만 유통사가 다르거나, 일부 크기만 다른 결과들이 쭉 나열된 경우들이 있었습니다. 

펩시제로슈거 라임을 보고 추천된 결과

이러한 추천은 펩시제로 라임 콜라를 보고 최저가 혹은 같은 제품의 비교 상품을 보려는 사람에게는 좋은 추천이지만 펩시제로 라임 콜라가 아닌 사이다 혹은 웰치스 등과 같은 다른 상품을 탐색하려는 사용자에게는 나쁜 추천일 것 같습니다. 

이런 문제를 해결하기 위한 아이디어를 Personalized Embedding-based e-Commerce Recommendations at eBay 에서 얻었는데, 여기서는 추천 결과 중 같은 결과의 상품 (a)에서 1, 2, 5가 같은 상품이니 이를 제거해 주기 위해 클러스터링을 사용하는 것이었습니다. 저도 같은 방식으로 상품의 이름에 대해서 임베딩을 추출하고 클러스터링 한 다음에 클러스터별로 Item Shuffling을 진행한 결과 위의 문제가 완화되는 것을 확인할 수 있었습니다.  

 

그 외에도 Post Processing Recommender Systems for Diversity Diversity를 높이기 위한 연구도 있었습니다. 

 

 

[오프라인 실험] 

한번 위의 내용들을 바탕으로 실제 캐글의 H&M 데이터에 대해서 어떤 식으로 추천 결과가 바뀌는지 적용해 보도록 하겠습니다. 먼저 임의의 유저에 대해서 ALS로 학습한 모델이 어떤 추천 결과를 뱉는지 살펴보겠습니다. 

해당 유저의 최근 8개의 구매 이력을 보면 스웨터 위주로 구매를 했습니다. 

 

그리고 실제 상위 추천 결과 8개를 보면 대부분 스웨터이고 종종 다른 카테고리도 있는 것을 볼 수 있습니다. 위의 추천 결과에서 볼 수 있는 점은 

  • 1, 2 등의 추천 결과는 실제 구매이력에 있던 상품 
  • 스웨터를 본 사람에게는 대부분 스웨터의 추천이 나감 

위의 유저처럼 구매된 상품을 다시 구매하는 사람도 있지만, 다시 구매하기를 원하지 않는 사람도 있을 것입니다. 이런 유저에게는 기구매 필터링을 통해서 1, 2번째 추천 결과가 아닌 3, 4의 결과를 먼저 내보는 게 의미가 있을 것입니다. 

 

이제 한번 다른 예시로 Skirt 위주로 본 사람에게 Item Shuffling을 적용해보겠습니다. 

 

임의의 유저 10명에 대해서 추천된 결과의 카테고리

 

해당 유저의 원 추천 결과는 아래와 같습니다. 

유저 A에 대한 원본 추천 결과

6번째 상품을 제외하고는 모두 Skirt이고 10등 밖으로 종종 다른 카테고리들도 섞여있는 것을 볼 수 있습니다. 한번 Item Shuffling을 통해서 앞으로 당기면, 기존 추천 결과에는 없는 새로운 카테고리들이 등장한 것을 확인할 수 있습니다. 스커트를 사려고 하는 유저에게는 분명 위의 추천 결과가 좋겠지만, 다른 카테고리의 상품을 찾는 유저에게는 확실히 아래의 추천이 좋지 않을까 생각합니다. 

유저 A에 대한 Item Shuffling 이후 추천 결과

 

그 외의 유저들에 대해서도 카테고리의 변화가 적절히 섞인 것을 확인할 수 있습니다. 

 

Item Shuffling 전, 후의 추천 결과의 카테고리 변화

 

비록 위의 방법론들은 실제 서비스에 적용해서 확인해본 결과는 아니고, 오프라인에서 실험해 보거나 관련 글들을 통해서 제 나름의 생각을 정리한 내용입니다. 하지만, 적합한 상황에 맞게 후처리를 적용해 보면 분명 좋은 결과가 있을 것이라 생각하고 나중에 기회가 되면 서비스에 적용해 보고 결과를 공유드리도록 하겠습니다. 

 

[참고자료]