맥락 기반(Context-aware) 추천 시스템은 어떻게 만드는가?


행렬 분해(Matrix Factorization)를 이용한 추천 시스템

추천시스템을 설계하는 방법은 세상에 존재하는 추천시스템의 숫자만큼이나 많습니다. 각 시스템마다 데이터 특성이 다르기 때문이죠. 하지만 모든 추천시스템에 반드시 필요한 작업을 하나만 꼽으라면, 상품 간에 순위(ranking)를 매기는 것이라고 할 수 있습니다. 유저의 상품 선호도를 점수화해서 1등부터 꼴등까지 쫙 뽑은 다음 랭킹을 매기고, 아래와 같이 랭킹이 높은 순으로 상품들을 보여주는 거죠.

유저의 상품 선호도 점수를 뽑아내는 방법은 여러가지가 있지만, Netflix Challenge 이래로는 Matrix Factorization 계열이 주류였다고 볼 수 있습니다. 최근에는 딥러닝 계열 방법들이 주목을 받고 있지만, 노이즈에 대한 강건성(robustness)이나 스피드 측면에서 Matrix Factorization 방법론들은 여전히 매력적입니다.


[그림 1. 간단한 Matrix Factorization 모델]

그림 1은 가장 단순한 Matrix Factorization 모델을 추천에 사용한다고 했을 때 input-output 구조를 표현한 것입니다. 추천 대상이 되는 유저 U의 ID와 추천할 수 있는 상품 A의 ID를 모델에 집어넣으면, 유저 U가 상품 A를 얼마나 좋아할 것 같은지를 점수화해서 예측해줍니다. 이 점수는 상품에 대한 사용자들의 별점(rating)을 의미할 수도 있고, 아니면 추상적인 상품 선호도(item preference)가 될 수도 있습니다. 이러한 Matrix Factorization 모델에서 유저 u의 상품 i에 대한 선호도는 다음과 같이 많이 씁니다.



여기서 는 유저와 상품을 k차원 벡터로 표현한 것입니다. 필요한 경우 다음과 같이 유저별 bias같은 정보를 더 추가할 수도 있습니다.



특히 상품에 대한 별점을 예측하는 경우에는 유저마다 점수를 후하게/박하게 주는 정도가 다르기 때문에 bias는 거의 필수입니다. 위 모델의 학습 과정이나 보다 확장된 모델의 형태 등이 궁금하시면 Koren이 쓴 Matrix Factorization에 대한 article을 읽어보시는걸 추천드립니다.

맥락 기반(Context-aware) 추천 시스템

그런데 위에서 보여드린 Matrix Factorization 모델에는 큰 문제가 하나 있습니다. 특정 유저가 특정 상품과 상호작용(클릭, 구매, 별점 매김)한 (유저, 상품, 선호도) 꼴의 triplet 데이터가 엄청 많이 필요하다는 점이죠. 그런데 대부분의 추천시스템에서는 유저가 구매하거나 볼 수 있는 상품 수가 전체 상품 숫자에 비교하면 굉장히 적습니다.

교보문고에 올라와있는 모든 책 중에서 책을 한권 고른다고 상상해보죠. 대부분의 사람들은 시스템이 추천해준 책 리스트에서 상위 몇개만 보고 고르지, 그 외의 책들은 잘 살펴보지 않습니다. 전체적으로 1000권 중에 1권 꼴로라도 유저가 살펴봤다고 해도 굉장히 많이 본 편이겠죠. 이런 문제를 보통 data sparsity 문제라고 부릅니다. 유저와 상품을 아래와 같이 행렬 형태로 나타냈을 때 행렬의 대부분이 비어있고 극소수의 유저-상품 조합에만 선호도 정보가 주어지는 희소 행렬(sparse matrix)의 모습을 띄기 때문이죠.

(책 별점) 초격차 뼈있는 아무말 대잔치 기업과 경영의 역사 한 문장으로 시작하는 경제학 수업 핫트렌드 2019 어나더 라이프
철수 5 ? 2 ? ?
영희 ? 3 ? ? ?
맹구 ? 4 4 ? ?
[표 1. 행이 유저 ID, 열이 상품 ID를 나타내는 상품 선호도 행렬]

