[Translation] Recommender Systems, Not Just Recommender Models

Gee
higee
Published in
9 min readApr 24, 2022

--

Recommender Systems, Not Just Recommender Models 번역한 글입니다.

by Even Oldridge and Karl Byleen-Higley

번역표

  • approximate nearest neighbor: 근사 인접 이웃
  • collaborative filtering: 협업 필터링
  • filtering: 필터링
  • inference: 추론
  • ordering: 정렬
  • production system: 운영 시스템
  • retrieval: 추출
  • scoring: 평점
  • user: 이용자

처음 추천 시스템을 만들어 보는 사람들이 겪는 어려움 중 하나는 실제로 그것이 어떻게 이루어져 있는지 잘 모른다는 것입니다. 추천 시스템에 관한 온라인 자료 대부분은 (추천) 모델 자체에 집중하고 협업 필터링에 관한 간단한 예제 정도만 다룹니다. 따라서 입문자들은 단순한 모델들을 활용한 예제들과 그 모델들을 서비스하기 위한 운영 시스템 간의 극명한 차이를 느낄 것입니다.

이 글에서 저희는 Meta, Netflix, Pinterest 같은 회사들의 사례들을 활용해서 최신 추천 시스템 대부분에 적용할 수 있다고 생각되는 패턴을 공유할 것입니다. 저희 NVIDIA Merlin팀은 이 패턴을 중심으로 추천 시스템 개발 전과정을 바라보는데, 이를 공유하게 되어서 기쁘며 이를 통해 여러분들이 (모델 뿐만 아니라) 실제 운영 시스템에서 추천 시스템이 어떻게 동작하는지 그 실체를 이해하는데 도움이 되기를 바랍니다. 이 글에서 다루는 내용을 다른 형태로 보고 싶다면 KDD’s Industrial Recommender Systems workshop 영상도 있습니다.

추천 모델 너머에

단순한 협업 필터링이든 DLRM 같은 딥러닝 모델이든, 추천 모델의 역할은 다양한 아이템이 주어졌을 때 각 아이템에 대한 이용자의 관심도를 예측하여 그것을 기준으로 순위를 부여하는 것입니다. 정확히 말하자면, 순위를 부여한다고 하기보다는 점수를 매기는 것입니다. 그러나 점수 하나만 가지고 이용자에게 특정 아이템을 추천하는 것은, 대부분의 경우 현실적으로 쉽지 않습니다. 왜 그런지 먼저 이유를 살펴보고 난 후에, 이에 대한 해결 방법 및 그것을 저희 추천 시스템에 어떻게 반영했는지 살펴보겠습니다.

더 많은 아이템, 더 많은 문제

규모가 커질 때 마주하는 첫번째 문제는 추천 아이템의 총 개수입니다. 아이템 카탈로그는 백만, 수백만 그리고 극단적인 경우 십억 개까지 증가합니다. 모든 이용자들을 대상으로 모든 아이템에 대한 점수를 매기는건 그런 경우 혹은 대부분의 경우 불가능에 가깝습니다. 점수를 매기는 건 많은 연산을 요구하기 때문입니다. 실제로는 천 혹은 만 개 정도의 관련성 높은 아이템 일부를 추려서 시작합니다.

2단계 추천 시스템을 봅시다. 아이템에 점수를 매기기 전에, 이용자가 최종적으로 보게 될 아이템들을 관련성이 높은 것 위주로 선별해야 합니다. 이 단계는 흔히 후보 추출 단계로 알려져 있지만, 후보 생성 단계라고 부르는 곳도 있습니다. 추출 모델은 행렬 분해, two-tower, 선형 모델, 근사 근접 이웃, 그래프 순회 등 다양한 형태를 취하며 평점 모델보다 일반적으로 연산 성능이 (월등히) 뛰어납니다. Youtube는 2016년에 이 아키텍처에 관한 초기 자료 중 하나인 훌륭한 논문을 발표했는데, 이 방법은 다른 많은 곳에서도 틀림없이 사용되었을 것이며 아직도 널리 쓰입니다. Eugene Yan은 이 주제에 대해 훌륭한 글을 썼는데, 아래에서 소개할 저희의 4단계 추천 시스템 도표들은 그의 2단계 추천 시스템에서 영감을 받았습니다. 이용자에게 다양한 아이템을 보여줄 수 있도록 동일한 추천 시스템에서도 출처가 다른 곳에서 가져온 후보 아이템을 사용하는 건 흔한 일이지만, 그 내용은 다른 글에서 다루겠습니다.

