E-commerce in Your Inbox : Product Recommendations at Scale
해당 논문은 사용자의 구매내역(email receipt)을 활용하여 Yahoo 사용자에게 개인화된 광고 메일을 발송하려고 한다.
각 email receipt는 특정 시점에 발생하는 구매내역이며 각 구매내역에는 여러개의 상품이 포함되어 있다.
각 item의 embedding vector를 잘 representation하여 사용자에게 개인화된 추천 상품을 노출시키고자 하는 것이 해당 논문의 목적이다.
이 논문에서는 구매 sequence를 활용하여 item embedding vector를 얻는다.
Meta-Prod2vec을 공부하며 추가적인 개념으로 읽은 논문이라 prod2vec에 관한 내용만 적어보았다.
NOTATION
각 방법론을 설명하기에 앞서 용어 정리를 간단히 하고 넘어가보자.
s=email receipt set purchased by user n
em=receipt m of the email receipt set purchased by user n
pmTm=item Tm-th purchase among items purchased at the m receipt among the email receipt set purchased by user n
s=(e1,...,eM)∈S
em=(pm1,...,pmTm)
→ 각 item에 대한 D차원의 embedding vector를 표현하는 것이 목적
다시 정리하자면 각 유저가 구매했던 email receipt set(=s)이 존재하며 각 set에는 시간대별로 구매한 개별 email receipt(=ei)이 존재할 것이다. 또한 각 email receipt에는 여러 상품 구매내역이 존재할 것이며 m번째 email receipt내에서 구매한 Tm번째 상품을 pmTm이라고 정의한다.
prod2vec

논문에서 제안하는 prod2vec 알고리즘은 각 유저가 구매한 상품 sequence를 기반으로 상품의 embedding vector를 학습한다.
- skip-gram 알고리즘을 활용해 상품 구매 sequence를 학습
- target item의 주변 item을 통하여 embedding vector를 구함
vp : input vector
v′p : output vector
L=Σs∈SΣpi∈sΣ−c≤j≤clogP(pi+j|pi)
P(pi+j|pi)=exp(vTpiv′pi+j)ΣPp=1exp(vTpiv′p)
skip-gram 알고리즘을 알고 있다면 쉽게 파악알 수 있는 어렵지 않은 수식이므로 skip-gram에 대한 이해가 필요하다.
참조 링크를 바탕으로 그린 skip-gram 구조에 대한 글도 확인해보면 좋을 것 같다.
이러한 skip gram 구조에서 단어를 상품으로 대체하면 된다. 수식에서의 c(−c≤j≤c)는 skip gram에서 정의하는 window size를 나타내며 logP(pi+j|pi)에서의 pi+j는 pi를 제외한 pi의 주변 상품을 말한다.
prod2vec의 문제점은 하나의 email receipt에 여러개의 상품이 동시에 구매되었다는 것을 고려하지 않는다는 점이다.
bagged-prod2vec

앞선 prod2vec의 문제점을 개선하기 위해 제안된 방법으로 기존의 prod2vec처럼 주변의 item을 탐색하는 것이 아니라, 주변의 email receipt를 탐색한다.
수식은 아래와 같다.
L=Σs∈SΣem∈sΣ−n≤j≤nΣk=1,...,TmlogP(em+j|pmk)
prod2vec의 두번째 term(Σpi∈s)에서는 set에 포함되는 모든 unique한 item의 sequence에 대해 살펴보았지만 bagged-prod2vec에서의 두번째 term(Σem∈s)은 set에 포함되는 email receipt의 sequence를 살펴보고 있다.
따라서 em에 포함되는 상품이 중심이 되며 주변 email receipt(m-n ~ m+n)에 대한 계산을 수행한다.
em 상품들을 학습할때에는 중심 상품(input)만 변하게 되며 target은 동일하다.
또한 em에 포함되는 상품들은 서로를 고려하지 않는다.(예측 대상이 아님)
P(em+j|pmk)=P(pm+j,1|pmk)×...×P(pm+j,Tm|pmk)
em receipt에서 k번째 item pmk이 구매되었을때, em+j receipt의 확률은 em+j에 포함되는 모든 상품의 확률을 곱하는 것과 같다.
Product-to-product predictive models
prod2vec-topK
앞서 제안된 방법으로 item의 embedding vector를 얻었다면 cosine 유사도를 통해 top k의 유사 item을 추천해줄 수 있다.
prod2vec-cluster
추천의 다양성을 위해 유사한 상품끼리 cluster로 묶고 이전에 구매된 item의 cluster와 가장 관련성 있는 cluster에서 item을 추천한다. 앞선 top-k의 방법에서 보다 다양한 유형의 상품을 추천하고 싶을때 활용하거나 top-k의 방식과 결합하여 적용해볼 수 있다.
- 각 상품의 embedding vector를 가지고 clustering을 수행하여 유사한 상품의 군집을 생성(논문에서는 k-means 적용)
- 군집별 유사도를 구한다.
- 군집별 유사도는 ci 군집 내에서 상품을 구매한 후 cj에서 다음 상품을 구매할 확룔(^θij)이며 아래와 같이 구할 수 있다.
- ^θij=of times ci purchase was followed by cjcount of ci purchases
- 분모는 ci 군집내에 속한 모든 상품이 구매된 수를 count한 값이며,
분자는 ci 군집내에 속한 상품을 구매한 후 cj 군집내에 속한 상품을 구매한 수를 count한 값이다.
- example
- k=5라고 가정할때, 각 군집을 [c1,c2,c3,c4,c5]라고 한다.
- c1은 (^θ12,^θ13,^θ14,^θ15) 를 얻을 수 있다.
- 같은 방식으로 [c1,c2,c3,c4,c5] 모든 군집에 대한 확률값을 얻을 수 있다.
- 군집별 유사도는 ci 군집 내에서 상품을 구매한 후 cj에서 다음 상품을 구매할 확룔(^θij)이며 아래와 같이 구할 수 있다.
- 각 군집별 가장 유사한 군집을 얻는다. (top 1)
- 추천 상품을 유사 군집 내의 상품들과 유사도 계산을 수행하여 상품을 추천해준다.
- example
- 상품 p가 군집 c1에 속해있고, c1과 가장 높은 ˆθ를 가진 군집은 c3이라고 한다.
- 상품 p는 c3 군집 내의 상품들과 cosine 유사도를 통해 top K 상품을 추천해줄 수 있다.
- example
참조 코드
https://github.com/mquad/sars_tutorial/blob/master/04_Prod2Vec.ipynb
GitHub - mquad/sars_tutorial: Repository for the tutorial on Sequence-Aware Recommender Systems held at TheWebConf 2019 and ACM
Repository for the tutorial on Sequence-Aware Recommender Systems held at TheWebConf 2019 and ACM RecSys 2018 - GitHub - mquad/sars_tutorial: Repository for the tutorial on Sequence-Aware Recommend...
github.com
https://github.com/mquad/sars_tutorial/blob/master/recommenders/Prod2VecRecommender.py
GitHub - mquad/sars_tutorial: Repository for the tutorial on Sequence-Aware Recommender Systems held at TheWebConf 2019 and ACM
Repository for the tutorial on Sequence-Aware Recommender Systems held at TheWebConf 2019 and ACM RecSys 2018 - GitHub - mquad/sars_tutorial: Repository for the tutorial on Sequence-Aware Recommend...
github.com