내가 보려고 만든 블로그

<Recommendation> Matrix Factorization 부터 Deepmf , DCN, wide&deep 까지 본문

Recommendation/모델링

<Recommendation> Matrix Factorization 부터 Deepmf , DCN, wide&deep 까지

정의김 2022. 9. 13. 20:33

이전 포스팅까지는 User X Item 간의 interaction 을 바탕으로 어떠한 latent matrix 혹은 latent vector를 얻는 방식으로 추천을 하는 방법에 대하여 주로 다루웠다. 하지만 추천을 함에 있어 interaction만을 고려한 방법 외 에 기존에 머신러닝모델에서 많이 사용하던 형태로

예를 들어 , ( 성별 , 국가 , 연령대 ) 등을 정보로 넣어 추천을 해줄 수 도 있을 것이다 .

모델을 4개나 다루기 때문에 하나의 포스팅에서 설명하기엔 조금 복잡하지만 각각의 모델이 다른 모델을 바탕으로 발전해 나간 모델이기 때문에 한번에 적는게 흐름상 좋을 것 같다고 생각하였다.

모델 구현 같은 경우에는 MF와 DeepMF을 다른 분 들이 구현한 것을 참고로 작성하였는데 다른 분들이 MF 형태의 모델을 구현할 때 공통적으로 조금은 특이하게 구현을 하는데 이 부분이 처음 접하는 사람들에게 어려울 수 있다. 이를 자세히 풀어놈.

 

MF ( Matrix Factorization)

위 그림과 같이 각 x (유저) 가 즉정 item(y) 에 대하여 rating 혹은 click 등을 했는지를 기존 머신러닝 모델에서 많이 보던 형태로 다양한 feature들을 활용해서 예측하는 방법이다. regresiion, classification 모두에 사용될 수 있으며 다음과 같은 수식을 통해 y를 예측한다.

수식을 2개로 분리해서 볼수가있는데 

첫째로 

w_0 + sigma (w_i * x_i )  부분은 선형회귀 형태로 각 feature에 대한 일차적인  관계를 넣어준다고 보면 된다. 

두번째로  오른쪽 텀. 

x_i * x_j 를 보면 알겟듯이 인터렉션을 반영해주는 부분인데 단순히 가중치 w_1 를 넣어주는 방식이 아니라 <v_i, v_j > 가 있는 것을 확인할 수 있는데 이는 유저에 대한 latent matrix를 가정하고 해당 유저의 latent vector들을 곱해주는 방식이다 .  ( 아래 그림) 

두 latent vector의 내적이 weight가 되는 방식. 

추가로 , 이 두번째 텀은 i=1 ~n 과 j=1 ~ n 까지 iter가 돌면서 n^2 의 시간복잡도가 걸릴거 같지만 이 수식을 전개하면 아래 와 같이 n 의 시간복잡도를 가지게 바꿀 수가 있다. 즉, 빠르다. 구현부분에도 아래와 같이 되있음.

Wide & Deep

다음으로 wide & deep. 구글 앱스토어에서  사용하던 방식이라는데 아마 옛날 이야기라 지금은 아닐듯???

위 그림과 같이 deep 이랑 wide로 이루어져 있어서 deep& wide이다. deep 부분은 우리가 아는 딥러닝이다. 여러피쳐들에

대해서 그대로 넣어주거나 임베딩을 해서 넣어주고 concat 해준 후 layer에 통과해주는 방식. 

wide부분이 특이한데 어떤 유저가 a,b에 대해서는 클릭 , a,c에 대해서는 노출( 즉 봤다는 뜻) 이 되었다면 

a,a, 에서는 1 

a,b에서는 0 

과 같이 가능한 쌍에 대하여 feature를 만듦. 이 부분이 wide 모델이 되서 최종적으로 wide와 deep 두개를 바탕으로 예측하게 됨.

 

DCN ( Deep & Cross Network )

dcn도 마찬가지로 deep 이랑 cross로 이루어져있어서 deep & cross 임..

deep은 마찬가지로 딥러닝이고 cross같은 경우에는 각 피쳐들에 대하여 concat을 진행한후 나온 벡터 x0 자신에 대하여 벡터의 각 차원별 값에 대하여 내적을 하여 인터렉션을 구해주고 자기 자신과 같은 크기의 벡터 x_1 을 만들어냄. 이러한 과정을 층을 쌓아 여러번 반복하여 cross 층을 만들어준다. 아래 그림과 같은 방식.

Deep FM

마지막으로 deepfm.

이것도 마찬가지로 deep 과 mf 를 섞어준 형태임. ( 다 비슷비슷하다. 그래서 같이 적음 )

조금 다른점이 있다면 기존 mf에서는 임베딩 없이 들어갔는데 deepmf는 임베딩을 해서 fm에 넣어줌. 

 

구현

MF 

mf 구현을 한 것을 검색해보면 다 같은 코드를 사용했는데 이 코드가 모델부분이 nested 되있어서 조금 헷갈릴 수가 있다. 큰 틀에서 설명하자면 

1. 먼저 모델을 객체화 해줄 때 initialize 부분에서 build_graph 부분을 수행함

2. 이 build_graph 부분은 features_linear , features_embedding , factorization_machine  3가지 모델을 정의함 . 

3. features_linear는 위에 fm의 수식에서 첫번째 부분 (선형식) , features_embedding은 latent_matrix를 만들어주는 부분, factorization_machine이 수식의 두번째 부분에서 O(N) 으로 시간복잡도를 줄였던 부분을 구현해주는 부분임. 

4. 모델에 main함수 격의 forward함수가 정의되있고 이 forward함수에서 features_linear 와 factorization_machine를 forward 해주는 형태임.

더 자세한 설명은  맨 아래 공부한 노트 참고하면서 보면 무조건 이해 감.

 

 

DEEP MF

deep mf는 앞서 말햇듯이 딥러닝 레이어를 추가로 넣어준 게 전부 mf구현이 가능하면 충분히 쉽다.

 

https://github.com/todtjs92/Search_and_Recommendation/tree/master/FM

 

GitHub - todtjs92/Search_and_Recommendation

Contribute to todtjs92/Search_and_Recommendation development by creating an account on GitHub.

github.com