세로형
Recent Posts
Recent Comments
Link
11-22 00:00
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

꿈 많은 사람의 이야기

Python 추천 시스템(Recommeder System) 구현하기 - Wide & Deep learning for Recommender System 본문

추천시스템

Python 추천 시스템(Recommeder System) 구현하기 - Wide & Deep learning for Recommender System

이수진의 블로그 2020. 8. 30. 15:37
반응형
728x170

포스팅 개요

이번 포스팅은 Python으로 구현하는 추천 시스템(Recommender System with Python) 시리즈 중 하나입니다. 그 중 이번 포스팅은 Google Play store에도 적용된 방법인 Wide & Deep Learning for Recommender System 논문을 기준으로 진행합니다.

따라서 본 포스팅에서는 Wide & Deep Learning for RecSys 논문을 간략하게 정리하고 참고한 코드를 보면서 어떻게 추천이 진행되는지 정리하고자 합니다.

해당 추천 시스템 Python 구현 코드는 아래 제 github에 올려두었습니다. (해당 코드는 논문과 100% 일치하지 않음을 말씀드립니다.)

 

lsjsj92/recommender_system_with_Python

recommender system tutorial with Python. Contribute to lsjsj92/recommender_system_with_Python development by creating an account on GitHub.

github.com

 

참고한 자료는 아래와 같습니다.


포스팅 본문

Wide & Deep Learning for Recommender System 리뷰

개요에서 말씀드렸다시피 본 포스팅은 google play에서도 적용되었던 wide & deep learning for recsys 논문을 기준으로 작성됩니다. 따라서 간단하게 해당 논문에서 말하고자 하는 이야기가 무엇인지 정리하고자 합니다.

 

wide & deep RecSys model

해당 논문에서 소개하는 모델 구조는 아래 사진과 같습니다.

해당 모델 구조에서는 다음과 같은 것을 볼 수 있습니다.

  1. Wide Models
  2. Deep Models

Wide & Deep Models는 결국 저 Wide 한 부분과 Deep한 부분을 합쳐놓은 모델입니다. 그러면 여기서 말하는 Wide한 영역과 Deep한 영역은 무엇일까요?

Memorization

  • Model의 Wide한 영역을 담당
  • 주로 feature 관계를 볼 수 있음
    • 상관관계 혹은 item과 feature의 관계 등
    • cross-product feature를 사용
    • 즉, Wide하게 변수간 상호작용을 하는 것!
  • 이미 유저가 실행한 어떤 Action에 대해서 관계가 있음
    • 유저가  A app을 설치했고 B app에 대해 Impression이 있었다 등
    • Sparse 변수에 대해 cross-product feature를 사용해서 A를 설치했고 B에 impression이 있다면 1의 값을 주는 것 등의 변환
      • 즉, 변수 쌍의 동시 발생등으로 target에 어떠한 영향을 미치는지 확인하는 것
  • 단점
    • 나오지 않은 Pair에 대해서 학습하지 못한다
    • 너무 뻔한 추천을 한다

Generalization

  • Model의 Deep한 영역을 담당
  • Memorization과 달리 새로운 feature 조합 등을 통해 다양성을 향상시킴
  • 적은 횟수의 feature engineering을 통해 저차원의 Embedding으로 일반화 할 수 있는 원리를 사용하는것
  • 단점
    • 과도하게 일반화 될 수 있으며 user-item interaction이 Sparse하거나 High-Rank일 때 관련없는 아이템을 추천할 수 있음

 

따라서 저러한 Memorization과 Generalization 영역의 장점을 합쳐서 만든 모델이 바로 이 논문에서 제시한 Wide & Deep learning for recommender system입니다.

 

Overview of the Recommender System

해당 논문에서는 추천 시스템에 대해서 overview를 해주는 그림이 있습니다. 바로 아래와 같은 그림인데요

저는 이 그림에서 다음과 같은 특징을 보았습니다.

  • Youtube 추천 시스템(Youtube Recommender System)과 마찬가지로 여기서도 2-step model을 진행했다
    • 2-step 모델이라는 것은 추천 될 데이터가 너무 많으니 후보자(Candidate)를 뽑고 거기서 Ranking을 매겨 return하는 원리
  • 해당 논문에서는 O(100) items를 어떻게 뽑는지에 대해서는 설명하지 않는다.
  • Ranking에 적용되는 Model에 집중한다.

결국 핵심은 2-step model을 추구한다는 것을 알게 되었습니다.

 

Recommendation System Pipeline overview

해당 논문에서는 추천 시스템을 위한 Pipeline에 대해서도 보여주고 있습니다. 그리고 각 파이프라인 단계에 대해서 설명도 해주고 있죠

해당 부분에서 인상 깊게 보았던 것은

