Link
10-22 07:20
«   2020/10   »
        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 31
Archives
Today
272
Total
1,079,402
관리 메뉴

꿈 많은 사람의 이야기

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

deep learning(딥러닝)

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

이수진의 블로그 이수진의 블로그 2020. 8. 30. 15:37

포스팅 개요

이번 포스팅은 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% 일치하는 것은 아니지만, 대략 저렇게 흘러가고 저렇게 구현했구나~ 라는 감을 얻을 수 있습니다.

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

 

읽어주셔서 감사합니다

6 Comments
  • 프로필사진 조명근 2020.09.19 17:52 안녕하세요.
    제가 딥러닝에 처음 입문하게 되었는데, 추천 시스템에 관심이 있어서 이 글을 보게 되었습니다.
    궁금한 점이 있어서 글을 남기게 되었습니다.
    혹시 여기 있는 코드는 입력이 사람에 대한 정보인거 같은데 출력은 무엇인가요..?
    입력을 사람에 대한 정보를 넣었을때 추천시스템이라면 무엇을 추천해주어야 하는거 같은데 84%의 정확도가 무엇을 의미하는 것인지
    그리고 무엇을 추천하는 시스템인지 궁금합니다.
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.09.19 21:37 신고 안녕하세요.
    일단 해당 논문을 읽어보시는 것을 추천드립니다.

    사람에 대한 입력 정보보단
    사용자의 implict data를 사용했다고 하는 것이 더 정확할 것 같습니다.
    또한, 해당 논문은 google playstore에 적용된 추천 시스템입니다. 그럼 사용자가 '설치할 만한 app을 추천' 하겠죵? ㅎㅎ

    그리고 그 추천할 만한 요소를 해주는 것이 84% 정확도라는 것입니다.
  • 프로필사진 조명근 2020.09.20 01:07 제가 이해를 잘 못해서요,,

    논문에서는 google playstore에 적용했는데, 위 코드에서는 사용자의 implicit data를 입력으로 사용했잖아요. 그리고 Income_bracket이 <=50K 일때랑 >50K 일때 각각 label을 0, 1로 표시해주고요.

    모델 훈련을 할때에는 input_data와 y_train 즉, 위에서 말한 label을 이용해서 훈련을 하고, 평가할때에는 eval_input_data와 y_test(test label)를 이용해서 평가를 했습니다.
    여기서 평가라는 것이 입력으로 사용자의 implicit data가 들어왔을때 label을 맞추는 것을 말하는 것입니까?
    즉, 데이터가 들어왔을때 컴퓨터가 판단해서 이 데이터가 label 0 또는 1로 판단하고, 그것이 실제로 정답과 맞을 확률이 84%라는 것인가요?
    이게 맞다면 여기서 말하는 추천 시스템이라는 것이 사용자의 implicit data가 label 0이 될지 1이 될지를 알려준다는 의미인가요? 이런 의미로 추천이라고 하는건가요?

    음.. 제가 받아들이기에는 추천이 아닌 한 사람이 50k 이상을 벌었는지 예측하는 작업이라는 생각이 듭니다,,

    하드웨어쪽만 공부하다가 딥러닝을 처음 해봐서 너무 어렵네요 ㅜ
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.09.20 17:39 신고 아 일단은 논문에서 사용한 dataset과 여기서 사용한 dataset이 다르다는 것을 아셔야 할 것 같습니다!

    해당 코드는 논문에서 나온 아이디어를 구현한 것이고 (이것도 100% 똑같지 않습니다) 데이터 셋 또한 그냥 오픈된 데이터 셋을 사용한 것입니다. google playstore dataset이 아니라는 거죠.

    평가라는 것은 X라는 input이 들어왔을 때 y를 예측하는 것입니다. 즉, [x1, x2, x3]와 같은 data가 들어갔을 때 모델이 예측한 0, 1 predict label값이 실제 데이터 label 값과 일치하냐는 것을 뜻합니다.

    명근님께서 이해하신 "데이터가 들어왔을때 컴퓨터가 판단해서 이 데이터가 label 0 또는 1로 판단하고, 그것이 실제로 정답과 맞을 확률이 84%라는 것인가요?" 이 부분이 맞습니다.

    즉, 만약에 현재 dataset이 실제 google playstore data였으면 0이면 사용자가 설치하지 않았을 것, 1이면 설치했을 것을 알려주는 것이죠!

    하지만 여기 데이터 셋에서는 그런 의미는 아니기 때문에 헷갈리신 것 같습니다!

    해당 데이터 셋에서는 명근님이 생각하신 50k 이상을 벌었다, 아니다를 예측하는 것이 맞습니다.

    이 부분을 저도 다시보니까 충분히 혼동할 만한 요소가 되게요. 시간 날 때 수정해야겠습니다. 감사합니다.
  • 프로필사진 조명근 2020.09.20 22:06 답변 주셔서 감사합니다 ㅠㅠ

    덕분에 궁금한 것도 해결되고 논문과 코드 이해하는데 큰 도움이 되었습니다. 감사합니다.
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.09.21 09:24 신고 넵 도움되셨길 바랍니다.
    더 궁금한 것 있으시면 편하게 남겨주세요!
댓글쓰기 폼