추천 모델이 같은 상품을 모두에게 보여준 사고의 원인과 해결 기록Hubness안녕하세요! KREAM의 추천서비스 엔지니어 최준영입니다.
지난 글 밑바닥에서 개선한 추천시스템 with Two-Tower Model 마지막에 유저 행동 시퀀스를 반영하는 기법은 다음에 소개하겠다고 적었는데 이 글에서 그 이야기를 이어 가려고 합니다.
모델 구조 자체보다는 논문 구조를 그대로 가져와 적용했을 때 실서비스에서 무엇이 문제가 되고 어떻게 대응했는지 다루겠습니다.
모델이 사용된 지면
먼저 추천 지면 세 곳을 먼저 소개합니다. 모델 하나를 세 지면에 적용했고 세번째 (인기 상품 목록) 지면에서 문제가 두드러졌습니다.
왼쪽부터 카테고리 추천, 무한 스크롤 피드, 인기 상품 목록카테고리 추천: 모델을 retrieval로 사용하여 대표 카테고리 상품 한개씩을 보여줍니다.
무한 스크롤 피드: 이 지면도 모델을 retrieval로 사용하여 무한 스크롤 피드를 제공합니다.
인기 상품 목록: 인기 상품 상위 3000개를 후보로 사용하여 모델을 re-ranker로 사용한 지면입니다.
모두에게 비슷하게 추천하는 문제
9월 초에 인기 상품 목록에서 특정 상품들이 자주 노출된다는 리포트를 받았습니다. 처음 며칠은 클릭할 만한 인기 상품이라고 생각하고 넘겼습니다. 당시에는 오프라인 지표에도 A/B 지표에도 같은 상품이 얼마나 많은 유저에게 노출되는지를 보는 지표가 없어서 리포트 외에는 이 현상을 알아챌 방법이 없었습니다.
동료들의 계정을 확인 한 후에 문제임을 인지하게 되었고 임시로 문제 되는 상품들의 노출을 낮추는 대응을 하였습니다.
탐색 이력과 무관하게 여러 유저에게 동시에 노출된 상품 5개이 상품들은 유저와 상관없이 반복해서 상단에 노출되었고 그만큼 개인화 상품은 노출 기회를 잃었습니다.
본문에서 계속 사용할 지표 두 가지를 먼저 정의하겠습니다.
hub 지표: 가장 많이 추천된 상위 N개 상품이 전체 추천에서 차지하는 비율. 소수 상품에 추천이 집중될수록 높아집니다.
과노출 상품: 노출 점유가 인기 점유의 10배를 넘는 상품. 위 다섯 상품이 여기에 해당합니다.
Hubness
hub: 많은 점의 Nearest neighbor로 반복 선택되는 점 (Radovanović et al., 2010)100명의 취향에 가장 가까운 음식을 고르면 가장 인기 있는 음식이 아니라 평균에 가까운 무난한 음식이 선택됩니다. 이 현상이 hubness이며 추천에서는 유저가 누구든 상단에 반복 노출되는 상품을 hub라고 부릅니다.
hubness는 인기 편향과 다른 문제입니다. 인기 편향은 많이 팔린 상품이 더 자주 추천되는 데이터의 성질이라면 hubness는 벡터 공간에서 모두의 평균 가까이에 놓였다는 위치의 성질입니다. 뒤에서 보겠지만 인기 상품 점수를 낮춰도 hub는 남아 있었습니다.
모델: Multi-interest (MINER)
Two-Tower 모델은 유저를 벡터 하나로 표현하기 때문에 러닝화, 캠핑, 피규어를 번갈아 보는 유저라면 세 관심사가 평균으로 섞여 어느 관심사에도 맞지 않는 상품이 추천됩니다. 이를 풀기 위해 유저 history에서 interest 벡터를 여러 개 추출하는 multi-interest 구조를 도입했고 그 중 MINER 논문을 선정하였습니다.
interest끼리 비슷한 벡터로 수렴하는 interest collapse를 막는 disagreement regularization이 구조 안에 들어 있다는 점이 선택 이유였습니다. 논문에서 뉴스 추천을 상품 추천에 맞게 수정해서 적용했습니다.
적용 모델 구조history(유저가 최근 본 상품, 최대 50개)는 history encoder를 거친 뒤 학습되는 쿼리 벡터(context code) 4개의 attention을 통해 interest 벡터 4개가 됩니다.
점수는 가장 최근 상품 시점의 상태(last state)와의


