오답노트

[RS] 협업 필터링 (Collaborative Filtering) 본문

Python/ML

[RS] 협업 필터링 (Collaborative Filtering)

권멋져 2023. 3. 3. 01:13

Collaborative Filtering

협업 필터링은 사용자와 항목의 유사성을 동시에 고려해 추천한다.

기존에 사용자의 관심사가 아닌 항목도 추천 가능하고 자동으로 임베딩 학습이 가능해 도메인 지식이 필요없다.

하지만 학습 과정에 나오지 않은 항목은 임베딩을 만들 수 없다. 또 추가 특성을 사용하기 어렵다.

 

KNN

머신러닝에서 봤던 KNN과 같은 원리다.

가장 근접한 K 명의 이웃을 통해서 예측하는 방법.

https://dhjkl123.tistory.com/226

 

[ML] KNN (K-Nearest Neighbors)

KNN 예측 데이터의 변수로 부터 실측 데이터의 변수 사이의 거리를 계산하여 그 중 가장 가까운 k개 데이터의 평균으로 타겟 데이터를 예측하는 알고리즘 (출처 : https://pub.towardsai.net/k-nearest-neighbo

dhjkl123.tistory.com

  • User - based collaborative filtering : 사용자의 패턴과 유사한 사용자를 찾아 추천 리스트 생성
  • Item - based collaborative filtering : 특정 사용자가 준 점수간의 유사한 상품을 찾아서 추천 리스트 생성

장점

  • 특정 Item을 추천하는 이유를 정당화하기 쉽고 Item 기반 방법의 해석 가능성이 두드러짐
  • 추천 리스트에 새로운 item과 user가 추가되어도 상대적으로 안정적

단점

  • User 기반 방법의 시간, 속도, 메모리가 많이 필요
  • 희소성 때문에 제한된 범위가 있음 (ex. 사용자의 이웃중에서 아무도 A에 관심이 없으면 사용자에게 A에 대한 예측을 제공할 수 없음)

Latent Factor Collaborative Filtering (잠재 요인 협업 필터링)

잠재 요인 협업 필터링은 Rating Matrix에서 빈 공간을 채우기위해서 사용자와 상품을 잘 표현하는 차원(Latent Factor)을 찾는 방법이다. 행렬 분해(Matrix Factorization)은 추천 시스템에서 사용되는 협업 필터링 알고리즘의 종류다. 이 알고리즘은 사용자-아이템 상호 작용 행렬을 두개의 저 차원 행렬의 곱으로 분해하여 작동한다.

SVD

SVD는 특이값 분해로 정방행렬이 아닌 N x M 으로 이뤄진 대각행렬에 대한 행렬 분해를 의미한다.

SVD로 행렬 분해하면 다음과 같다.

  • U : N x N의 고유벡터
  • Σ : 원본 대각행렬의 특이값들을 대각항으로 가지는 대각행렬 (M x N)
  • V :  M x M의 고유벡터

 

SGD (Stochastic Gradient Descent)

SVD에서 결측치로인해 적용이 어려웠던 점을 Gradient Descent를 통해 해결하는 방법

  1. User Latent와 Item Latent를 임의로 초기화하고 dot product를 통해 Matrix 생성
  2. 1에서 생성한 Matrix를 원본 Maxtrix와 비교하면서 Gradient Descent 진행
  3. 모든 평점에 대해 반복 (?를 제외한 모든 평점에 대해서 진행)

ALS (Alternating Least Squares)

 

기존 SGD는 두개의 행렬 (User Latent, Item Latent)을 동시에 최적화 했다면, ALS는 두 행렬중 하나를 고정 시키고 다른 하나의 행렬을 순차적으로 반복하면서 최적화 하는 방법이다. 기존의 최적화 문제가 convex 형태로 바뀌기 때문에 수렴된 행렬을 찾을 수 있는 장점이 있다.

 

  1. User Latent와 Item Latent를 임의로 초기화하고 dot product를 통해 Matrix 생성
  2. 아이템 행렬을 고정하고 사용자 행렬 최적화
  3. 사용자 행렬을 고정하고 아이템 행렬 최적화
  4. 2~3 과정을 반복