본문 바로가기

Paper

[논문] Session-based recommendations with RNN

session-based recommendation

같은 유저라도 서로 다른 세션 활동을 가지므로, 이를 독립적으로 보고 유저가 아닌 세션 이벤트 기준으로 모델링.

유저 정보를 사용하지 않으므로 비교적 단순하다. 추천 시스템은 MF와 같은 latent matrix를 사용한 모델과 유사도 기반 모델이 있다. session-based recommendation은 후자를 사용한다. one-to-one RNN : t 시점 이벤트(세션), 다음에 어떤 이벤트(세션)가 올지 예측

*session data

{
    "hit_number": 1,
    "elapsed_time": 0.0,
    "page_type": "PAGE",
    "page_path": "/main/1",
    "page_event_info": null
},
{
    "hit_number": 2,
    "elapsed_time": 0.067,
    "page_type": "PAGE",
    "page_path": "/main/2",
    "page_event_info": null
},
{
    "hit_number": 3,
    "elapsed_time": 1.315,
    "page_type": "EVENT",
    "page_path": "/search/",
    "page_event_info":
    {
        "eventCategory": "Shrek",
        "eventAction": "search",
        "eventLabel": "movie",
        "eventValue": null
    }

 

 

Recommendations with RNNs

이벤트 : 세션 안에 기본 단위, 주로 클릭

이벤트를 원핫인코딩해서 GRU에 인풋 -> 다음에 나올 이벤트 확률(score)

병렬 연산을 위해 한 시점에 대한 여러 세션 아이템을 하나의 배치로 인풋을 준다. 배치 크기가 정해지면 아래 그림처럼 부족한 부분을 자동으로 채운다(Mini-batch3). 학습은 one-to-one GRU를 사용하고 [1,1 2,1 3,1] -> [1,2 2,2 3,2]로 배치만큼 한 번 학습하고 히든 state를 다음으로 넘겨준다. 이 hidden은 session sequence가 끝날 때마다 초기화한다.  결국 RNN에서 one-to-one과 many-to-many의 차이는 hidden을 언제 끊어줄 것 인가인데, 여기서는 가변적인 session 길이를 받기 위해 one-to-one으로 학습하고, hidden을 끊어주는 타이밍을 지정해준 것이다.

N(# of sessions) X M(# of items) 만큼의 연산량이 필요하므로 이를 popularity-based sampling을 해서 subset에 대해 계산을 수행해 cost 효율을 높인다.

 

Ranking loss

r_j: neg ranking 

r_i: pos ranking

negative sample보다 positive sample 랭킹 점수를 더 높게 하는 loss, 위 수식을 보면 앞에 텀은 pos ranking score 값이 neg보다 클수록 loss를 줄이는 방향으로 학습하고, 뒤에 텀은 negative sample에 대해 penalize를 준다.

 


reference

arxiv.org/pdf/1511.06939.pdf