아마존닷컴의 개인화 추천

2010. 4. 22. 10:59사는게 뭐길래/Data & Intelligence

저희 회사(넷스루)는 수년전부터 개인화 및 추천 서비스에 관한 기술을 개발하였으며, 몇몇 선구적인 사이트에서는 이미 저희 솔루션을 사용하고 있지요.
그런데... 요즘 부쩍 개인화 추천에 대한 관심이 높습니다.
예전에도 관심이 높긴 했지만...
그냥 관심을 가지는 것이 아니라 , 적극적으로 도입하고자 하는 기업들이 늘었다는 이야기입니다.

이렇게 개인화 추천에 관심을 가지는 분들이 가장 많이 궁금해하는 사이트!
당연히 아마존입니다.

예전에 제 블로그에서 아마존닷컴의 개인화 추천 기능을 소개한 적이 있습니다. (요기 클릭)
당시에 시스템 내부에서 어떻게 추천에 필요한 데이터를 구성하는지는 소개하지 않았었는데
이번에는 그 내부의 메커니즘을 간단히 소개하도록 하겠습니다.
(Jan/Feb 2003, IEEE Internet Computing에 소개된 "Amazon.com Recommendations : Item-to-Item Collaborative Filtering"을 주로 참조하였습니다.)

...

아마존의 접근 방법

아마존닷컴은 각 사용자의 개인별 성향 및 성향이 비슷한 사용자 그룹을 분석하고 이를 바탕으로 개인화 추천하는 전통적인 방식 대신, 상품 대 상품 (Item-to-Item) 관계를 이용하여 추천하는 방식을 사용합니다. (각 개인의 성향은 중요하지 않음. 전체 사용자들의 패턴이 중요함)
사용자 성향 위주로 개인화 추천을 할 경우, 새로운 사용자들에 대해 시스템에서 이해하는 내용이 부족할 수 있으며, 반대로 충실하게 오랫동안 사용한 사용자들의 경우 선호도가 여러가지로 분산되는 경우도 허다하며, 사용자들의 성향이 변덕스럽게 변하는 경우도 허다하기 때문일겁니다.

또한 아마존닷컴은 수 많은 사용자들이 이용하며, 어마어마하게 많은 상품이 있습니다.
이런 사이트에서 사용자에게 즉각적으로 개인에게 맞는 상품을 추천하기란 쉽지 않지요.

아마존닷컴에서는 추천에 필요한 상품과 상품의 관계를 Back-end Batch Processing으로 미리 계산해 둡니다.
비단 아마존닷컴뿐만 아니라, 거의 모든 대형 사이트는 이와 같이 장시간의 게산이 필요한 데이터는 미리 계산해 두지요.

이렇게... Item-to-Item 관계를 미리 계산해 두면
사용자가 Item A를 보고 있을 때, A와 Item-to-Item 관계성이 높은 상품 B, C, D를 즉시 추천할 수 있습니다.


Item-to-Item Collaborative Filtering

아마존 알고리즘의 핵심은 바로 상품과 상품 사이의 관계성을 어떻게 정의하고 분석하는가입니다.
아마존닷컴에서는 이와 같은 상품과 상품 사이의 관계성을 "Item-to-Item Similarity"라고 합니다.
(전통적인 Collaborative Filtering이나 Clustering은 사용자와 사용자 사이의 Similarity를 근간으로 하는 반면, 아마존닷컴은 상품과 상품 사이의 Similarity를 근간으로 한다고 보면 되겠군요.)

아마존닷컴에서 Item과 Item 사이의 Similarity를 계산하는 알고리즘을 개념적으로 간단히 설명하면 다음과 같습니다. (정확히 아래와 같다고 하기는 어렵겠네요. 실제로 어떻게 했는지는 모르니까... ^^ 대략, 개념적으로는 차이가 없을 듯합니다.)

1) Item-Customer Matrix를 만든다


몽룡이 : 청바지,  반바지 주문
춘향이 : 반바지, 면바지 주문
   ....

각 Item(상품)별로 각 사용자가 함께 주문한 상품들을 체크함. (함께 주문한 상품들을 '1'로 표시. 나머지는 '0')




2) Item-to-Item Similarity를 계산한다
    아이템 별로 벡터를 만들어서 각 아이템간의 Similarity를 계산합니다.  
    예를 들어 - 청바지 = (1, 0, 0, 1), 반바지 = (1, 1, 1, 1)
   청바지와 반바지의 Similarity = 2
   * Similarity 또는 Distance를 계산하는 방법은 여러가지가 있습니다.
     위와 같이 0/1로만 값이 나타나는 경우라면 Hamming Distance로 간단히 계산할 수 있습니다.
   * 위의 예에서는 사용자별 주문 목록을 이용해서 벡터를 만들었는데
      벡터를 만드는 방법은 여러가지가 가능할 것 같습니다.
      예를 들어, 각 사용자가 부여한 평점으로 벡터를 만들고, Euclidean Distance를 이용해서 Similarity를
      계산할 수도 있습니다.

3) Item-Item Similarity Matrix를 만든다

청바지-반바지=2
청바지-백바지=0
청바지-면바지=1

청바지는 반바지와 Similarity가 가장 높음.
즉, 청바지를 살 때 반바지를 함께 사는 경우가 가장 많음.
따라서, 어떤 사용자가 지금 청바지를 보고 있다면, 반바지와 면바지를 추천!
 

...

단순히 생각할 때, 위와 같은 과정을 통해 계산하게 되면..
아마존닷컴과 같이 상품수와 사용자수가 어마어마하게 많은 사이트에서는 계산이 불가능하다고 봐야합니다

대략 하루에 10만개의 서로 다른 상품이 팔린다고 했을 때...
어립잡아도 Item-to-Item Similarty를 계산하기 위해서는 10만 x 10만 =100억 만큼의 계산량이 필요합니다. 
상품 수가 많은 일반 대형 쇼핑몰의 경우, 일반적인 DB Application으로 처리하기에는 쉽지 않은 작업입니다.
이러한 작업을 빠르게 처리하기 위한 별도의 전용 프로그램을 고안해서 만들거나, 데이터 마이닝의 연관규칙(Association Rule) 탐사 기법 같은 것이 필요할겁니다.
(위에 소개한 Item-to-Item Similarity는  연관규칙 탐사 기법으로도 찾아낼 수 있습니다.)

하지만, 판매되는 상품의 수가 적다는가...
보유한 상품 수는 많지만 늘 팔리는 상품들은 소수라던가...
이런 사이트라면 무리 없이 계산할 수도 있을 것 같습니다.