Recommender System/논문 및 블로그 리뷰

[Recommender System] - Wide & Deep Learning for Recommender Systems 리뷰

Yamarae 2018. 8. 24. 13:34

 

추천시스템에서의 SOTA(State of the Art)는 Matrix Completion 계열의 FM, SVD 등의 알고리즘이다. 최신 추천 알고리즘들의 핵심은 변수들의 의미를 나타내는 latent vector를 만들어 내거나, 변수간의 cross-product를 자동화하는 것이다. 구글이 2016년 발표한 Wide & Deep Learning for Recommender Systems는 이러한 알고리즘들의 핵심을 Deep Learning의 관점에서 새롭게 해석한 것이다. 여기에 사람의 기억과 일반화에 대한 모티브를 기술적 아이디어로 추가하여 발표하였다. 이 알고리즘은 선형대수에 대한 깊은 이해가 없어도 일반적인 Deep Learning의 관점에서 쉽게 구현에 접근할 수 있고, 추천 시스템에 한정되어 있지 않다는 점에서 꽤나 인기를 끌고 있다.

 

본 포스팅은 Wide & Deep for Recommender system 논문을 다소 주관적인 해설을 덧붙여서 번역한 것이다.

 

 

 

 


 

 

 

 

[Wide & Deep for Recommender system]

 

논문을 리뷰하기에 앞서, 이 논문은 구글 플레이 앱 추천엔진의 랭킹 알고리즘으로 사용되는 내용이라는 것을 알아야 한다. 우리가 적용하려는 영역, 혹은 연구에서 추천의 대상이 되는 item에 대한 base-pool이 있는 상태를 가정한 논문이라는 것이다. 구글의 경우는 유저의 앱 검색에 대한 검색 query result를 re-ranking 하는 것에 초점이 맞춰진 것이다.

 

 

 

 

 

1) Memorization

 

무언가를 추천해주는 모델이 있다고 할 때, 이를 softmax regression으로 구성한다고 하자. Input feature로 여러 가지 검색 기록이 있고 output으로 실제 주문한 내역이 있다고 할 때, 만약 아디다스 운동화, 나이키 운동화라는 검색어가 많다면 운동화를 구매했을 확률이 높아진다는 시나리오가 존재할 수 있다. 이러한 모델을 wide한 모델이라고 정의한다. 간단하게 말해, 케이스를 학습하는 것이라고 볼 수 있다. regression이 아니라 베이지안 네트워크나 나이브 베이즈 분류기같은 조건부 확률 모델로 대체해도 비슷한 성능을 낼 것이다. 이러한 모델은 기억력은 우수하지만 폭넓은 추천, 즉 높은 serendipity가 나오지 않게 된다. 너무 fit한 결과를 낸다는 것이다.

 

더 자세한 예시로 linear model memorization 학습 시나리오를 만들어보자. 먼저 machine learning을 사용하지 않고, 텍스트 매칭 순으로 검색 결과를 추천해주는 추천 엔진이 있다고 하자. 나는 큰 조각 치킨을 튀겨낸 요리를 찾고싶다. 하지만 “fried chicken”을 검색했을 때 “chicken fried rice”를 첫 번째 결과로 보여주는 불상사가 일어날 수 있다. 이를 linear model로 wide하게 학습시키는 시나리오를 생각해보면 다음과 같다.

 

chicken fried rice에는 벌점을 주고, 큰 치킨 조각이 나오는 chicken and waffle 에는 + 점수를 주는 일반적인 Linear 학습 방법이다. 하지만 이 경우, 치킨 조각만 주구 장창 나오는 지루한 추천이 된다.

 

 

 

 

 

그림 1: wide 모델의 구성(출처 : http://bcho.tistory.com/1187)

 

 

 

2) Generalization

 

이번에는 DNN을 구성하여 모델을 구성해보자. 이 경우 추천에 대한 내용을 네트워크가 일반화하여 학습하는 경향이 있기 때문에, 아디다스 운동화라는 검색어가 많다면 이를 통해 일반화되는 속성(‘운동 용품’이라는 속성)을 기반으로 더 다양하게 상품을 추천해줄수 있다. 이는 기술적으로는 underfit을 의미한다. 하지만 반대로 serendipity를 높여줄 수 있다. 물론 좋은말로는 ‘일반화’이지만, 언더피팅은 결국 정확한 결과를 얻기 힘들다는 단점이 존재한다. 만약 정보가 적고 편향된 성향만을 가지고 있는 유저라면, DNN과 같은 embedding-based model에서는 over-generalized 된 결과가 나올 수 밖에 없다. 반면 그런 유저는 wide한 memorization-based model에서는 좋은 추천이 가능하다.

 

DNN과 같은 일반화 즉 generalization을 지향하는 알고리즘은 결국 linear한 model의 한계를 극복하기 위한 것이었다. 일반적인 logistic regression으로 추천을 해준다고 하면, feature간의 독립성을 가정하고 학습을 진행하게 된다. 예를 들어 브랜드라는 feature와 카테고리라는 feature가 존재하는 regression 상황에서, 두 피처간의 연관성을 피처로써 학습에 반영해주기 위해서는 polynomial 하게 피처를 cross-product로 재구성한 것을 추가해주어야 한다. 하지만 cross-product 방법(피처간의 모든 경우의 수에 대해서 cross-product 하는 것을 데카르트 곱: cartesian product라고 한다)으로 피처간의 연관성, 즉 polynomial로 구성된 내재(latent) 속성을 찾아내는 것은 매우 비효율적이다. 또한 이 방법은 memorization에는 유용하지만 generalization에는 그다지 효율적이지 못하다. 그래서 최신의 추천 알고리즘들은 MF기반의 CF(Collaborative Filtering)혹은 최근 유행하는 FM(Factorization Machine), deep learning 등 cross-product와 같은 기능을 알고리즘 내에서 시행하는 것들이 연구되고 있으며, 실제로 성과를 내고 있다.

 

