추천 시스템

콘텐츠 기반 필터링 추천 시스템 - Word2Vec

pasongsongeggtak 2021. 7. 14. 14:24

1. 통계 기반 방법의 단점

2. 추론 기반 방법 - Word2Vec

  1) CBOW

  2) SKIP GRAM

3. 예시

4. 콘텐츠 기반 모델의 장, 단점


1. 통계 기반 방법의 단점

  앞서 살펴본 TF-IDF를 이용한 방식은 통계 기반 방법이다. 통계 기반 방식을 이용할 경우 다음과 같은 문제점이 발생한다.

1) 대규모 말뭉치를 다룰 때, 메모리 상의 문제가 발생

- 높은 차원을 가지게 되고, 매우 sparse한 matrix한 형태를 띠게 됨

- ex) 100만 개의 문서를 다루는 경우, 100만 개의 문서에 등장한 모든 단어를 추출해야한다. 이 때 1개의 문서 당 새로운 단어가 10개라고 가정하면, 1000만 개의 말뭉치가 형성된다. 즉, (100만, 1000만) 크기의 matrix가 만들어진다.  

2) 한 번에 학습 데이터 전체를 다룸

- 데이터가 크면 처리하기가 어렵다.

- GPU 같은 병렬처리를 기대하기 힘들다. 

3) 학습을 통한 개선이 어려움 


2. 추론 기반 방법 - Word2Vec

- 추론: 주변 단어(맥락)이 주어졌을 때, 중심단어를 추측하는 작업이다. 예를 들어, you ____ goodbye and I say hello. 라는 문장이 있을 때, you와 goodbye를 보고 ____에 들어갈 단어를 추측한다. 모델은 말뭉치 후보군 {you, say, goodbye, and I, hello, ...} 에서 하나를 예측을 하고, 학습을 통해서 점점 모델을 개선한다.

 

- Word2Vec: a shallow, two-layer neural network

  단어 간의 유사도를 반영해 단어를 벡터로 바꿔주는 임베딩 방법론이다. one-hot 벡터 형태의 sparse matrix가 가지는 단점을 해소하고자 저차원의 공간에 벡터로 맵핑하는 것이 특징이다. "비슷한 위치에 등장하는 단어들은 비슷한 의미를 가진다"라는 가정을 통해서 학습을 진행한다. 저차원에 학습된 단어의 의미를 분산해 표현하기 때문에 단어 간의 유사도를 계산할 수 있다.

 

  추천 시스템에서는 단어를 구매 상품으로 바꿔서 구매한 패턴에 Word2Vec을 적용해 비슷한 상품을 찾을 수 있다.

 

- Word2Vec의 대표적인 모델로는 CBOW, Skip-gram이 있다. 일반적으로 CBOW보다는 Skip-gram이 성능이 더 좋기 때문에 Skip-gram을 많이 사용한다고 한다. 

 

1) CBOW

- 주변 단어들을 가지고 중간 단어를 예측하는 방법

  - 주변 단어: you, goodbye

  - 중심 단어: ? → say가 예측 되길 원함

  - window: 주변을 몇 칸까지 볼 것인가

    ex) window의 크기가 2인 경우: you, goodbye, and를 통해 ? 예측

 

 

[알고리즘]

① One-hot vector 형태의 입력값을 받는다.

   - you → (say) 예측, goodbye → (say) 예측을 원함

     - 주변 단어: you, goodbye

     - 중심 단어: say

     - window: 1 

② One-hot vector 형태의 입력값을 $W_{in}$과 곱함

   - 초기 Weight($W_in$)는 랜덤값으로 정해짐, 차원 크기도 사용자가 선정

③ Hidden state의 값을 $W_{out}$과 곱해서 score를 추출한다.

④ score로 Softmax loss를 계산한다.

⑤ ④에서 계산한 loss를 가지고 Backpropagation 과정을 진행하면서 weight를 업데이트한다.

   - ${W_{in}}_{new} = W_{in} - \lambda {dw}_{in}$

   - ${W_{out}}_{new} = W_{out} - \lambda  {dw}_{out}$

   - $\lambda$: learning rate

⑥ 위의 과정을 다른 문맥에서도 수행

