해당 포스팅은 Wide & Deep Learning For Reccommender Systems 를 번역하고 주관적인 생각을 약간 섞어 리뷰한 것이다.
개요
비선형 변수 변환을 사용하는 일반화 선형모델은 대규모 회귀분석과 sparse(희소)한 input을 가진 분류문제에 대해 다양하게 사용된다.
- Wide
- Memorize에 효과적이다. (cross-product columns)
- 변수 간 상호작용을 파악하는 것에 효과적이며, 해석가능하다.
- But, 일반화(Generalization)하는데에는 더 많은 feature engineering이 필요하다.
- Deep
- 적은 feature engineering을 사용한다.
- sparse한 input 변수들을 저차원 embedding 시킴으로 변수간의 보이지 않는 조합을 일반화시키는데 유용하다.
- But, user-item간 상호작용이 드물고 순위가 높을 때 과도한 일반화(over-generalize)가 되어 추천할 수 있다.
해당 논문에서는 추천시스템에서 Memorization와 Generalization의 이점을 결합하기 위해 Wide&Deep Learning을 제안한다.
이 논문은 Google Play에서 시스템을 구축하고 평가했다. 데이터 셋은 10억명의 활성 유저와 100만개의 앱이 있다. 결과만 이야기 한다면 Wide 만 사용하는 모델과 Deep 만 사용하는 모델보다 앱 가입을 크게 증가시켰다고 한다.
1. Insroduction
여기서 추천시스템은 검색 순위 시스템으로 볼 수 있다.
- Input
- user의 정보
- 문맥 정보(contextual information)
- Output
- item의 순위 list
- Task
- 검색어를 입력받으면(Given A Query), 데이터 베이스에서 관련된 아이템들을 클릭이나 구매에 기반한 순위에 대한 rank별로 찾아주는 것이다.
일반적인 검색 순위 문제에서는 memorization과 generalization을 둘다 달성하는 것이다. Memorization은 아이템이나 feature간의 동시 발생을 학습하고 historical data에서 사용할 수 있는 상관관계를 활용할 수 있다. Generalization은 상관관계의 이행성(Transitivity)과 한번도 발생하지 않았거나 드물게 발생했던 feature의 조합을 탐색한다.
Memorization에 기반한 추천은 사용자가 이전에 행동한 것에 대해 조금 더 직접적이고 관련이 되어있다. 그에 비해 Generalization은 추천 항목을 다양화 시키는데 영향이 있다.
암기(Memorization)
추천시스템이나 랭킹시스템에서 로지스틱 회귀와같은 일반화선형모델은 간단하고, 확장가능하며, 해석가능하기때문에 널리 사용된다. 이런 모델들은 One-hot-encoding으로 이진화된 변수들에 대해 종종 학습한다. AND 함수와 같은 cross-product transfromation을 사용하여 memorization을 효과적으로 수행할 수 있다. 이는 동시발생이 어떻게 상관관계가 있는지 설명하는데 유용하다. 그러나 memorization의 단점이자 제한적인 사항은 기억은 잘하지만 일반화시키는 것이 어렵다는 것이다. 학습데이터에 나타나지 않은 검색 항목들을 일반화시킬 수 없다는 것이다. 그러면 지루하고 뻔한 추천만 하게 될 가능성이 높다.
일반화(Generalization)
factorization machine이나 딥러닝과 같은 임베딩 기반 모델은 각 항목의 요소에 대한 것들을 저차원으로 embedding 함으로써 이전에 보지 못한 검색항목 등을 일반화 할수 있다는 장점이 있다. 그러나 틈새 품목과같이 크게 어필하지 못하고 희소성이 높은 아이템에 대해 저차원으로 효과적인 학습을 하는 것은 어렵다. 이러한 경우에는 다른 검색항목과는 상관관계가 없어야 하지만 과도하게 일반화되어서 관련 없는 것들을 추천할 수도 있다. 그에 비해 linear 모델은 훨씬 적은 parameter로 "예외 규칙"을 기억할 수 있다.
그래서, Wide & Deep Learning
그래서 해당 논문에서는 일반화선형모델과 Neural Network 모델을 합쳐서 암기와 일반화를 모두 달성한다.
- wide&deep model의 구조는 embedding의 feed-forward 신경망과 sparse한 input이 있는 추천 시스템을 위한 linear model을 공동으로 훈련한다.
- 10억명의 활성 사용자와 백만명 이상의 앱을 보유한 Google Play에서 제작된 Wide & Deep 추천 시스템의 구현 및 평가
- 해당 논문에서는 tensorflow를 사용했다고 하는데
(필자는 추후 pytorch를 사용해볼 생각이다)
Overview
앱스토어에서 하던 추천 시스템의 방식은 위 그림과 같다. user가 검색을 하면, 그에 뜨는 순위별 아이템의 목록들, 그에 user의 클릭 또는 행동 기록들에 따라 log가 저장되고 그 log들을 바탕으로 모델을 학습해서 새로운 순위별 item을 추후에 보여주는 방식이다.
Wide & Deep Learning
1. The Wide Component
- wide component는 일반화선형모델의 형태이다.
- 함수 : ${y = w^T x + b}$
- ${y}$는 예측값, ${x = [x_1, x_2, ..., x_d]}$는 d개의 변수 벡터, ${b}$는 bias
- 해당 set에 들어가야할 변수들은 raw feature도 들어갈 수 있지만, cross-product transformation이 들어가야한다.
- cross-product transformation
- ${\phi_k(x) = \prod_{i = 1}^{d}x_i^{c_{ki}}, c_{ki} \in \{0, 1\}}$
- and조건에 대한 함수값이다.
- ex) netflix를 검색하고 왓차를 검색했는지 여부(하나만 검색했을경우 0, 둘다 검색했을 경우 1)
2. The Deep Component
- feed-forward neural network의 형태
- sparse한 범주형 변수인 경우, 저차원으로 embedding을 실행함.
- 히든레이어 함수 : ${a^{(l + 1)} = f(W^{(l)}a^{(l)} + b^{(l)})}$
- ${l}$ : layer number, ${f}$ : activation function(RELU), ${a}$ : activation, ${b}$ : bias, ${W}$ : model weight
3. Joint Training of Wide & Deep Model
wide component와 deep componeent의 예측값의 log odds값을 가중치를 줘서 합한다. wide & deep model은 독립적인 모델을 합치는 앙상블 모델과는 다르게 학습할 때부터 결합하며 학습하는 joint training을 사용한다.
joint training과 ensemble의 차이점.
- ensemble
- 독립적인 모델의 결과만 결합하여 최종 결과를 산출한다.
- 훈련이 분리되어 있어 각 개별 모델의 정확도를 어느정도 보장해야한다.
- 그러기 위해서는 모델의 크기가 클 수 밖에 없다. (feature가 많음)
- joint training
- 학습을 할 때부터 두개의 컴포넌트가 같은 결과에 대해 동시 학습한다. (loss를 공유하면서 학습한다.)
- wide part가 deep part의 약점만 보완하는 수준으로 들어가기 때문에 많은 feature를 요구하지 않는다.
wide&deep model에서는 mini-batch stochastic optimization(미니배치 확률 최적화)를 이용하여 wide와 deep부분의 gradient를 동시에 역전파하며 수행된다. 해당 논문에서는 wide의 optimizer는 L 1 regularization과 함께 Follow-the-regularized-leader (FTRL) algorithm을 사용하고, deep model에서는 AdaGrad를 사용했다.
최종 결합 모형의 수식은 아래와 같다.
$${P(Y = 1|x) = \sigma(w_{wide}^\T[x, \phi(x)] + w_{deep}^\Ta^{(l_f} + b)}$$
여기서 Y는 이진 값 클래스 레이블이고 는 시그모이드 함수, 는 원래 변수 의 교차곱 변수 변환, 는 편의 항이다. ${w_{wide}}$는 Wide 모형의 모든 가중치 벡터이고 ${w_{deep}}$은 최종 출력 값 에 적용한 가중치이다.
Model Training
해당 논문에서 사용한 모델의 구조는 위와 같다. 범주형변수들 중 차원이 많은 것들을 각각 임베딩하여 1200차원으로 만든 후, 3개의 ReLU층으로 전달하고 마지막으로 로지스틱 출력단위로 전달한다. 샘플의 수 자체가 5억개가 넘다보니, 새로운 훈련 데이터가 수집될 때마다 재학습하는데 시간이 매우 많이 소요된다. 그래서 임배딩과 이전 모델의 선형 모형 가중치를 사요해 웜스타트 시스템을 구현했다.
결론
서비스하는 부분은 실제로 내가 사용하기에는(데이터도 없거니와) 너무 큰 데이터라, 이론적인 부분만 해석해놓았다. ensemble이 아닌 joint training이라는 부분에서 새롭게 알게 되었고, cross product부분으로 변수 간 상호작용을 파악한다는 관점을 알 수 있었다.
그러나 여전히 앱 실적이나 평점을 요하는 것 같아보였는데, 상품의 평점을 매길 만한 데이터가 없어도 성능이 잘 나올지에 대해서 좀 궁금하다.
추후에 kaggle의 instacart_market_basket 데이터로 한번 wide&deep을 설계해보려한다.
해당 논문은 tensorflow지만, pytorch로 구현해보고자 한다.
'Study > etc' 카테고리의 다른 글
[GCP]Google cloud platform 가입하기 (0) | 2021.12.12 |
---|---|
[GCP] google cloud platform에 대하여 (0) | 2021.11.27 |
[용어 정의] CPU, GPU, TPU의 정의 (0) | 2021.06.01 |
[colab] Colab에서 데이터 불러오는 방법 (드라이브 마운트 사용) (0) | 2021.02.18 |
[Trend 용어] 마이데이터(Mydata)란? (0) | 2020.12.29 |