사실 Matrix Factorization은 이런 data sparsity 문제를 해결하기 위해 등장한 모델입니다. 적은 데이터지만 그래도 뭐라도 짜내어보겠다고 하는 노력의 일환이라고 볼 수 있죠...ㅠㅠ 하지만 없는 걸 억지로 짜내는 데도 한계가 있습니다. 종잣돈이 적으면 재테크해도 소용없는 거랑 똑같습니다. 더 확실한 해결책은 유저 ID랑 상품 ID 말고 다른 정보를 추가해서, 정보가 있는 곳([표 1]에서 ?가 아닌 곳)에서 엑기스를 최대한 더 뽑는겁니다.


[그림 2. item 이외의 context 정보가 추가된 2nd-order 모델]

맛집 추천 시스템을 예로 들어보겠습니다. 철수라는 유저가 수입 맥주를 참 좋아한다고 가정해보죠.  단순하게 Matrix Factorization을 사용한다면 철수가 바에 갔던 기록이 많이 있는 경우 낮이고 밤이고 철수에게 바를 추천해주게 됩니다. 철수가 어지간한 주당이 아닌 이상 보통 낮에 추천을 해주면 사양을 하겠죠. 차라리 근처에 어디 유명한 카페를 추천해주는게 나을겁니다. 하지만 밤이 되면 상황이 180도 바뀌죠. 맥주 매니아인데다가 밤이기까지 하니, 유명한 바를 추천해주면 철수는 매우 기뻐할겁니다. 이렇듯 기존에 고려했던 유저-상품 간의 상호작용 뿐만 아니라, 시간-상품간의 상호작용까지 고려하면 보다 적은 데이터로도 추천의 질을 높일 수 있습니다. 이런 모델을 수식으로 표현하면 아래와 같이 됩니다.



이렇게 시간이나 장소처럼 유저나 상품 자체에 대한 정보는 아니지만, 추천에 영향을 미칠 수 있는 정보를 맥락(context) 정보라고 부릅니다. 맥락 정보가 중요할 수 있는 환경이라면 데이터의 절대량이 좀 적더라도 괜찮은 추천 시스템을 만들 여지가 있는거죠. 위에서 보여드린 장소 추천 시스템이 이런 맥락 정보에 특히 민감한 편입니다. 최근(2016년)에 인공지능 학회인 AAAI에 등장한 STELLAR 모델이 좋은 예시 중 하나이니 참고하시면 좋을 것 같네요.

일반화된 맥락 기반 추천 시스템

조금 더 논의를 확장해보겠습니다. 맥락 정보에 다른 걸 더 섞는 경우에는 모델을 어떻게 만들면 좋을까요? 예를 들어 상품의 다양한 메타정보(카테고리, 가격, 판매자)라든가, 해당 상품을 대표하는 키워드나 태그 같은 상품의 내용과 관련있는 정보들을 쓴다면 유용하겠죠? 유저의 성별이나 나이, 직업 같은 정보도 중요할 수 있을겁니다. 맥락도 시간/장소 외에 접속한 기기, 이전에 봤던 상품 등등 다양한 경우의 수가 있겠죠. 맥락 정보와 유저/상품 정보가 혼돈의 카오스인 상황에서, 모든 정보를 전부 때려넣으면 알아서 결과를 뽑도록 만들 수는 없을까요?

Matrix Factorization의 앙상블(Ensemble)


[그림 3. 일반화된 2-way interaction 모델]

간단한 방법 중 하나는 [그림 3]처럼 feature들을 2개씩 조합하여 2-way interaction을 계산하는 Matrix Factorization 모델을 따로따로 만들고, 나중에 Ensemble을 이용해서 합치는 겁니다. 단순히 weighted sum을 사용할 수도 있고, 각 sub-model들을 nonlinear하게 조합할 수 있는 트리 기반 앙상블(e.g. Random Forest, Boosting) 같은걸 사용해도 됩니다.

Factorization Machine

두번째 방법은 이 목적으로 특수 제작된 Factorization Machine이라는 모델을 사용하는 것입니다. 1st-order 효과가 추가되어 식이 약간은 다르지만(원래 논문의 Section III-A 참조), 기본적으로는 위에서 언급한 앙상블식 접근과 동일하게 feature들을 2개씩 전부 조합해서 2-way interaction들을 계산한 뒤에 합치는 방식입니다. 차이는 sub-model들이 상호의존적으로 한번에 학습이 된다는 점과, 필요에 따라서는 3개 이상의 factor들을 조합하여 d-way(d>=3) interaction도 계산하도록 확장할 수 있다는 점입니다. Factorization Machine 모델의 고안자인 Rendle이 Factorization Machine을 맥락 기반 추천에 구체적으로 어떻게 사용할지를 논문으로 다룬 적이 있으니 참고하시면 좋을 것 같네요.