CBOW 짜다가 하루가 날라갔다.... 근데 실패했다....ㅠㅠ.. 담에 다시 짜봐야지..

 

2) Skip-gram

- 중간에 있는 단어를 가지고 주변 단어를 예측하는 방법

 

[알고리즘]

① One-hot vector 형태의 입력값을 받는다.

② One-hot vector 형태의 입력값을 $W_{in}$과 곱함

   - 초기 Weight($W_{in}$)는 랜덤값으로 정해짐, 차원 크기도 사용자가 선정

③ Hidden state의 값을 $W_{out}$과 곱해서 score를 추출한다.

④ score로 Softmax loss를 계산한다.

   - Pred: [[0.1127 0.0112 0.5074 0.0046 0.0084 0.01 0.3457]]

   - Ans: [1, 0, 1, 0, 0, 0, 0]

   - 한번에 업데이트 진행

⑤ ④에서 계산한 loss를 가지고 Backpropagation 과정을 진행하면서 weight를 업데이트한다.

   - 두 개의 answer에 대해서 오차를 더함

   - $W_{out}$에 대한 Backprop값 계산

   - $W_{in}$에 대한 Backprop값 계산

   - $W_{in}$에 대해서 Update 진행

   - $W_{out}$에 대해서 Update 진행

⑥ 위의 과정을 다른 문맥에서도 수행

 


3. 예시

  gensim 패키지의 Word2Vec을 이용

import pandas as pd
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
import gensim
import warnings
warnings.filterwarnings(action='ignore')
# ratings.csv파일 open
movie = pd.read_csv('ratings.csv', low_memory = False)
movie.head(2)

 

# 개봉한지 얼마안된 순서로 정렬
movie_df = movie.sort_values(by='timestamp', ascending=True).reset_index()
movie_df.head()

# 영화의 metadata를 불러와서 movie_id에 맞는 title를 구해줌
movie_info = pd.read_csv('movies_metadata.csv', low_memory = False)

# metadata에서 id column을 movieId로 바꿔줌
movie_info = movie_info.rename(columns = {'id': 'movieId'})

# string화
movie_df['movieId'] = movie_df['movieId'].astype(str)
movie_info['movieId'] = movie_info['movieId'].astype(str)

# left join
movie_df = pd.merge(movie_df, movie_info[['movieId', 'original_title']], how = 'left', on = 'movieId')

 

# 결측치 처리
movie_df = movie_df[movie_df['original_title'].notnull()].reset_index(drop=True)

# userId로 group화 진행
agg = movie_df.groupby(['userId'])['original_title'].agg({'unique'})
agg.head()

 

- 사용자가 시청한 영화 하나하나를 단어로 보고 영화 간의 유사도 계산

# int형식은 Word2Vec에서 학습이 안되어 String으로 변경함 (300같은 영화때문에 진행)
sentence = []
for user_sentence in agg['unique'].values:
    sentence.append(list(map(str, user_sentence)))

 

# Word2vec의 학습을 진행
# sg가 1인 경우: Skip-gram, sg가 0인 경우: CBOW

from gensim.models import Word2Vec

embedding_model = Word2Vec(sentence, vector_size=20, window=5, min_count=1, workers=4, epochs=200, sg=1)
# 300과 유사한 영화
embedding_model.wv.most_similar(positive=['300'], topn=10)


4. 콘텐츠 기반 모델의 장, 단점

- 장점

  - 협업필터링은 다른 사용자들의 평점이 필요한 반면에, 콘텐츠 기반 모델은 자신의 평점만을 가지고 추천시스템을 만들 수 있음

  - item의 feature를 통해서 추천을 하기에 추천이 된 이유를 설명하기 용이함

  - 사용자가 평점을 매기지 않은 새로운 item이 들어올 경우에도 추천이 가능함

 

- 단점

  - item의 feature를 통해 추천을 하기 때문에 제대로 feature를 추출하지 못하면 정확도가 낮음. 분석 시, Domain Knowledge가 필요할 수 있음 

  - 기존의 item과 유사한 item 위주로만 추천하기에 새로운 장르의 item을 추천하기 어려움

  - 새로운 사용자에 대해서 충분한 평점이 쌓이기 전까지는 추천하기 힘듦