SGD vs ALS in MF

Chalsu Chalsu·2021년 12월 25일
0

Recommender System

목록 보기
4/4

Matrix Factorization

User-Item Matrix를 User Latent Vector와 Item Latent Vector로 분해한 뒤 내적을 통해 결측치를 메꾸는 방법을 Matrix Factorization이라고 합니다.

이 때 User-Item Matrix를 복원하는 과정에는 여러 가지 방법이 있는데 크게 SGD와 ALS 방법론이 존재합니다.

SGD(Stochastic Gradient Descent)

Loss를 줄여나가는 방식으로 사용되는 방식으로 머신러닝, 딥러닝에서 사용되는 대표적인 방법론입니다.

L(U,V)=u,i(Ru,ivuviT)2\mathcal{L}(U,V) = \sum_{u,i}(R_{u,i} - v_uv_i^T)^2

최적화를 위해 다음과 같은 미분 가능한 함수에서 최솟값을 찾습니다.

ALS(Alternating Least Squares)

SGD 방법에서 시간이 오래 걸리는 단점을 극복하기 위해 도입된 방법입니다.

L(U,V)\mathcal{L}(U,V)를 줄이기 위해 기울기를 구하면 다음과 같습니다.

vuL(U,V)=2(Ru,ivuviT)(vi){\partial \over \partial v_u}\mathcal{L}(U,V) = 2\sum(R_{u,i} - v_uv_i^T)(-v_i)

항상 최솟값을 갖는 2차 함수이기 때문에 미분값이 0이 되는 지점에서의 U,VU,V가 최적의 값입니다. 여기서 ALS는 변수 하나를 고정시켜 빠르게 해를 구할 수 있다는 아이디어에서 출발했습니다.

VV를 고정시킨 뒤 편미분을 통해 vuL(U,V)=0{\partial \over \partial v_u}\mathcal{L}(U,V) = 0을 만족하는 vuv_u를 찾으면 됩니다.

2(Ru,ivuviT)(vi)2\sum({R_{u,i}} - v_uv_i^T)(-v_i)

vu(viTvi=Ru,ivi)v_u(\sum v_i^Tv_i = \sum R_{u,i}v_i)

vu=(Ru,ivi)(viTvi)1v_u = (\sum R_{u,i}v_i)(\sum v_i^Tv_i)^{-1}

(viTvi)vu=(Ru,ivi)(\sum v_i^Tv_i)v_u = (\sum R_{u,i} v_i)

Ax=bAx = b 꼴의 Linear Equation Problem

또한 vu1v_{u1}vu2v_{u2}를 업데이트할 때 서로 겹치지 않으므로 병렬 처리 또한 쉽다는 사실을 알 수 있습니다.

마찬가지로 viv_i 또한 vuv_u와 같은 방식으로 구할 수 있습니다.

2(vuT)(Ru,ivuviT)2(-v_u^T)\sum({R_{u,i}} - v_uv_i^T)

(vuTvu=vuTRu,i)viT(\sum v_u^Tv_u = \sum v_u^TR_{u,i})v_i^T

viT=(vuTRu,i)(vuTvu)1v_i^T = (\sum v_u^T R_{u,i})(\sum v_u^Tv_u)^{-1}

vi=(vuTvu)1(vuRu,i)v_i = (\sum v_u^Tv_u)^{-1}(\sum v_uR_{u,i})

(vuTvu)vi=(vuRu,i)(\sum v_u^Tv_u)v_i = (\sum v_uR_{u,i} )

Spark MLlib에 Matrix Factorization 라이브러리가 존재하는데 이 때 ALS 방식을 활용하고 있습니다.

profile
https://github.com/MrLee5693

0개의 댓글