wide & deep 에서의 generalization 역시 마찬가지이다. wide만을 가지고 generalization을 학습하려면, 어떤 조합의 polynomial을 구성해야 하는지를 분석가가 결정해야 한다. 이것을 피처 엔지니어링이라고 하는데, 어떤 피처는 그대로 사용하고, 어떤 피처는 조합을 해야 하지는지를 결정한다. 만약 차원의 수가 기하급수적으로 증가한다면 사실상 조합의 구성은 거의 불가능에 가깝다. 게다가 cross-product는 train data에 등장하지 않았던 combination이라면 generalization이 제대로 되지도 않는다. wide & deep 에서 deep의 역할은 바로 이러한 역할의 보완책이다. combination(cross-product)의 기능을 하는 무언가(사람이 해석할 수 없는 내재적 관계 의미)를 학습한다.

 

 

 

그림 2: deep 모델의 구성(출처 : http://bcho.tistory.com/1187)

 

 

 

 

wide 모델에서는 분석가의 주관대로 polynomial을 구성하거나, 혹은 cross 없이 memorization에 대한 학습을 진행한다. 그리고 generalization의 철학을 하이브리드한 추천 방법이 바로 wide & deep 이다. 사람이 무언가를 학습할 때 일반화를 기반으로 기억을 덧붙여서 학습하는 예를 생각해보자. ’날개 달린 동물은 난다’ 라는 일반화에 ‘펭귄은 날지 못한다’ 라는 기억을 더하면 ‘날개 달린 동물은 날지만 펭귄은 날지 못한다’ 가 된다. 이는 날개달린 동물 사진에 대한 학습이 잘 된것이고, 타당한 방법으로 보인다.

 

 

 

 

 

3) Wide & Deep components

 

알고리즘의 이름 그대로, 두 가지 학습 component를 결합한 모델이다. wide component는 일반적인 logistic 혹은 softmax regression의 형태이고, cross-product transformation이 추천 모델로는 가장 중요한 부분이라고 할 수 있다.

 

 

 

그림 3: wide & deep 모델의 구성(출처 : http://bcho.tistory.com/1187)

 

 

deep component는 일반적인 DNN이라고 볼 수 있다. 추천 시스템을 적용하려는 도메인에 따라 다르겠지만, 입력 변수가 매우 sparse한 feature라고 가정한다면 일반적으로 embedding된 input layer를 사용해야 한다. DNN의 input layer에 대한 가이드는 O(10) ~ O(100)이라고 논문에 명시되어 있지만, 이 역시 도메인에 따라 다르게 적용되야 할 것이다.

 

두 component를 joint하여 하나의 softmax(logistic) classifier에 feed를 먹이는 구조인데, 달리 말하면 wide 부분의 input + deep 부분의 output을 wide & deep의 input으로 쓰겠다는 것으로도 볼 수 있다. 여기서 주의할 점은 joint training과 ensemble이 정확히 같은 개념이 아니라는 것이다. joint training의 경우 두 컴포넌트가 같은 결과에 대해 동시에 학습되지만, 앙상블 모델은 따로 학습한 뒤 inference 단계에서 예측만 합쳐지는 것이다. 비슷한 아이디어지만 loss를 공유하느냐 공유하지 않느냐의 차이라고도 볼 수 있겠다.

 

앙상블 모델의 경우 각각을 학습하기 위해 모델별로 다른 feature engineering이 필요하다. 이 때문에 전체적으로 보았을때는 훨씬 많은 feature를 요구하게 된다. 반면 joint training은 deep에서의 약점(memorization)을 분석가의 인사이트가 들어간 소수의 cross-producted feature로 메꿔주면 된다. 모델의 성능이 잘 나오지 않았을 시, 한 쪽 부분(wide 부분)만의 feature engineering을 신경쓰면 된다는 것이다.

 

구글은 wide & deep 컴포넌트 학습에 wide 부분에는 SGD의 온라인 버전인 FTRL, deep 부분에는 Adagrad optimizer를 사용했다.

 

 

 


 

 

 

 

4) 정리

 

도메인의 특성이 많이 반영되고, 논문에는 굉장히 일반적인 서술만 나와있기 때문에 feature engineering 파트와 system 파트는 생략하자. 이제 본 논문에서의 related works와 결론 부분을 보겠다. 앞서 말한대로 related works는 cross-product의 한계를 극복하는 것에서부터 출발한다. factorization machine을 그 예로 들었는데, fm의 핵심 아이디어를 wide & deep에서는 deep neural network component로 대체한 것이라 볼 수 있다. 

 

구글은 이 논문의 방식을 통해 추천 성능 향상과 serving latency 감소 효과를 봤지만, 구글의 serving 기술과 모델 학습 능력을 훌륭하게 이식한다고 해도 다른 도메인에서도 좋은 결과가 나올 지는 장담할 수 없을 것 같다. 개인적으로 현재의 SOTA(State Of The Art) 알고리즘은 FM이라고 생각하는데, 이는 구현의 용이성과 도메인 특성에 크게 의존하지 않는 피처 엔지니어링 때문이다. wide & deep은 구글처럼 효과적으로 적용하기 위해서는 피처 엔지니어링과 sparse input vector에 대한 고민이 조금 더 필요할 것 같다.

 

 

 

+ 추가

 

구글에서 제공한 wide and deep tf버전 코드를 keras로 포팅해보았다. 관심 있는 사람은 github 링크 에서 확인하면 된다.