1. 본인들이 어떻게 데이터를 뽑아내었고 어떤 것을 label로 삼았는지 설명을 하는 부분이었습니다. label은 app acquisition입니다. 즉, impressed app was installed 되었으면 1이고 아니면 0입니다. 

그리고 Vocabularies는 categorizal feature의 table mapping이라고 보시면 됩니다. 이렇게 Metadata성 데이터도 함께 관리하면서 추천 시스템에 사용할 feature로 생성하는 것입니다.

2. Joint Training을 했다는 점입니다. 모델 그림을 좀 더 자세히 보시면 아래 그림과 같습니다.

여기서 wide한 영역과 deep한 영역이 나누어져 있으니 당연히 Training 방법이 다르겠죠? 해당 논문에서는 앙상블(Ensemble)과 Joint training의 차이를 설명하면서 우리는 Joint Training을 사용했다는 설명을 하고 있습니다. 그래서 본인들은 Follow the Regularized Leader (FTRL) 알고리즘을 사용했다고 말하면서 Wide 영역에는 L1 regularization을, Deep한 영역에는 AdaGrad 방법을 사용했다고 합니다.

 

논문에 대한 Overview는 여기까지 하겠습니다. 자세한 것은 원 논문을 읽어보시는 것을 추천드립니다. 4장(실질적으로 3장) 뿐이 안되는 짧은 논문이니 금방 읽으실 수 있을겁니다!

 

Python으로 구현된 Wide & Deep Recommender System 구경하기

다음은 이제 해당 논문 내용을 기반으로 Python으로 구현한 코드가 있는데요. 이 코드를 Overview 하면서 보려고합니다. 

full code는 개요에서 말씀드린 제 github에 올려두었습니다. 또한 해당 코드는 100% 논문과 일치하지 않음을 미리 말씀드립니다.

또한, 해당 dataset은 google playstore 데이터 셋이 아님을 밝힙니다. 논문에서 사용한 코드를 단순하게 이렇게 구현할 수 있다~ 라는 취지의 코드이니 꼭 참고해주세요!

해당 코드는 아래와 같은 환경에서 만들어졌습니다.

  • Kears(Tensorflow 2.X 가능)
  • Python 3.5 ~

 

Model Summary

먼저, 해당 코드를 동작시키면 아래와 같은 그림의 모델이 생성되게 됩니다.

 

맨 아래 부분에 또 다른 input이 존재하는데요. 해당 부분이 wide한 영역입니다. 그리고 Embedding과 Flatten을 거치는 부분이 당연히 Deep 영역이겠죠?

그럼 해당 추천 시스템 모델을 구현할 때 입력 데이터 그니까 input data를 어떻게 만드는지 하나씩 참고해보겠습니다.

먼저 데이터가 어떻게 생겼는지 봐야겠죠? 데이터는 categorical feature와 continous feature로 나뉘어져 있습니다. 또한 총 32561개의 데이터가 있으며 총 컬럼은 15개입니다.

여기서 bracket에 추가했냐 안했냐를 넣을 수 있는데요. 이 부분이 Label 값이 됩니다. 

 

간단하게 categorical feature 값들을 숫자로 변경해줍니다. label로 변경해주는 것은 sklearn의 LabelEncoder를 활용합니다.

 

그리고 continuous 데이터는 StandardScaler로 정규화해줍니다.

 

이제 wide 영역에 넣도록 categorical feature를 Polynormial로 변경해줍니다.

이렇게 변경해주는 이유는 비선형적인 설정으로 선형 회귀를 확장시키는 방법이라고 합니다. 즉 다항성 함수로 바꿔줘서 선형 회귀를 확장시키는 것이라고 하네요.

 

이제 모델 설계 부분입니다. 모델 설계는 wide한 영역과 deep한 영역 2개가 존재하기 때문에 2개를 만들어야합니다.

  • Deep한 영역
    • category input과 continuous한 데이터가 들어옵니다.
    • input -> Embedding -> Flatten 구조를 가지고 있습니다.
    • Activation Function은 Relu를 사용합니다.
    • category와 continous 데이터를 합친 뒤에는 Fully Connected Layer(Dense)와 Relu로 층을 쌓아줍니다.
  • Wide한 영역
    • Polynomial한 데이터가 들어옵니다.
    • 그냥 input만 존재합니다.

 

그리고 모델을 훈련하고 평가를 합니다. 

 

대략 결과 metric은 84%가 나오는 것을 확인할 수 있습니다.


마무리

이번 포스팅은 Wide & Deep Learning for Recommender System 논문을 간단하게 Overview하고 Python으로 코드도 구현해보았습니다. 물론 코드가 100% 일치하는 것은 아니지만, 대략 저렇게 흘러가고 저렇게 구현했구나~ 라는 감을 얻을 수 있습니다.

다음에 더 정확한 코드를 찾아서 그것에 따른 포스팅을 올려보고싶네요

 

읽어주셔서 감사합니다

반응형
그리드형
Comments