그것만은 안돼 !

두 단계 만으로 대규모 환경에서도 관련성이 높은 아이템을 추천할 수 있을 거처럼 보이지만, 추천 시스템은 이 외에도 여러가지 제약 조건들을 충족해야 합니다. 대부분의 경우, 이용자에게 보여주고 싶지 않은 아이템들이 있기 마련입니다. 예를 들어 (전자 상거래의 경우) 재고가 없거나, 연령 제한에 걸리거나, 이용자가 이미 본 내용이거나, 저작권법으로 인해 이용자가 거주하는 국가에는 보여줄 수 없다거나 하는 경우들이 있습니다.

이러한 비지니스 로직을 평점 모델 및 추출 모델이 추론해서 아이템을 적절하게 추천하게 하는 것보다, 필터링 단계를 새로 추가하는 것이 필요합니다. 필터링은 많은 경우 추출 단계 이후에 이루어지며, 한 단계로 통합될 수도 있고 (필터링 단계에서 부딪힐 수 있는 더 복잡한 문제 중 하나는 추출 후에 충분한 후보 아이템이 남아 있도록 보장하는 것입니다) 혹은 어떤 경우는 점수를 매긴 이후에 이루어질 수도 있습니다. 필터링은 모델이 강제할 수 없는 (혹은 매우 어려운) 비지니스 로직을 적용할 수 있게 해줍니다. 때로는 직접 아이템을 배제하기 위해 단순한 쿼리를 사용할 수 있지만, 유저가 이미 보았던 아이템을 제거하기 위해 블룸필터를 사용하는 경우처럼 더 복잡해질 수도 있습니다.

정렬 !

앞서 살펴본 세 단계(추출, 필터링, 평점)를 활용하면 많은 양의 관련성 높은 추천 아이템으로 이루어진 목록과 아이템 각각의 점수를 얻을 수 있습니다. 이 점수는 이용자가 각 아이템에 대해 얼마나 관심 있어할지에 대한 평점 모델의 예측치를 나타냅니다. 추천 결과는 이용자에게 대개 목록의 형태로 보여지는데, 이는 재밌는 난제를 던져줍니다; 개별 아이템들의 점수가 높다고 항상 최고의 목록이 되지는 않는다는 것입니다. 대신 이용자가 필터버블에 갇히지 않고 아직 접하지 않았던 분야를 탐험할 수 있도록, 후보 아이템들 중에서 다양하게 추천해주거나, 평소 추천해주던 아이템과 사뭇 다른 아이템을 추천하고 싶을 수도 있습니다.

몇몇 문헌과 예시는 저희 추천 시스템의 세번째 단계를 랭킹이라고 부르기도 하는데, 이용자에게 보여지는 최종 순위 혹은 위치는 모델의 직접적 결과와 대부분의 경우 일치하지 않습니다. 명시적으로 정렬 단계를 추가함으로써, 비지니스 요구사항 및 제약사항에 맞게끔 모델의 결과를 조정할 수 있게 되었습니다.

4단계 추천 시스템

