사용자가 사용한 상품을 기반으로 아직 구입하지 않은 상품의 선호도를 추론하여 선호도가 높은 상품을 추천하는 것
Content-based : 상품을 기반으로, 내가 사용한 상품과 비슷한 걸 추천해주는 것
Collaborative : 협업, 나랑 취향이 유사한 다른 user가 좋아했던 걸 기반으로 추천해주는 것
Content-based Filtering
실제로 사용자가 평가했던 상품과 유사한 상품을 추천
UserA가 좋아한 MovieA를 보면 장르가 Love; Romantic인 것을 볼 수 있다. UserA가 좋아한 영화의 장르와 같은 장르인 MovieC를 userA에게 추천해준다. 이처럼 user가 좋아하는 "상품"을 기반으로 추천해주는 것을 Content-based라고 한다.
Heuristic한 방법!
Input으로는 사용자의 정보를 나타내는 User profiles, 상품 정보를 나타내는 Item profiles를 사용한다.
User profiles는 사용자가 지금까지 어떤 영화를 좋아했는지 정보를 담고 있고, item profiles는 사용자가 좋아한 영화에 대한 정보를 담고 있다.
각 영화끼리의 유사도를 계산하기 위해 TF-IDF를 사용한다. 해당 영화에서 각 keyword가 가지는 중요도를 계산한다. 예를 들어 전체 장르가 [Romantic, Thriller, Horror, Fantasy]라고 할 때 해당 영화의 장르 자리에만 [1, 0, 0, 0] 과 같은 형식으로 input을 vector 형태로 변환한다.
사용자 정보를 나타내는 User profiles는 Document로 정의한다. user profile에서 TF-IDF는 사용자가 평가했던 모든 상품들의 TF-IDF 값 평균으로 계산한다. 예를 들어 사용자가 영화A, B, C를 봤을 때 해당 영화의 장르가 [1, 1, 0, 0], [1, 0, 0, 1], [0, 1, 1, 1]이면 이 3개 영화에 대한 벡터를 평균 낸 [2/3, 2/3, 1/3, 2/3] 등으로 나타낸다.
유사도를 계산하는 척도로는 Cosine Similarity, Pearson Correlation Coefficient 등이 있다.
Content-based Filtering의 한계
이미지는 vector로 표현할 수 없다는 한계가 있다. 이미지로 표현된 상품의 경우에는 profile을 정의할 수 없고, 따라서 추천시스템은 nlp 분야랑 더 밀접하다.
Overspecialization의 문제가 있다. 이미 봤던, 사용했던 상품과 유사한 상품만 추천된다. 오버피팅과 같은 개념인데, 취향이 확고한 사람에게는 이게 한계점이라고 느껴지지 않을 수도 있다.
New User Problem. user vector를 만들려면 해당 user가 이전에 상품을 평가한 데이터를 가지고 있어야 하는데, 새로 유입된 user라면 아무런 데이터도 갖고 있지 않아 어떠한 상품도 추천할 수 없는 문제가 생긴다. 넷플릭스나 왓챠같은 경우에도 처음 가입한 사용자에게 이전에 봤던 영화나 드라마에 대한 평점을 매기라고 시키는 것도 이 문제 때문이다.
Collaborative Filtering
사용자가 평가한 아이템의 평점을 기반으로, 해당 사용자와 비슷한 취향을 가진 이웃을 찾아 그들이 선호한 상품을 추천해준다. 나와 취향이 유사한 사람을 찾고, 그 사람이 좋아했던 걸 조합해서 나한테 추천해준다.
사진에서는 user1이 좋아하는 게 a, b, c, d이고 그와 비슷한 취향을 가진 user2, 3, 4가 존재한다. 이 때 다른 user들과 1 사이의 유사도를 계산하는데 이때 사용자의 관점과 상품의 관점에서 유사도를 계산할 수 있다.
Heuristic한 방법!
앞서 말한 사용자 관점과 상품 관점을 볼 수 있다.
User-based Collaborative Filtering : 유사한 취향을 가진 이웃을 사용자 관점에서 찾는 방법
Item-based Collaborative Filtering : 유사한 취향을 가진 이웃을 상품 관점에서 찾는 방법 -> 더 많이 사용
왼쪽은 사용자 관점, 오른쪽은 상품의 관점에서 이웃을 찾는다.
사용자 관점의 경우 1번이 [포도, 딸기, 수박, 오렌지]를 좋아하고 2번이 [딸기]를 좋아하고 3번이 [딸기, 수박]을 좋아한다. 이 때 3번과 1번이 유사한 취향을 가진다고 판단할 수 있고 따라서 3번에게 1번이 좋아하는 [포도, 오렌지]를 추천해주게 된다.
상품 관점의 경우 사용자 관점보다 조금 더 복잡하다. 포도를 좋아하는 사람은 [1번, 2번], 딸기를 좋아하는 사람은 없고 수박을 좋아하는 사람은 [1번, 2번, 3번], 오렌지를 좋아하는 사람은 [3번]이다. 이때 수박이라는 상품을 기준으로 봤을 때 수박을 좋아한 사람이 1, 2, 3번 모두이고 이와 비슷한 상품으로는 1, 2번이 좋아하는 포도가 있다. 따라서 상품을 기준으로 유사도를 계산하면 수박과 포도가 가장 유사해 수박을 좋아하는 3번에게 포도를 추천해주게 된다.
또 다른 예시로 3명의 user와 6개의 item을 본다.
User A = <4.0, 1.0, 4.5, 5.0, 2.0, __>
User B = <__, 1.5, 5.0, 4.5, 2.0, 5.0>
User C = <1.0, __, 1.5, 1.0, 5.0, 1.0>
각각의 유저가 6개의 상품에 대해 평가한 평점이다. 이 평점을 나열한 값 자체를 벡터로 사용하고 __는 아직 평가하지 않은 상품을 나타낸다. A를 기준으로 보았을 때 B와 평점이 유사한 것을 알 수 있고, 따라서 A가 아직 평가하지 않은 6번째 아이템은 B의 평점 5.0을 통해 추론할 수 있다.
아직 평가하지 않은 아이템에 대한 평점을 추론하는 방법으로 아래의 3가지 식을 사용할 수 있다.
Model-based Collaborative Filtering
상품 기반 추천 시스템을 Model-based로 표현할 수 있다. 이 때 Matrix Factorization을 사용한다.
Matrix Factorization : 사용자의 잠재요인으로 이루어진 행렬, 상품의 잠재요인으로 이루어진 행렬 두가지로 분해해 각각을 학습 파라미터로 사용해서 Matrix Complerion 을 통해 평점을 추론.
왼쪽의 원본 Rating Matrix는 사용자가 직접 평점을 매긴 값을 가지고 있는 Matrix인데, 사용해보지 않은 상품이 당연히 존재하기 때문에 중간중간 비어있다. 이 Rating Matrix를 중간그림처럼 User, items 2개의 matrix로 나누고 이를 통해 학습한 후 Predicted Rating Matrix를 만들어낸다. 예측한 행렬에는 원본에 없던 값(사용하지 않은 상품에 대한 평점)이 채워져 있고, 이를 기반으로 loss를 계산해 원본 Rating Matrix에 값을 업데이트 한다.
학습 방법으로는 SGD(Stochastic Gradient Descent), ALS(Alternating Least Square)가 있다. SGD를 사용하면 user와 item matrix에 대해 동시에 학습하기 때문에 시간이 매우 오래걸리지만, ALS는 user, item matrix중 한 개의 matrix는 고정시켜놓고 하나에 대해서만 학습하기 때문에 SGD보다 학습 시간이 짧다.
여기서 위의 그림처럼 학습하는 게 왜 Collaborative인지 알아보자!
User matrix와 item matrix를 행렬 곱해서 Predict rating matrix를 만드는데 User[1, 0] x item[0, 1]을 곱하면 predict [1,1]자리를 계산한 값을 얻을 수 있다. 이 때 user1이 item1을 보지 않아서 평점이 없더라도 user2가 item1을 보고 매긴 평점이 predict[1, 1]을 계산하는 데 영향을 미친다. 이처럼 벡터가 학습하는 과정에서 나의 데이터만 영향을 미치는 것이 아니라 이웃의 데이터도 영향을 미치고 있기 때문에 Collaborative라고 한다.
Collaborative Filtering의 한계
New User Problem & Cold Start : 평가한 상품이 많지 않으면 이웃을 찾기 어려운 문제가 있다.
New Item Problem : 새로운 상품이 생기면 아무도 그 상품에 대한 평가를 하지 않았기 때문에 추천될 수 없다.
Data Sparsity : 전체 상품 수에 비해서 사용자가 구매하거나 클릭한 상품이 극히 적은 문제가 있다. 실제로 유명한 추천시스템 데이터 셋에서는 겨우 4%의 데이터를 가지고 96%를 예측해야 한다. 이러한 문제를 해결하는 연구도 많다고 한다.
여기까지 ~~ 가 제가 공부한 내용이고.. 이 외에도 더 많은 공부할 내용이 남아있겠지만 맛보기로 어제 처음 추천시스템과 만났습니다.. 앞으로도 파이팅 ㅋ