딥러닝(Deep Learning) 기반의 d-way interaction 모델


[그림 4. DNN을 이용한 맥락 기반 추천 모델]

Factorization Machine도 d-way interaction을 측정할 수 있기는 하지만, 텐서 분해(tensor decomposition)형태로 표현되는 d-way interaction만 측정하기 때문에(원래 논문 Section III-D 참조) 한계가 있을 수도 있습니다. 이 경우 [그림 4]와 같이 DNN을 이용해서 linear transformation 형태의 d-way interaction을 학습해보는 것도 방법이겠죠.

만약 pretrained embedding을 써야한다든가 등의 이유로 각 feature들의 embedding dimension이 달라야만 한다면, 억지로 dimension을 끼워맞춘 후에 2-way factorization 기반 모델들을 쓰기보다는 feature vector들을 쭉 이어붙인 다음 DNN에 집어넣는게 더 합리적일 수도 있습니다.([그림 5] 참조) 특히 content-based filtering 면에서 중요한 이미지/자연어 처리에서 최근 pretrained model과 embedding이 광범위하게 쓰이고 있기 때문에, pretrained 모델과 맥락 정보를 손쉽게 결합할 수 있는 DNN 기반의 d-way interaction 모델은 꽤 유용하다고 할 수 있겠죠.

[그림 6. word2vec과 맥락 정보를 FCN으로 합치기]

한편, 임의의 길이의 feature vector들을 손쉽게 결합할 수 있다는 건 feature별로 적절한 sub-network들을 정의해서 feature vector들을 뽑아내도 된다는 걸 의미하기도 합니다. 따라서 sequential/spatial feature같이 특정한 형태(e.g. RNN/CNN)의 네트워크와 상성이 좋은 feature들이 있다면, feature별로 domain-specific 네트워크를 사용하는 거대한 네트워크를 정의해서 한번에 추천 모델을 학습하는 것도 가능합니다.

[그림 6. subnetwork를 사용한 딥러닝 기반 추천 모델]

[그림 6]을 보시면 직전에 클릭했던 책이 무엇인지가 맥락 정보로 반영되어 있는 걸 아실 수가 있습니다. 이렇게 temporal한 특성이 있는 맥락은 RNN으로 처리하면 좋죠.(세션 기반 추천 알고리즘들이 이 정보를 주로 사용합니다.) 책의 제목은 적절한 NLP 모델으로 인코딩되고 있고, 유저 ID와 책 ID는 factorization 계열 모델처럼 단순하게 임베딩된 후에 RNN이 뽑아낸 맥락 정보와 섞이고 있습니다. 결과적으로는 그냥 이 모든 정보를 다 이어붙여서 FCN에 때려박는 형태가 되기 때문에 쓰기 매우 간편하죠.

DNN > factorization ???

지금까지 여러가지 맥락 기반 추천의 방법론들을 알아보았습니다. 그런데 여기서 의문점 중 하나는 DNN 기반 접근과 factorization 기반 접근의 관계입니다. 만일 DNN이 factorization 기반 모델을 포함하거나 최소한 모방이라도 할 수 있다면, 세간에서 말하는 "이도 저도 다 안되면 딥러닝" 식의 해결책에 이론적인 백그라운드가 생기는 셈입니다. 하지만 그렇지 않다면, 서로 상호 보완적인 요소가 있는 것이 되기 때문에 최선의 모델을 만드려면 딥러닝과 factorization 기반 방법들을 섞어야 한다고 결론지을 수 있습니다. 다음에 기회가 되면 이 부분에 대해서도 한번 다뤄보도록 하겠습니다.

Comments

  1. 안녕하세요 추천엔진에 관심 많은 engineer를 찾고 있는데 혹시 잠깐 얘기할 수 있을까요?

    ReplyDelete

Post a Comment

Popular posts from this blog

유튜브 추천시스템 논문 리뷰 Part 2 - Deep Neural Networks for YouTube Recommendations (RecSys 2016)

유튜브 추천시스템 논문 리뷰 Part 1 - The Youtube Video Recommendation System (RecSys 2010)