추출, 필터링, 평점, 정렬의 네 단계는 저희가 봤거나 만들었던 거의 모든 추천 시스템을 아우르는 디자인 패턴을 이룹니다. 아래의 도표는 그 단계들을 보여주며, 각 단계를 어떻게 만들 수 있는지 사례와 함께 제시합니다. 이는 기본적인 추천 모델보다 훨씬 더 복잡하며, 특히 운영 환경에 배포하는 걸 고려하면 더욱 복잡해지지만, 저희는 이것이 오늘날 대부분의 운영 환경에서 추천 시스템이 어떻게 구축되었는지 정확히 보여준다고 생각합니다.

다양한 분야의 사례들

추천 시스템을 포괄적으로 설명할 수 있는 패턴을 봤으니 실제로 그런지 확인해 봅시다. 우선 널리 사용되는 추천 시스템을 몇 개 보고나니, 최소한 큰 틀에서는 네 단계로 충분히 설명 가능하며 또한 일관된 패턴도 볼 수 있습니다.

한 발짝 더 나아가, 저희가 제안한 패턴의 네 단계를 실제 사례에서도 볼 수 있는지 살펴봅시다.

우선, Meta의 Instagram은 추천 시스템을 더 쉽게 개발할 수 있도록 만든 쿼리 언어에 관한 훌륭한 글을 작성했습니다: Powered by AI: Instagrams’ Explore recommender system (IGQL query language). 그들이 제공한 예시에서 볼 수 있듯이, 이 쿼리 언어는 저희 패턴의 네 단계에 정확히 부합합니다:

Pinterest는 다양한 논문(Related Pins at Pinterest: The Evolution of a Real-World Recommender System, Pixie: A System for Recommending 3+Billion Items to 200+ Million Users in Real-Time, Applying deep learning to Related Pins)을 발표했는데, 그 중 첫번째 논문은 그들의 시스템 아키텍처가 시간이 지나면서 어떻게 변화해왔는지를 보여주는 도표를 포함합니다. 그들의 도표속에서 추출과 필터링이 하나의 단계로 통합된 미묘한 차이를 제외하고는, 여기서도 같은 패턴을 발견했습니다.

마지막으로, Instacart는 네 단계를 그대로 따르는 아키텍쳐를 2016년에 공유했습니다. 우선 후보 아이템을 추출하고 그 중에서 이미 구매한 아이템은 필터링 합니다. 최고의 후보 아이템은 그 후에 점수가 매겨지고, 이용자에게 제공되는 최종 결과는 다양성을 향상시키기 위해 재정렬됩니다.

복잡한 시스템

4단계 도표에서 저희는 모든 단계에서 (온라인) 추론 시 쿼리가 가능하도록 훈련, 배포, 지원하기 위해 필요한 구성 요소들을 강조했습니다. 이 시스템은 하나의 모델보다 훨씬 복잡하므로, 온라인에서 추천 시스템에 대한 정보를 검색 했을 때 단지 협업 필터링 모델에 관한 정보 만을 찾을 수 있었던 사람들이 추천 시스템을 직접 만들어보려고 할 때 적지 않게 당황하는건 놀라운 일이 아닙니다.

위에서 살펴본 복잡성이 초래하는 문제들은 다음 글에서 더 자세히 살펴보고, 그에 대한 해결법을 저희의 추천 시스템 프레임워크 (Merlin)을 통해 얘기하겠지만 지금은 우선 스스로 생각해 보기 바랍니다: 여러분이 사용하는 추천 시스템을 다시 보고, 네 단계가 존재하는지 확인해 본 후에 만약 네 단계에 해당하지 않는 단계를 발견하면 꼭 알려주세요! 저희는 추천 시스템 분야에서 최고의 솔루션을 제공할 수 있도록 끊임없이 고민하고 지속적으로 라이브러리를 업데이트하고 있으니 여러분의 피드백은 감사히 받겠습니다.

여기까지 읽으신 분들에게… 추천 시스템 개발 및 배포를 더 쉽게 해주는 오픈 소스 라이브러리를 만드는 데 열정이 있으시면 저희를 꼭 찾아주세요. 여러 직군에 걸쳐 채용중입니다.

--

--