https://hajinnote.tistory.com/25
추천시스템 - 협업 필터링(Collaborative Filtering) (1)
추천시스템이란? 정보필터링 기술의 일종으로 주어진 아이템에 대한 특정 유저의 점수나 선호도를 예측해 추천하는 것이다. 추천 시스템의 알고리즘은 크게 협업 필터링과 내용 기반 필터링으
hajinnote.tistory.com
지난 시간에 이어서 협업 필터링의 Model-based Approach를 살펴보자.
Model-based Approach
Memory 기반은 데이터셋에서 데이터끼리의 유사도를 측정해서 예측을 했다면, 모델 기반은 기계학습(머신러닝) 알고리즘으로 예측하는 방법이다. 잠재요인 기반, 분류/회귀 기반, 딥러닝 기반 등 모형을 사용하는 것은 전부 모델 기반에 속한다. 그 중에서 오늘은 행렬분해(Matrix Factorization)에 관해 알아보자.
잠재 요인 협업 필터링
Rating Matrix에서 빈 공간을 채우기 위해서 사용자와 상품을 잘 표현하는 차원(Latent Factor)를 찾는 방법이다. 사용자-아이템 행렬을 내적해서 평점 매트릭스를 계산하는 방식을 사용한다. 사용자와 아이템의 내적이 기존의 평점 매트릭스와 유사해지도록 만드는 잠재요인 값을 찾아야 하는 것이다. 행렬분해를 통해 이런 잠재요인을 얻어 낼 수 있다. 행렬분해 중 특이값 분해(SVD)에 관해 자세히 알아보자.
SVD (Single Value Decomposition)
SVD는 임의의 행렬 A에 대하여 다음과 같이 행렬을 분해 할 수 있다는 행렬분해 방법 중 하나로 수식은 다음과 같다.
$$ A=U \Sigma V^T $$
m x n 크기의 A 행렬은 m x m 크기의 행렬 U와 m x n 크기의 ∑, n x n 크기의 Vt(transpose)로 나뉜다.
행렬 U와 V에 속한 벡터를 특이 벡터(Singular vector)라고 부르며 모든 특이 벡터는 서로 직교하는 성질을 가진다. ∑는 직사각 대각행렬로 0이 아닌 대각 원소 값을 특이값이라고 한다.
AAt 와 AtA를 고유값 분해하면 다음과 같이 분해 할 수 있다.
$$ \begin{align}
AA^t = U \Sigma V^t(U \Sigma V^t)^t \\
= U \Sigma V^t V \Sigma^t U^t \\
= U \Sigma \Sigma^t U^t \\ \\
A^tA = V \Sigma \Sigma^t V^t
\end{align} $$
U는 AAt의 고유벡터 V는 AtA의 고유벡터로 구성된 행렬이고 (∑ ∑t) 대각 원소 값은 AAt의 고유값이다. A의 특이값은 AAt or AtA의 고유값에 루트를 씌운 값과 같다. (A를 제곱한 형태 여서)
$$ VA = U \Sigma $$
행렬 V에 선형변환 A를 해준 후에도 서로 직교하는 벡터로 구성된 행렬 U가 만들어지는데 그 크기의 차이가 ∑만큼있다는 것으로 풀어서 설명 할 수 있다.
SVD는 고차원 행렬을 저차원 행렬로 분해하는 행렬분해 기법으로 원본행렬에서 잠재된 요소를 추출하기 위해 사용한다. 이처럼 차원을 줄여준다는 장점이 있지만 행렬에 빈 값이 있으면 안되는 단점이 있다. 그래서 SGD(경사하강법)을 이용해 SVD를 수행한다.
- 확률적 경사하강법의 단계
- U와 I를 임의의 값을 가진 행렬로 설정
- U와 I.T 값을 곱해 예측 R 행렬을 계산하고 예측 R 행렬과 실제 R 행렬에 해당하는 오류 값을 계산
- 이 오류 값을 최소화할 수 있도록 U와 I 행렬을 적절한 값으로 각각 업데이트
- 만족할 만한 오류 값을 가질 때까지 2,3번 작업 반복하여 U와 I 값 업데이트해 근사화
기존에 알던 경사하강법이랑 동일하다. 오류 값이 적어지도록 행렬을 업데이트 하면서 최적화 시키는 방법이다. 당연히 오류는 작을 수록 좋으며 측정에 MSE나 RMSE가 많이 사용된다.
SVD를 통한 협업 필터링
그렇다면 이 SVD를 협업 필터링에 어떻게 활용하는지 과정을 알아보자.
먼저 아이템 n에 대한 사용자 m명의 평점을 가진 행렬 m x n 으로 행렬 R을 만든다. 행렬 R을 특이값 분해하여 사용자 행렬 U와 아이템 행렬 I로 분해한다.
user3이 item2 값을 어떻게 평가할지 예측하고 싶다면 분해한 행렬을 이용해 계산하면 된다. 하단의 식을 보면 2.98이라는 값이 나온다.
$$ 1.5 \times 0.3 + 2.3 \times 0.1 = 2.98 $$
이렇게 분해한 행렬 두개를 내적하면 예측 평점 행렬 R을 얻을 수 있다.
지난 시간에 알아본 것 처럼 cold start 문제(신규 유저나 신규 아이템은 어떤 정보도 없기 때문에 추천을 하기 힘듦), 계산량 문제 등 한계점이 있다. 이를 극복하기 위해 데이터가 쌓이기 전 초기에는 콘텐츠 기반 필터링으로 콜드스타트 문제를 해결하고 데이터가 쌓이면 협업 필터링을 사용하는 Hybrid 방식과, 머신러닝으로 유저의 조회, 클릭, 머문 시간등을 행동을 학습해서 추천 후보군을 제안하는 방법이 제안된다.
'머신러닝' 카테고리의 다른 글
추천시스템 - 협업 필터링(Collaborative Filtering) (1) (0) | 2022.06.17 |
---|---|
K means 클러스터링 (0) | 2022.06.15 |
차원축소와 PCA(주성분 분석) (0) | 2022.06.15 |
정규화와 표준화 (0) | 2022.06.15 |
부스팅 모델 (1) | 2022.06.15 |